首页 > 技术文章 > java基础(七)之子类实例化

endust 2019-11-07 17:30 原文

知识点;
1、生成子类的过程
2、使用super调用父类构造函数的方法

 

首先编写3个文件。

Person.java

class Person{
	String name;
	int age;
	Person(){
		System.out.println("None");
	}
	Person(String name,int age){
		this.name = name;
		this.age = age;
		
		System.out.println("Name: " + this.name + " Age:" +this.age);
	}
	
	void eat(){
		System.out.println("eating");
	}
}

  

Student.java:

class Student extends Person{
	Student(){
		System.out.println("i am students!");
	}
}

  

Test.java:

public class Test{
	public static void main(String[] args){
		Student li = new Student();
	}
}

  

编译运行结果是:

PS C:\Users\admin\Desktop\java_code\练习六> javac .\Test.java
PS C:\Users\admin\Desktop\java_code\练习六> java Test
None
i am students!

  

为什么运行的结果是这样呢?

在子类的构造函数当中,必须调用父类的构造函数。
如果没有的话,编译器会自动加上super,super会调用父类的构造函数:

super();

 

 

那为什么要"在子类的构造函数当中,必须调用父类的构造函数"?

可以减少重复代码。

请看下面的例子:

Person.java:

class Person{
	String name;
	int age;
	Person(){
		System.out.println("None");
	}
	Person(String name,int age){
		this.name = name;
		this.age = age;
		
	}
	
	void eat(){
		System.out.println("eating");
	}
}

  

如果按照以前的方式写,代码会是这样的,可以发现Stduent和Person类中有重复的代码。

Student.java:

class Student extends Person{
	int grade;
	Student(){
		System.out.println("i am students!");
	}
	Student(String name,int age,int grade){
		this.name = name;
		this.age = age;
		this.grade = grade;
		
	}
}

  

修改后Student.java:

class Student extends Person{
	int grade;
	Student(){
		System.out.println("i am students!");
	}
	Student(String name,int age,int grade){
		super(name,age);
		this.grade = grade;
		
	}
}

  

Test.java:

public class Test{
	public static void main(String[] args){
		Student li = new Student("liming",18,90);
		System.out.println(li.name);
		System.out.println(li.age);
		System.out.println(li.grade);
	}
}

  

编译后输出:

PS C:\Users\admin\Desktop\java_code\练习六> java Test
liming
18
90

  

因此super与this调用构造函数类似,this()为空的时候调用同类无参数的构造函数,因此super会调用父类无参数的构造函数。

  • this()调用本类当中的构造函数
  • this. 调用本类中的成员变量
  • super() 调用父类当中的构造函数
  • super. 调用父类中的成员变量

 

 

推荐阅读