Java基础知识——super关键词
4.2super关键词
4.2.1什么是super关键词?
- 在类的方法定义中使用super关键词代表使用该方法的对象对父类的引用(在子类中使用super可以调用父类的方法,属性),简而言之,super用于访问当前对象的父类成员
4.2.2super关键词用法分类
- super关键词一共两种用法:
super.
和super()
i.super.的用法
- super.代指的是当前对象的父类成员变量
- super.大多数情况下可以省略,一定情况下不可以省略
代码演示用法:
public class Person{
String name="小明";
char gender;
int age;
public Person(){
System.out.println("person的空构造器");
}
public void eat(){
System.out.println("用筷子吃饭");
}
}
public class Student extends Person{
int id=10;//给成员变量赋值
public Student(){
System.out.println("学生的空构造器学号为:"+this.id+super.name);
System.out.println("学生的空构造器学号为:"+this.id+this.name);
System.out.println("学生的空构造器学号为:"+id+name);
//三种方法效果一样,此时this.和super.都可以省略,
//super.指向父类成员,this.先指向本类,后指向父类
}
public void study(){
System.out.println("helloworld");
}
}
public class Test{
public static void main(String[] args){
Student stu=new Student();
stu.study();
stu.eat();
}
}
运行结果:
person的空构造器
学生的空构造器学号为:10小明
学生的空构造器学号为:10小明
学生的空构造器学号为:10小明
用筷子吃饭
上述代码内存分析图:
- super.变量直接父类中找所需要的变量,如没有找到,就会报错
- this.代表当前对象,首先在本类中找所需要的变量,如果没找到,就会到父类中找,直到找到为止
- 此时的this.和super.都可以省略,因为在本类中默认是this.,当前对象首先在本类中找所需要的变量,如果没找到,就会到父类中找,直到找到为止
super.不可以省略情况
- 当父类和子类出现了同名的变量、同名方法时,为了能够区别父类和子类的同名变量或者是同名方法,此时super.一定不能省略。如果省略了,默认情况是this.,当前对象访问到的一定是子类自己的变量或者方法 ,无法访问到父类中的变量和方法
代码演示:
public class Person{
String name="小明";
char gender;
int age;
public Person(){
System.out.println("person的空构造器");
}
public void eat(){
System.out.println("用筷子吃饭");
}
}
public class Student extends Person{
String name="小红";
int id=10;//给成员变量赋值
public Student(){
System.out.println("学生的空构造器学号为:"+this.id+super.name);
System.out.println("学生的空构造器学号为:"+id+name);
//super.指向父类成员,this.先指向本类,后指向父类
}
public void study(){
System.out.println("helloworld");
}
}
public class Test{
public static void main(String[] args){
Student stu=new Student();
stu.study();
stu.eat();
}
}
运行结果:
person的空构造器
学生的空构造器学号为:10小明
学生的空构造器学号为:10小红
用筷子吃饭
ii.super()的用法
代码演示:
public class Derson{
String name;
char gender;
int age;
public Derson(){
System.out.println("我是父类的空构造器");
}
public Derson(String name){
System.out.println("我是带参构造器");
}
public void eat(){
System.out.println("用筷子吃饭");
}
}
public class Student extends Derson{
String name;
public Student(){
//默认存在super();
System.out.println("我是子类空构造器");
}
public Student(String name){
super("小明");//调用父类带参构造器
}
public void study(){
System.out.println("helloworld");
}
}
public class Test{
public static void main(String[] args){
Student stu1=new Student();
stu1.study();
stu1.eat();
Student stu2=new Student("小明");
}
}
运算结果:
我是父类的空构造器
我是子类空构造器
helloworld
用筷子吃饭
我是带参构造器
- 在对子类对象初始化的时候,父类的构造器优先运行原因是由于在子类构造器的第一行存在一个隐藏的super();
- super()指向的是父类的无参构造器(任何一类中都系统默认添加一个无参构造器),被调用之后会在内存中创建一个父类对象。
- 继承关系中,子类不能平白无故的创建,必须要保证父类存在,子类才能被创建出来。
- 要调用父类中的有参构造器,必须要在通过super()给出父类中参数列表相对应的类型的值来传递
super()注意事项:
- 对于所有的子类而言。在子类的构造器的第一行都存在super();
- this()和super()不能共存。当构造器中存在super,就不能显式编写this();如果构造器中存在this(),那么构造器中的默认super()空构造器就不存在了。
- this()和后续学的构造代码块也是不能共存的
- 父类的构造器只会被调用一次。