java基础(七)之子类实例化
知识点;
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. 调用父类中的成员变量