2 继承
需要两个类才能实现继承的效果。 比如:类A 继承 类B
-
A类 称为 子类 , 衍生类,派生类
-
B类 称为 父类,基类,超类
继承的作用
-
子类自动的拥有父类的所有属性和方法 (父类编写,子类不需要再编写) 。 代码复用
目前私有的属性和方法无法访问。
-
多态的基础。
继承语法
-
先定义父类 (单独的类)
-
在定义子类的同时,实现与父类的继承关系
java">class B{String name ;public void t1() {}
}
class A extends B{//String name ;//public void t1() {}
}
A a = new A();
a.name = "zs" ;
a.t1();
继承特点
-
继承具有传递性
A extends B extends C
A类中,既有B类的内容,又有C类的内容
-
基础具有不可逆性
A extends B
A类中,有B类的内容
但B类中没有A类的内容。
-
Java只支持单继承 (C++支持多继承)
一个类只能继承一个父类。
但可以连续继承
A extends B extends C
A extends B
A extends C
不可以的
3 子类对象的创建过程
-
不存在父类对象这个概念
java">class A{String name ;public void t1(){}
}
class B extends A{int age ;public void t2(){}
}
new A(); //不算父类对象
new B() ;//这就是我们所说的子类对象
-
尽管B对象中的name属性,是从A类中继承而来的
-
但使用过程中,直接通过name名称就可以访问到。
-
可以使用JOL工具来查看内存结果
4 super关键字
可以指定父类的内容 (属性,方法,构造方法)
一般情况下,在子类中,可以默认指定父类的内容。
-
变量访问的顺序: 局部变量->类变量->父类变量->报错
java">class B{String name1 ; } class A extends B{String name1 ;public void t1(){String name1 ;print(name) ;} }
但有些情况必须使用super来指定父类的内容
-
子类中写了与父类中同名的属性和方法 (重写)
-
在子类的构造方法中,指定要调用的父类的构造方法
在创建子类对象时,不仅仅子类对象的构造方法会被调用,父类的构造方法也会被调用
是在子类构造方法的第一行被调用的。 (先调用子类的构造器,先执行完父类的构造器)
默认会在子类构造方法的第一行,执行super(),表示调用父类的无参构造器
java">class A{String name ;public void t1(){}
}
class B extends A{public void t1(){}public void t2(){name = "ls" ;name = "zs" ;super.t1();}
}
class A{int a ;int b ;public A(int a , int b){this.a = a ;this.b = b ;}public void A(){}
}
class B extends A{int c ;int d ;public B(){}public B(int c , int d){}public B(int a , int b , int c, int d){//想将a和b交给父类的构造器//super()super(a,b);this.c = c ;this.d = d ;}
}
B b = new B(10,20,30,40);
this和super关键字
-
在使用上,this和super特点相似
-
但本质上完全不同
-
this的本质,是一个参数变量,存储的是当前方法所属对应的地址。
-
super的本质,就是一个关键字,用来指定父类的内容。这个指定效果在编译后就没有了。
而this是在运行时有所应用的。