JAVA-----继承与super关键字详解

继承可以使得子类具有父类的属性和方法或者重新定义、追加属性和方法等


继承的注意事项

  1. 父类中的私有变量子类不可以继承
  2. 子类重写父类方法,访问权限不能比父类低,public>默认>private
  3. 子类只能继承一个父类,但是可以有多层继承

首先讲一下java中super和this关键字的区别:

关键字 访问成员变量 访问构造方法 访问成员方法
this this.成员变量–访问本类成员变量 this(…) --访问本类构造方法 this.成员方法–访问本类成员方法
super super.成员变量–访问父类成员变量 super(…) --访问父类构造方法 super.成员方法–访问父类成员方法

java中继承的语法为:
public class 子类 extends 父类{ }

  • 先看一段代码:
public class father {
    
    
	public int age=40;//年龄
	
	public father() {
    
    
		System.out.println("father中无参构造方法被调用");
	}
	
	public father(int age) {
    
    
		System.out.println("father中带参构造方法被调用");
	}
}

public class son extends father{
    
    
	public int age=20;
	
	public son() {
    
    
		System.out.println("son中无参构造方法被调用");
	}
	
	public son(int age) {
    
    
		System.out.println("son中带参构造方法被调用");
	}
	public void show() {
    
    
		int age=30;
		System.out.println(age);//30
		System.out.println(this.age);//20
		System.out.println(super.age);//40		
	}

}


public class Demo {
    
    
	public static void main(String[] args) {
    
    
		son s=new son();
		s.show();
		
		son s1=new son(32);
		s1.show();
	}

}

main函数中创建son对象,最终输出为:

father中无参构造方法被调用
son中无参构造方法被调用
30
20
40
father中无参构造方法被调用
son中带参构造方法被调用
30
20
40

无论调用子类的有参构造还是无参构造,都会调用父类的无参构造,这是为什么呢?

这是因为

  • 子类中所有构造方法默认都会访问父类中无参构造方法
  • 因为子类会继承父类中的数据,可能还会使用父类中的数据,所以子类初始化前,一定要先完成父类数据初始化
  • 每一个子类构造方法的第一条语句默认都是:super()

因此,每次在调用子类的时候,系统默认先执行了super()语句,先调用了父类的无参构造方法


那么如何才能调用父类带参构造方法呢?


public class son extends father{
    
    
	public int age=20;
	
	public son() {
    
    
		super(20);
		System.out.println("son中无参构造方法被调用");
	}
	
	public son(int age) {
    
    
		super(20);
		System.out.println("son中带参构造方法被调用");
	}
	public void show() {
    
    
		int age=30;
		System.out.println(age);//30
		System.out.println(this.age);//20
		System.out.println(super.age);//40		
	}

}

只需在子类构造函数中加上super(x)即可(x为参数)


  • 利用super实现子类方法重写

直接看代码

父类:


public class Phone {
    
    
	public void call(String name) {
    
    
		System.out.println("给"+name+"打电话");
	}

}

子类:

public class newPhone extends Phone {
    
    
	@Override
	public void call(String name) {
    
    
		System.out.println("开启视频");
		super.call(name);
	}

}

主函数:

public class test {
    
    
	public static void main(String[] args) {
    
    
		newPhone p=new newPhone();
		p.call("小李");
	}

}

通过super关键字可直接调用父类方法,然后子类中再写上本类特有属性即可
其中 @Override是一个注解,可以用于检查重写方法声明的正确性

猜你喜欢

转载自blog.csdn.net/weixin_45102820/article/details/113085718