JAVA中使用super调用属性、方法、构造器
子类中super关键字的使用
1.super可以理解为父类的
2.super可以用来调用属性,方法,构造器
3.在子类中使用super调用属性和方法
3.1在子类的方法或构造器中,通过使用“super.属性”或者“super.方法”的方式 ,显示的调用父类中声明的属性或者方法 但是,通常情况下,我们习惯省略 “super.”
3.2特殊情况,当子类和父类中定义了同名的属性时,想要调用父类中声明的属性,就需要通过“super.属性”的方式来表明调用的是父类中声明的属性
3.3特殊情况,当子类重写了父类中的方法以后,想在子类的方法中调用父类被重写的方法时,则必须显示的使用“super.方法” 来表明调用的是父类中被重写的方法
4.在子类中使用super调用父类的构造器
4.1我们可以在子类的构造器中显示的使用“super(形参列表)”的方式,来调用父类中声明的指定的构造器
4.2“super(形参列表)”的使用,必须声明在子类构造器的首行
4.3我们在类的构造器中,针对于“this(形参列表)”和“super(形参列表)”只能二选一,不能同时出现。“this(形参列表)”表示子类中重载的构造器,“super(形参列表)”表示调用父类的构造器
4.4在构造器的首行,没有显示的调用“this(形参列表)”和“super(形参列表)”时,则默认调用的是父类中空参的构造器,super()
4.5在类的多个构造器中,至少有一个类的构造器使用了“super(形参列表)”调用父类中的构造器,不可能全是“this(形参列表)”。
新建一个父类Person
public class Person { String name="张三"; int age=21; int id=1001001001;//证号 //空参构造器 public Person(){ System.out.println("我无处不在!"); } //一个参数的构造器 public Person(String name){ this.name = name; } //多个参数的构造器 public Person(String name,int age){ this(name); this.age = age; } public void eat(){ System.out.println("人吃饭"); } public void walk(int distance){ System.out.println("人走路,走的距离是"+distance+"公里"); } }
再新建一个子类Student,继承上面的父类Person
package com.guigu.exer; import com.guigu.exer.Person; public class Student extends Person { String major; int id=10086;//学号 //子类空参构造器 public Student(){ } //子类一个参数的构造器 public Student(String major){ //这个构造器的首行有一个默认的super(),不写时,编辑器会自动加上该默认super() //super(); this.major = major; } //子类中多个参数的构造器 public Student(String name,int age,String major){ //使用"super(形参列表)"的方式调用父类中指定形参的构造器 //使用"super(形参列表)"的时候,必须声明在子类构造器的首行 super(name,age); this.major = major; } //该方法对父类方法进行了重写 @Override public void eat(){ System.out.println("学生吃饭"); } public void show(){ //此时的name、age前面可以省略this System.out.println("name=" + name + "," + "age=" + age); //这里的this,super都可以调用,第一是因为子类和父类没有属性冲突的情况,都在堆空间去找且仅有一个name、age System.out.println("name=" + this.name + ","+ "age=" + super.age); //因为子类和父类都有一个同名的属性,此时在堆空间是有两个id的, 默认调用的是子类的属性,这里省略了一个this System.out.println("子类中的id=" + id); //如果想要调用父类的属性,需要在前面加上一个super System.out.println("父类中的id = "+ super.id); } public void study(){ System.out.println("学生,好好学习,天天向上"); //这里的调用省略了前面的“this.” eat(); super.eat(); //因为walk没有被重写,那么在子类中调用时,可以省略this,也可以使用"this.",还可以使用"super." //使用“this."和"super."的区别在于:“this."会先在本类去找,没有找到再去父类找该方法,使用"super."直接去父类去找该方法 walk(2); this.walk(3); super.walk(5); } }
新建一个测试类,来验证一下,看看打印结果
package com.guigu.exer; public class SuperTest { /** * @param args */ public static void main(String[] args) { Student student =new Student(); student.show(); student.study(); System.out.println("------------------"); Student s1= new Student("Tom",21,"IT"); s1.show(); System.out.println("********************"); Student s2= new Student();