面向对象 进阶
this关键字
就是用来指向对象属性的,来区分属性名和形参名相同的情况
this可以调用的结构:成员变量,方法,构造器
this调用构造器的情况:多个构造器,其中有大量重复的部分,可以用this指定调用一个构造器,减少冗余。
格式:this(形参列表); 这个调用必须放到当前构造器的首行
继承性
不同类中大量重复的部分(属性,方法)可以通过将重复部分抽取到单独一个类,然后用继承的方法来减少重复代码
两种类型:
自上而下:有了类A后,在定义另一个类B时,发现类B和类A类似,考虑类B继承于类A
自下而上:定义了类B,C,D后发现其中有类似属性和方法,就可以将其中重复部分进行抽取,封装到类A种,让类B,C,D继承于类A
好处:
1.减少冗余,增加复用性
2.有利于功能的拓展
语法
class A extends B A类继承B类
有了继承性后:
1.子类及获取到了父类种声明的所有属性和方法
2.但是,由于封装性的影响,可能子类不能直接调用父类中的属性和方法(被private修饰的)
默认的父类:没有显式的声明继承类时,则默认继承于java.lang.Object
多层继承:直接继承父类,间接继承父类的父类
单继承性:只能有一个父类
重写(override)
父类中的方法不太适用于子类,子类对父类中的方法进行覆写的行为叫重写
规则:
父类被重写的方法与子类重写的方法的方法名和形参列表必须相同
子类重写的方法的修饰权限不小于父类被重写方法的修饰权限。子类不能重写父类种声明为private的方法
关于返回值类型:
父类被重写的方法的返回值类型是void,则子类重写的方法的返回值类型必须是void。
若被重写方法的返回值类型是基本数据类型,则子类重写的方法的返回值类型必须与被重写的方法的返回值类型相同。
若被重写的方法的返回值类型是引用数据类型,则子类重写的方法的返回值类型可以与被重写方法的返回值类型相同或是被重写的方法的返回值类型的子类
子类重写的方法抛出的异常类型可以与父类被重写方法抛出的异常类型相同,或是父类被重写的方法抛出的异常类型的子类
super关键字
super可以调用的结构:属性,方法,构造器
用于调用父类中与子类同名的属性或方法
使用"super."结构
super调用父类构造器
1.子类继承父类时,不会继承构造器。只能通过“super(形参列表)”的方式调用父类指定的构造器
2.super(形参列表)必须声明在构造器首行
3.构造器首行要么使用this(形参列表)要么super(形参列表)只能2选1不能同时用
4.如果子类构造器的首行即没有显示调用this也没有显示调用super则子类此构造器默认调用super,即调用父类中的空参的构造器。
我们在通过子类的构造器创建对象时,一定在调用子类构造器的过程中,直接或间接的调用到父类的构造器。也正因为调用过父类的构造器,我们才会将父类中声明的属性或方法加载到内存中,供子类对象使用。
面试题:P97最后一题多看看
多态性
特性
多态性体现:父类的应用指向子类的对象。声明是父类new的是子类
多态性的应用:虚拟方法调用
在多态的场景下,调用方法时。
编译时,认为方法是左边声明的父类的类型的方法(即被重写的方法)也就是说子类特有属性和方法会被屏蔽
执行时,实际调用的是子类重写的方法
多态性的使用前提:要有类的继承,要有方法的重写
多态的实用性:只适用于方法,不适用于属性
多态的好处:减少代码冗余,提高拓展性即使增加了新的子类方法也无需改变
多态的坏处:在多态场景下,创建了子类的对象,也加载了子类特有的方法和属性,但是由于声明为父类的引用,导致没有办法直接调用子类特有的方法和属性
向下转型
Animal animal = new Dog(); //指明父类创建子类 多态性
//向下转型 以调用dog类中特有属性
Dog dog = (Dog)animal;
System.out.println(dog.a);
再向下转型前,使用instanceof进行判断,避免出现类型转换异常
/*
* 在向下转型之前,使用instanceof进行判断,避免出现类型转换异常
* a instanceof A:判断对象a是否是类A的实列
* */
Animal animal1 = new Cat();
if(animal1 instanceof Cat){
Cat cat = (Cat) animal1;
}
Object类
是类层次结构的根类,即所有其他类的父类。
任何一个Java类都直接或间接的继承于Object类
clone()方法 复制里面的东西,地址不同
finalize()方法 当被GC要回收此对象时调用此方法,重写此方法可在释放对象前进行某些操作
重点方法:equals()
自定义的类在没有重写object中equals()方法的情况下,调用的就是object类中声明的equals(),就是比较两个对象的地址
toString()方法:没有重写前返回所属类和地址值
equals():方法
范围:引用数据类型
使用:重写equals和没重写的区别
面试题:
多态是编译时行为还是运行时行为:运行时行为,编译时还确定不了对象只有运行时才能确定真正对象
高频:区分 == 和 equals()
==:运算符
范围:基本数据类型,引用数据类型
使用:基本数据类型:判断值是否相同 引用数据类型:判断引用变量地址值是否相同
构造器可否被override:
不能,但是能重载
为什么要有重载,我随便命名一个别的函数名不行吗?谈谈你的理解
见名知意