今天小编在浏览知乎时,发现别人提出了一个关于super关键字的问题
这个程序的输出结果是多少呢? 是2还是1呢?
我们知道这个题的考点就是关于super关键字,那么今天咱们就带着题目搞搞super这个关键字。
什么是super?
它是一个指代变量,用于在子类中指代父类对象。
使用范围
访问父类中的成员变量
访问父类中的成员方法
访问父类中的构造方法
我们使用代码来进行逐步讲解
1.访问父类中的成员变量
public class Person {
public String name = "男人";
public int age = 12334 ;
}
public class Student extends Person {
public String name = "辉辉";
public int age = 21 ;
public void show(){
System.out.println("Student:"+this.name);
System.out.println("Person:"+super.name);
}
public static void main(String[] args) {
Student student = new Student();
student.show();
}
}
结果为:
2.访问父类中的成员方法
public class Person {
public void method(){
System.out.println("我是父类中的方法");
}
}
public class Student extends Person {
public void method(){
System.out.println("我是子类中的方法");
}
public void show(){
this.method();
super.method();
}
public static void main(String[] args) {
Student student = new Student("辉辉");
student.show();
}
}
结果为:
3.访问父类中的构造方法
(1).调用无参构造
public class Person {
public Person(){
System.out.println("我是父类中的无参构造方法");
}
}
public class Student extends Person {
public Student(){
super();
System.out.println("我是子类中的构造方法");
}
public static void main(String[] args) {
Student student = new Student();
}
}
(2).调用有参构造
public class Person {
public String name = "男人";
public Person(String name){
this.name = name;
System.out.println("我是父类中的有参构造方法");
}
}
public class Student extends Person {
public Student(){
super("攻城小弟");
System.out.println("我是子类中的构造方法");
}
public static void main(String[] args) {
Student student = new Student();
}
}
注意点:
当两个类存在继承关系时,默认子类会调用父类中的无参构造,super()在子类中可以不写,父类中其无参构造代码可以不写,自己默认存在。
当父类中含有有参构造时,其无参构造会消失,如果你在子类中想要调用无参构造,需要手动书写代码,否在报错。
一个重要的关键点,我们根据题目分析一下,并解答这个题目。
我们知道super的使用是在存在继承关系的两个类中存在的。
继承:就是将父类中非私用的属性和方法继承给子类,所以上面的题目,虽然HelloWord这个类没有定义a变量,但是还是可以访问a变量,这个地方存在两种情况
ONE
public class Person {
public int a = 1 ;
}
public class HelloWord extends Person{
public HelloWord(int a){
this.a = a;
System.out.println("super.a"+super.a);
}
}
这种情况:在HelloWord这个类中,不含有自己的成员变量a,其中的a是父类的。只有一个a变量
TWO
public class Person {
public int a = 1 ;
}
public class HelloWord extends Person{
public int a ;
public HelloWord(int a){
this.a = a;
System.out.println("super.a"+super.a);
}
}
这种情况:在HelloWord这个类中,含有自己的成员变量a,其中名字为a的变量是为两个。一个是子类的,一个是父类的,子类的访问使用this.a而父类中a变量使用super.a访问。
super的另一个作用:当子类和父类中含有相同的名字的属性时,为了区分子类和父类,就可以利用super和this这两个关键字。
到这里,我们利用自己学到的知识,我们分析上面的一段代码
public class HelloWord extends Person{
public HelloWord(int a){
this.a = a;
System.out.println("super.a"+super.a);
}
}
我们知道这个子类中只含有一个变量a,是父类的,当使用this为其进行赋值时,其实改变的是父类中a的值,所以super.a=2
后记
作为一名学习JAVA的新手,虽然自己的知识还不完善,但小编还是希望可以将自己学到的知识,分享给大家,所以写下了上面的文章,如有错误,可以联系小编啊,小编一定即使改正错误,且感谢小伙伴的指出。