2 继承
需要两个类才能实现继承的效果。 比如:类A 继承 类B
-
A类 称为 子类 , 衍生类,派生类
-
B类 称为 父类,基类,超类
继承的作用
-
子类自动的拥有父类的所有属性和方法 (父类编写,子类不需要再编写) 。 代码复用
目前私有的属性和方法无法访问。
-
多态的基础。
继承语法
-
先定义父类 (单独的类)
-
在定义子类的同时,实现与父类的继承关系
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 子类对象的创建过程
-
不存在父类对象这个概念
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关键字
可以指定父类的内容 (属性,方法,构造方法)
一般情况下,在子类中,可以默认指定父类的内容。
-
变量访问的顺序: 局部变量->类变量->父类变量->报错
class B{ String name1 ; } class A extends B{ String name1 ; public void t1(){ String name1 ; print(name) ; } }
但有些情况必须使用super来指定父类的内容
-
子类中写了与父类中同名的属性和方法 (重写)
-
在子类的构造方法中,指定要调用的父类的构造方法
在创建子类对象时,不仅仅子类对象的构造方法会被调用,父类的构造方法也会被调用
是在子类构造方法的第一行被调用的。 (先调用子类的构造器,先执行完父类的构造器)
默认会在子类构造方法的第一行,执行super(),表示调用父类的无参构造器
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是在运行时有所应用的。