1.什么是继承,了解继承中构造器的使用
对继承的理解
- 继承是子类调用父类的属性和方法,在java中通过extends关键字实现。
- 子类不能调用父类private修饰的属性和方法;
- 继承是类与类之间的一种关系;
- 一个子类只能继承一个父类,一个父类能被多个子类继承;
- 子类与父类是is a的关系;
继承中构造器的使用
在具有继承关系对象的创建过程中,构建子类对象会先构建父类对象,先走父类构造器。
super():表示调用父类无参构造方法,如果没有显示书写,则默认隐式存在于子类构造方法的首行
public class Test {
public static void main(String[] args) {
new C();
}
}
class A{
public A(){
System.out.println("A");
}
}
class B extends A{
public B(){
super();
System.out.println("B");
}
}
class C extends B{
public C(){
super();
System.out.println("C");
}
}
如果父类没有显示的无参构造方法时,子类继承父类,则需要在子类构造器中调用父类的有参构造方法;
class A{
public A(String A){
System.out.println("A");
}
}
class B extends A{
public B(){
super(null);
System.out.println("B");
}
}
2.理解this和super关键字
this关键字
类是模板,可服务于此类的所有对象;this代表当前实例,是类中的默认引用;当类服务于某个对象时,this则指向这个对象
//当创建s1对象时,this指向0x0000AO01,访问的name属性即是Ox0000A001地址中的name空间;
//当创建s2对象时,this指向Ox0000B002,访问的name属性即是Ox0000B002地址中的name空间;
public class Test {
public static void main(String[] args) {
Teacher s1 = new Teacher();
s1.sayHi();
Teacher s2 = new Teacher();
s2.sayHi();
}
}
class Teacher{
String name;
public void sayHi(){
System.out.println(this.name);
}
}
this的两种用法
- 通过this. 调用实例属性、方法;
- 通过this(),this(实参)调用其他构造函数;
**注意:**构造器在调用其他构造器的时候要放在构造器的首行,还要防止构造递归,造成死循环。
Super关键字
在子类中可直接访问父类的属性和方法,当子类中的属性和方法与父类发生遮蔽和重写,需要加以区分,才可以专项访问。
public class TestSuperKeyword i
public static void main(String[] args) {
B b = new B();
b.print();
}
}
class A{
int value = 10;
}
class Bextends A{
int value = 20;
public void print(){
int value = 30;
System.out.print1n(value);
System.out.print1n(this.value);System.out.print1n(super.value);
}
}
//运行结果30 20 10
//父子类属性同时存在不存在重写,子类遮蔽父类属性,需要使用不同前缀进行访问。
子类的默认无参构造器默认隐藏super()先执行父类的无参构造器。super()默认放在第一行。
super关键字的用法
1.第一种用法
- 在子类方法中使用super. 的形式访问父类的属性和方法;
- 例如super.父类属性, super.父类方法;
2.第二种用法
- 在子类的构造方法的首行,使用super() super(实参),调用父类构造方法;
为什么this和super不能同时存在
如果一个类继承了其他类,那当初始化时super会默认调用父类的无参构造方法,或super调用有参的构造方法,然后再完成子类特有属性的初始化。而在构造函数中,this调用的是其他构造函数,而其他构造函数中也有super存在,这样就存在两个super,意味着父类的两次初始化,这不安全。