做一个中英文网站多少钱,厦门建网站的公司,怎么用2级目录做网站,光明网站建设前言
1. 学习视频#xff1a;
尚硅谷Java零基础全套视频教程(宋红康2023版#xff0c;java入门自学必备)_哔哩哔哩_bilibili
2023最新Java学习路线 - 哔哩哔哩
第二阶段#xff1a;Java面向对象编程
6.面向对象编程#xff08;基础#xff09;
7.面向对象编程… 前言
1. 学习视频
尚硅谷Java零基础全套视频教程(宋红康2023版java入门自学必备)_哔哩哔哩_bilibili
2023最新Java学习路线 - 哔哩哔哩
第二阶段Java面向对象编程
6.面向对象编程基础
7.面向对象编程进阶
8.面向对象编程高级
正文
7. 面向对象编程进阶
7.1 this关键字
7.1.1 this调用属性、方法 和 在构造器内使用 7.1.2 this 关键字 调用 构造器
如下只创建了一个对象使用this调用其他构造器。但是不能在一个类的两个构造方法中使用this互相调用不然就形成了一个闭环的循环调用。 注意只能在构造方法中使用this调用其他构造方法不能在成员方法中使用。
7.2 面向对象特征之二继承性Inheritance
7.2.1 Java中的继承 1. 继承性的好处 2. 继承性Inheritance概念 在Java中类的继承是指在一个现有类的基础上去构建一个新类新类被称为子类现有类被称为父类子类会自动拥有父类所有可继承的属性和方法。在程序中声明一个类继承另一个类需要使用extends关键字。注意对比接口接口是支持多继承的。 ①Java中类只支持单继承不允许多重继承。一个类只能有一个直接父类。 爸爸类属于子类的直接父类爷爷类属于孙子子类的间接父类 ②多个类可以继承一个父类。 ③多层继承是可以的。即一个类的父类可以再去继承另外的父类。 ④但是由于封装性的问题例如父类中的属性和方法使用private关键字子类不能直接访问父类中的属性和方法但是子类是拥有这些属性和方法的。。假如父类中的a属性使用了private关键字且a属性提供了public修饰的get和set方法那么子类就可以通过get和set方法得到a属性的赋值和获取权限。但是不能使用子类实例.a属性的方式。 ⑤子类继承父类以后还可以扩展自己特有的功能体现增加特有属性、方法。 3. 默认父类Object类 java.lang.Object JDK中提供了一个Object类它是所有类的父类即每个类都直接或间接继承自该类。
例如我们自定义一个类它默认就有Object类的方法toString等。 7.2.2 继承性的权限问题、子类 重写 父类方法的权限问题
1. 继承性的权限问题详解
上面我们已经知道 2. 子类 重写 父类方法 在继承关系中子类会自动继承父类中定义的方法但是有时在子类中需要对继承的方法进行一些修改即对父类的方法进行重写。注意
①子类重写的方法要和父类被重写的方法具有相同的方法名、参数列表、返回值类型。
没有返回值父、子就都写void。返回值类型也可以是子类父方法返回值类型用Person子重写时可以用Person的子类Student。 ②子类重写父类方法时不能使用比父类中被重写的方法更严格的访问权限。例如父用缺省子不能用private子可以用缺省、protected、public。
③子类中不能重写父类中private权限修饰的方法。 ④在子类中重写时加上“Override 重写注解”可以校验重写格式正误。 区分方法的 重载与重写 重载overload一个类中定义多个同名方法但参数类型或个数不同。
重写override两个类有继承关系子类覆盖父类中同名、同参数、同返回值类型的方法。 没有相关性只是名字长得像。有相关性名字不像。
7.3 继承性super关键字的使用
当子类重写父类方法后子类对象将无法访问子类.父类成员变量父类被重写的方法为了解决这个问题在Java中专门提供了一个super关键字用于访问父类的成员。例如访问父类的成员变量、成员方法、构造方法。 7.3.1 super调用属性、方法 super.成员变量 super.成员方法([参数1参数2...]) eat()方法在子类中重写过之后用this和省略this调用的都是子类重写后的方法。只有使用super.eat()调用的才是父类的eat()方法。
注意①成员变量的值遵循就近原则查找。即父类name柳仙仙子类定义name仙子仙。子类最终name仙子仙。先就近在子类找找到name仙子柳不会再去找父类。子类找不到子类没定义name成员变量说明name是继承自父类的才会找父类。如果写super.name则代表父类name直接查找父类name。
7.3.2 super调用父类的构造器 super([参数1参数2...]) 注意 ①子类继承父类时不会继承父类的构造器。只能通过super(形参列表)调用父类构造器。 ②super调用父类构造方法的代码必须位于子类构造方法的第一行且只能出现一次。 ③在子类的构造方法中一定会调用父类的构造方法可以通过super指定调用父类的哪个构造方法。如果没有指定类默认都有一个无参的构造方法在子类实例化时会默认调用父类无参的构造方法super()。如下 public Dog(){ //子类默认无参的构造器 super(); //父类默认无参的构造器 } //父类也有无参的构造方法时public Dog(){ }中可以不写super(); 会默认调用。 但是如果父类中只写了一个有参的构造方法编译器不会再默认添加一个无参的构造方法子类只写public Dog(){ }这时编译器认为不调用父类的任何构造器会报错。所以必须写为 public Dog(){ //子类默认无参的构造器 super(参数); //调用父类有参的构造器 } 可见在定义一个类时如果没有特殊要求尽量在类中定义一个无参的构造方法避免在继承时出现错误。 7.4 继承性子类对象实例化的全过程 7.5 面向对象特征之三多态性方法属性不存在多态性
7.5.1 多态性
在设计一个方法时通常希望该方法具备一定的通用性。例如实现动物叫希望方法在传入不同动物类型名时实现不同动物的叫声。在同一个方法中这种由于参数类型不同而导致执行效果各异的现象就是多态。方法的多态性方法的重写——同名不同参数类型或不同参数个数
在Java中为了实现多态允许使用一个父类类型的变量来引用一个子类类型的对象根据被引用子类对象特征的不同得到不同的运行结果。
子类对象的多态性父类的引用指向子类的对象。或 子类的对象 赋给 父类的引用
比如Person p2 new Man();
注意成员变量并不满足多态性。p2是Personp2的属性也是Person的类型和值。而不是子类。
7.5.2 多态性的应用案例
①多态性的应用虚拟方法调用。 也可称动态绑定编译时和运行时调用的不是一种方法。 在多态场景下调用方法 编译时认为方法是左边声明的父类类型的方法即被重写的方法。 执行时实际执行的是子类重写父类的方法。 简称为编译看左边父类运行看右边子类。 ②多态性的使用前提①要有类的继承关系②要有方法的重写。
③多态的适用性适用于成员方法不适用于成员变量属性。
④多态的好处和弊端 弊端①在多态的场景下我们创建了子类的对象也加载了子类特有的属性和方法但是由于声明为父类的引用导致我们不能直接调用子类特有的这些属性和方法。只能执行子类重写父类的方法。
好处①极大的减少了代码的冗余不需要定义多个重载的方法。 我们只需要传参的时候传入参数信用卡cust就知道去信用卡取钱。而不必写两个用户取钱的getAccount()方法去区分信用卡和储蓄卡取钱。
理解
①解决了方法同名问题使程序更加灵活从而有效地提高程序的可扩展性和可维护性。
②高内聚同一方法实现不同功能低耦合大量不同子类具体执行不同行为特征。
7.5.3 多态性的逆过程向下转型使用关键字instanceof
基于这个弊端①在多态的场景下我们创建了子类的对象也加载了子类特有的属性和方法但是由于声明为父类的引用导致我们不能直接调用子类特有的这些属性和方法。只能执行子类重写的父类的方法。
在这个过程中子类对象赋值给父类变量的时候在编译期间做了一次类型转换。因此想要调用子类特有的方法必须再做一次类型转换使得编译通过。p2、m1指向堆空间中的同一个对象实体地址值相同。所以 m1p2; 是true。
Person p2 new Man(); //一次类型转换
Man m1 Manp2 //强制类型转换
向下转型可能出现问题类型转换异常ClassCastException 假如Person p3 new Woman(); //一次类型转换 显然我们不能把p3进行强制类型转换成man。他们都是子类不能互相转换。 可以加一个判断使用关键字instanceof判断一个对象是否是某个类或接口的实例或者子类实例。格式 对象(或者对象引用变量) instanceof 类(或接口) ifp2 instanceof Man{ //是Man类的实例 Man m1 Manp2 //强制类型转换
}else{ System.out.println(p2 不是一个Man);
}
7.5.4 练习题 7.6 Object类
7.6.1 Object类介绍与常用方法使用 JDK中提供了一个Object类它是所有类的父类即每个类都直接或间接继承自该类。
例如我们自定义一个类它默认就有Object类的方法toString等。 Object类型的变量 与 除Object以外的 任意引用数据类型的对象 都存在多态引用。Object类中没有声明属性只提供了一个空参的构造器。
7.6.2 Object中clone()的使用 所以目前创建对象有两种方式new和clone()。以后还会见到其他方式。
7.6.3 Object中finalize()的使用(从JDK9开始就过时了) 例如关闭浏览器时临关闭前保存一下你的用户信息在你再次登录时就会自动填写上次的用户信息。
之所以过时是因为可能导致一些问题finalize()方法可能导致程序内部出现循环引用导致此对象不能被回收。
7.6. Object中equals()的使用重写使用IDEA可以自动生成 任何引用数据类型都可以使用。
①Object中equals()的定义 ②子类使用说明重写比较实体内容没重写比较引用地址 自定义的类在没有重写Object中equals()方法的情况下调用的就是Object类中声明的equals()方法即比较两个对象的引用地址是否相同。或 比较两个对象是否指向了堆空间中的同一个对象实体
重写了equals()方法对于像String、File、Date和包装类等他们都重写了Object类的equals()方法用于比较两个对象的实体内容是否相同。 ③平常比较我们为了比较实体内容要重写equals()方法。不重写直接用就可以了。
例如为了比较两个对象的信息
public boolean equals( Object obj){if(this obj){//1.先判断地址值return true;}if(obj instanceof User){//2.判断是否是同类或子类User user (User)obj; //Object类先强转成User//3.比较具体内容//方式一 name要比较每一个字符if(this.name.equals(user.name) this.age user.age){return true;}else{return false;}//方式二// return (this.name.equals(user.name) this.age user.age);}else{return false;}
}
多态性引用形式是Object得强转成子类User的类型才能调用子类的方法和属性 否则调用的是父类Object的方法。
④我们还可以让IDEA自动实现 altinsert出现选择生成equals()方法 ⑤在开发中的使用 注意相同字符串使用的地址值也是相同的 应用
因为Customer是类要在Customer类中重写equals()方法比较。结果是false。是因为Customer类的属性中Account也是一个类也要重写equals()方法。这样结果才是true。 7.6. Object中toString()的使用重写具体内容不重写地址值 类名地址值。和直接打印u1是去Object中调toString()效果一样。 同样可重写可自动生成
复习 Java的单继承是因为子类对象实例化的时候没办法区分从多个父类继承的同名方法或构造器属性也不好区分。所以单继承只有一个父类。