1.继承的概念
让类与类之间产生父子关系
2.继承的好处与弊端
好处:
(1)提高代码复用性
(2)提高代码维护性
(3)类与类产生关系是多态的前提
弊端:
增强了类的耦合性
3.开发的原则
高内聚,低耦合
内聚:自己及完成某件事的能力
耦合:类与类之间的关系
4.Java类继承的特点
Java只支持单继承不支持多继承,但支持多层继承
5.继承的注意事项
(1)子类只能继承父类所有非私有的成员
(2)子类不能继承父类的构造方法但能通过super关键字去访问
(3)继承关系必须是A是B的一种或者B是A的一种
6.继承中成员变量之间的关系
(1)不同名的变量
(2)同名的变量(就近原则,子类有的变量不用父类)
7.this 与super的区别
this:当前对象的引用
super:当前对象父类的引用
(1)调用成员变量:
this.成员变量:调用本类成员变量(当本类没有时,也可以调用父类成员方法)
super.成员变量:调用父类的成员变量
(2)调用构造方法
- 子类中所有构造方法都会默认访问父类中空参的构造方法(因为子类会继承父类中的数据,可能使用父类中的数据,所以在子类进行数据初始化之前,一定先完成父类数据的初始化)
- 在子类的构造方法前系统会默认加上super() [父类的空参构造的方法]
- object是最顶层类
- 当父类没有空参构造时:
(1)可以在子类的无参构造方法中添加本类或者父类的有参构造方法
(2)可以在子类有参的构造方法中添加父类的有参构造方法
例:
使用this 关键字时要注意在程序执行时先调用子类自己的有参构造,通过子类的有参构造访问父类的有参构造再依次执行剩余语句
class Father {
private String name;
private int age;
public Father(String name,int age) {
this.age = age;
this.name = name;
}
}
class Son extends Father {
public Son() {
//super("李四",24);
this("李四",24);
}
public Son(String name, int age) {
super(name, age);
}
}
- this与super语句必须是构造语句的第一句(且两者只能存在一个)
8.经典例题:
在有静态代码块的情况下,静态代码块随着类加载,最先输出
有父类的情况下,在加载时会先将父类加载进内存,在加载子类
class C {
public C() {
System.out.println("C构造方法");
}
static {
System.out.println("你好啊!");
}
}
class HelloA {
//构造方法
public HelloA(){
System.out.println("Hello A!父类构造方法");
}
//非静态代码块
{
System.out.println("i am A class.父类非静态代码块");
}
//静态代码块
static {
System.out.println("static A 父类静态代码块");
}
}
class Main extends HelloA {
//构造方法
public Main() {
System.out.println("Hello B!子类构造方法");
}
//非静态代码块
{
System.out.println("i am B class.子类非静态代码块");
}
//静态代码块
static {
System.out.println("static B 子类静态代码块");
}
public static void main(String[] args) {
System.out.println("======start=========");
new HelloA();
new Main();
new C();
System.out.println("========end===========");
}
}
输出结果
结果分析:
(1)主类静态代码块随着类的加载而加载,优先于主方法
(2)非主类的代码块优先于非静态代码块,但不优先于主方法
(3)静态代码块只执行一次
(4)非静态代码块优先于构造方法
(5)父类方法优先于子类
4.代码块的优先顺序
(1)静态代码块>构造代码块>构造方法
(2)父类>子类
5.继承中成员方法关系(子类对象调用方法先找子类再找父类)
(1)成员方法名称不同时:直接调用
(2)成员方法名称相同时:子类对父类方法进行重写(覆盖)
但是依然可以采用super.成员方法来执行父类的成员方法
- 方法重写:
(1)概念:子父类出现一模一样的方法(返回值类型可以是引用数据类型中的子父类关系)
(2)应用场景:当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法。这样,即沿袭了父类的功能,又定义了子类特有的内容。
类如:手机发送短信功能,其他功能仍然需要,但发送字体需要做出调整,可以使用新类继承父类,但重写父类中关于短信字体的方法。
(好处:可以使用原来的功能,而且可以通过super继续使用旧版本的字体)
(3)方法重写的注意事项: - 父类中私有的方法不能被重写(因为子类无法继承父类中被私有的成员)
- 子类重写父类方法访问权限不能更低(最好访问权限相同)
- 父类的静态方法子类也必须是静态的(静态只能覆盖静态,算不上方法重写)
- 子类重写父类方法时,最好声明一模一样
6.方法重写与方法重载
- 区别:方法重载可以改变返回值类型,方法重载发生在一个类中,方法重写发生在继承类中
- 方法重写:子类中出现了和父类中方法声明一模一样的方法。与返回值类型有关,返回值是一致(或者是子父类)的
- 方法重载:本类中出现的方法名一样,参数列表不同的方法。与返回值类型无关