一、方法的重写(Override)

概念

1、定义

在子类中可以根据需要对从父类中继承来的方法进行改造,也称方法的重置、覆盖。在程序执行时,子类的方法将覆盖父类的方法。

2、要求

  1. 重写方法必须和被重写方法具有相同的方法名称、参数列表和返回值类型
  • 子类重写父类的方法,只是重新编写方法体的代码
  1. 重写方法不能使用比被重写方法更严格的访问权限
  • 如果父类的方法是public的,子类重写的时候就不能使用缺省及以下
  1. 重写和被重写的方法必须同时为static的,或同时为非static的
  2. 子类方法抛出的异常不能大于父类被重写方法的异常

3、方法的重载与重写

  1. 重载:
  • 一个类可以有多个同名方法
  1. 重写
  • 子类可以重新写父类的方法,覆盖父类的方法

4、练习

Java重写方法作用域 java中重写方法_构造器


子类不能访问父类私有的东西。

二、父子类与访问修饰符的关系

Java重写方法作用域 java中重写方法_java_02

  1. 如果子类和父类在同一个包下,那么对于父类的成员修饰符只要不是私有的,那子类就都可以使用
  2. 如果子类和父类不在同一包下,子类只能使用父类中protected和public修饰的成员

三、关键字——super

1、在java类中使用super来调用父类中的指定操作:

  1. super可用于访问父类中定义的属性
  2. super可用于调用父类中的成员方法
  3. super可用于在子类构造方法中调用父类的构造器

2、注意

  1. 尤其当父子类出现同名成员时,可用super进行区分
  2. super的追溯不仅限于直接父类
  • 使用super,子类可以调用子类之上所有父类层级
  1. super和this的用法相 像,this代表本类对象的引用,super代表父类的内存空间的标识

3、举例

public class Kk extends Kids{
	public void test(){
		super.salary = 1;//可以使用super向上追溯父类的父类,当然可以一直向上追溯,如果有那么多个层级的父类的话
		super.yearsOld = 1;//可以使用super直接追溯使用父类的成员变量
		super.employeed();//可以使用super直接追溯使用父类的成员方法
		super.manOrWoman();//可以使用super向上追溯父类的父类的成员方法,可以一直向上追溯,如果有那么多个层级的父类的话
	}
}

4、调用父类的构造器

  1. 子类中所有的构造器默认都会访问父类中空参数的构造器
//ManKind.java
public class ManKind{
	
	public ManKind(){//显示无参构造方法
		System.out.println("ManKind");
	}
	
	int sex;
	int salary;

	public int getSex(){
		return sex;
	}

	public void setSex(int sex){
		this.sex = sex;
	}

	pubic int getSalary(){
		return salary;
	}

	public void setSalary(int salary){
		this.salary = salary;
	}
	
	public void manOrWoman(){
		if(this.sex == 1){
			System.out.println("man");
		}else if(this.sex == 0){
			System.out.println("woman");
		}
	}

	public void employeed(){
		if(this.salary == 0){
			System.out.println("no job");
		}else{
			System.out.println("job");
		}
	}
}
//Kids.java
public class Kids extends ManKind{
	int yearsOld;

	public int getYearsOld(){
		return yearsOld;
	}

	public void setYearsOld(int yearsOld){
		this.yearsOld = yearsOld;
	}

	public void printAge(){
		System.out.println(this.yearsOld);
	}

	public static void main(String[] args){
		Kids someKid = new Kids();//new Kids()是在调用Kids类的默认无参构造方法,在这个过程中就使用父类的无参构造
	}
}
  1. 当父类中没有空参数的构造器时,子类的构造器必须通过**this(参数列表)或者super(参数列表)**语句指定调用本类或者父类中相应的构造器,且必须放在构造器的第一行。
//ManKind.java
public class ManKind{
	
/*	public ManKind(){//显示无参构造方法
		System.out.println("ManKind");
	}
*/

	//当存在显示的构造方法时,类就没有默认的无参构造了,而是要使用显示的构造
	public ManKind(int sex,int salary){
		this.sex = sex;
		this.salary = salary;
	}
	
	int sex;
	int salary;

	public int getSex(){
		return sex;
	}

	public void setSex(int sex){
		this.sex = sex;
	}

	pubic int getSalary(){
		return salary;
	}

	public void setSalary(int salary){
		this.salary = salary;
	}
	
	public void manOrWoman(){
		if(this.sex == 1){
			System.out.println("man");
		}else if(this.sex == 0){
			System.out.println("woman");
		}
	}

	public void employeed(){
		if(this.salary == 0){
			System.out.println("no job");
		}else{
			System.out.println("job");
		}
	}
}
//Kids.java
public class Kids extends ManKind{
	
	 public Kids(int sex,int salary){
	 	//在父类只有有参构造可以使用的时候,子类必须显示的构建一个有参构造来调用父类的有参构造,并且调用父类构造方法super要写在第一行
		super(sex,salary);
	}

	int yearsOld;

	public int getYearsOld(){
		return yearsOld;
	}

	public void setYearsOld(int yearsOld){
		this.yearsOld = yearsOld;
	}

	public void printAge(){
		System.out.println(this.yearsOld);
	}

	public static void main(String[] args){
		Kids someKid = new Kids();//new Kids()是在调用Kids类的默认无参构造方法,在这个过程中就使用父类的无参构造
	}
}
  1. 如果子类构造器中既未显示调用父类或本类的构造器,且父类中又没有无参的构造器,则编译出错

四、this和super的区别

区别点

this

super

1

访问属性

访问本类中的属性,如果本类没有此属性则从父类中(可以是父类,父类的父类等等)继续查找

访问父类中的属性

2

调用方法

访问本类中的方法

直接访问父类(可以是父类,父类的父类等等)中的方法

3

调用构造器

调用本类构造器,必须放在构造器的首行

调用父类构造器,必须放在子类构造器的首行

4

特殊

表示当前对象

无此概念

在子类中,通过this或者是super调用构造器,只能使用一个,因为都要占据第一行。