继承:
继承格式:
Class 类a extends 类b
{
}
注意:
通过继承,子类可以访问父类中非私有的变量和方法,
而private修饰的只能在本类内部被访问。
继承的好处:
1、提高代码的复用性
2、让类与类之间产生了一个关系,是多态的前提
继承的特点
1、java只支持单继承,不支持多继承
原因:多继承会导致出现调用不明确(试想,如果两个父类中有名称相同的方法,子类该如何调用)
2、java支持多层继承。 即,a继承b,b继承c
什么时候考虑定义继承呢?
由于继承体现了一种关系:is a的关系 (学生是一个人)。所以,在定义多个类的时候,就可以由此考虑定义为继承。
注意:不要为了获取部分功能而去使用继承
子类和父类之间的成员关系:【重点】
成员变量的关系:
通过子类访问一个变量的时候:(针对变量名相同时的情况)
1、首先在局部范围查找,如果有就使用
2、然后在本类的成员变量位置查找,如果有就使用
3、最后在父类中找,如果有就使用
4、如果还是找不到,就只能报错了
当多个位置的变量名不同时,很容易寻找了。
当多个变量名相同时,要在子类中输出不同位置变量的值的方式:
局部范围的值, 直接输出
输出成员变量的值, this.变量名
输出父类中成员变量的值 super.变量名
子类和父类的成员方法的关系:
方法的重写【重点】:
子类中方法出现与父类方法返回值类型、方法名、参数列表完全相同,会出现覆盖操作,叫方法重写。所以方法重写的前提是继承。
方法重写的注意事项:
1、父类中的被private修饰的私有方法不能给被重写(很好理解,子类根本看不到父类中的私有方法)
2、子类方法的访问权限一定要大于等于父类方法。
3、静态方法只能被静态方法重写(不然类似于私有,不能被子类访问。)
4、在子类覆盖方法中,继续使用父类被覆盖的方法可以通过super.函数名()
方法重写的应用:
当子类需要父类的功能,而功能主体子类有自己的内容时,这样即沿袭了父类的功能,又定义了子类特有的功能。
面试题:
方法重写和方法重载的区别?
方法重写:子类父类中,如果方法的返回值类型、方法名、参数列表完全相同,那就是方法的重写。
方法重载:方法重载一般是指在一个类中的两个方法,方法名相同、参数列表不同、与返回值无关。
疑问,子类和父类的方法能够重载吗?
应该理解为子类通过继承获取了父类的方法,那么在子类中定义的方法如果和父类的方法符合方法名相同、参数列表不同,那就可以看作是重载;如果在子类中定义的方法和父类的方法方法名、参数列表完全相同,返回值类型不同,那即不是重载也不是重写,只能报错了。
子类和父类构造方法的关系:
子类中所有构造方法都会默认去访问父类的无参构造方法:
在子类中,构造方法中都有一行默认的语句:super()
(牢记:子类构造无论带不带参数,都默认访问父类的无参构造)
为什么要这样?:
因为子类要使用父类的成员变量,所以父类成员变量的初始化动作要再子类初始化之前完成,所以要去调用父类的构造方法。
(注意:只是调用父类的构造方法,没有为父类创建对象。)
如果父类中没有无参构造,肿么办?:
如果没父类没有无参构造,而子类默认的构造还会super()去找父类无参构造,找不到就报错了,所以此时应该:
1、可以通过super(参数),去访问父类中的带参构造方法。
2、可以通过this(参数),访问本类中的其他构造,但是子类的其他构造方法最终还是要访问父类中存在的构造方法的。
super和this的区别:(只是在子父类中的应用,没有在测试类主函数中用的)
this代表本类对象的引用,是一个对象,本类的对象
super代表父类内存空间的标示(可以理解为父类的对象引用,但不是对象)
super和this的使用:
成员变量:
this.变量 ----当前类的成员变量
super.变量----父类的成员变量
构造方法:(用在构造方法中,一般不怎么用)
this(参数) --- 本类的其他构造方法
super(参数)---- 父类的构造方法,
成员方法:
this.方法名()----调用本类的方法
super.方法名() ----调用父类的方法
面试题:
执行的顺序是:静态代码块 —— 构造代码块 —— 构造方法
注意:1、创建子类对象的时候,先执行父类的上述三个内容
2、无论创建多少对象,静态代码块只执行一次
原理:
1、创建子类对象的时候(执行子类构造方法)会先执行父类的构造方法的。而执行构造代码块是在执行构造方法之前。
因为子类要使用父类的成员变量,父类成员变量的初始化必须在子类初始化之前完成。所以,子类的初始化过程中,会先执行父类的初始化
2、静态代码块是在加载类的就是一起被加载执行了的
即,在创建子类对象之前,是先加载父类和子类两个类文件的,加载之后即执行其静态代码块。
故,无论创建几个对象,静态代码块只执行一次。
子类使用父类的私有成员的方式:
1、调用父类的set/get方法使用
2、在子类带参构造中调用父类的带参构造赋值,用super()方法
final关键字:可以用于修饰类、成员方法、成员变量
final修饰的类,不能被继承
final修饰的成员方法,不能被子类重写的
final修饰的成员变量,其实是一个常量。
常量: 字面值常量
定义常量:和定义变量的格式一样,不过加了final