1.super关键字
当子类重写父类的方法后,子类对象将无法访问父类被重写的方法,为了解决这个问题,Java提供了super关键字,super关键字可以在子类中调用父类的普通属性、方法以及构造方法。
(1)使用super关键字访问父类的成员变量和成员方法,具体格式如下:
super.成员变量
super.成员方法(参数1,参数2…)
public class Animal {
String name="牧羊犬";
//定义动物叫的方法
void shout(){
System.out.println("动物发出叫声");
}
}
public class Dog extends Animal{
public void shout(){
super.shout();
System.out.println("汪汪汪。。。。");
}
public void printName(){
System.out.println("名字"+super.name);
}
}
public class Example05 {
public static void main(String[] args) {
Dog dog=new Dog();
dog.shout();
dog.printName();
}
}
在Dog类的shout()方法中使用“super.shout()”调用了父类被重写的shout()方法。在printName()方法中使用“super.name”访问父类的成员变量name。从运行结果中可以看出,子类通过super关键字可以成功地访问父类成员变量和成员方法
(2)使用super关键字访问父类中指定的构造方法,具体格式如下:
super(参数1,参数2…)
public class Animal {
private String name;
private int age;
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String info(){
return "名称"+this.getName()+"年龄;"+this.getAge();
}
}
public class Dog extends Animal {
private String color;
public Dog(String name, int age, String color) {
super(name, age);
this.color = color;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
//
public String info(){
return super.info()+"颜色:"+this.getColor();//扩充父类中的方法
}
}
public class Example06 {
public static void main(String[] args) {
Dog dog=new Dog("牧羊犬",3,"黑色");
System.out.println(dog.info());
}
}
上述代码中,使用super()调用了父类中有两个参数的构造方法
注意:通过super()调用父类构造方法的代码必须位于子类构造方法的第一行,并且只能出现一次。
super与this的区别
区别点 | this | super |
属性访问 | 访问本类中的属性,如果本类中没有该属性,则从父类中查找。 | 访问父类中的属性 |
方法 | 访问本类中的方法,如果本类中没有该方法,则从父类中继续查找 | 直接访问父类中的方法 |
调用构造 | 调用本类构造,必须放在构造方法的首行 | 调用父类构造,必须放在子类构造方法的首行 |
注意:this和super两者不可以同时出现,因为this和super在调用构造方法时都要求必须放在构造方法的首行。
2.final关键字
final的英文意思是“最终”。在Java中,可以使用final关键字声明类、属性、方法,在声明时需要注意以下几点:
(1)使用final修饰的类不能有子类。
(2)使用final修饰的方法不能被子类重写。
(3)使用final修饰的变量(成员变量和局部变量)是常量,常量不可修改
在使用final声明变量时,要求全部的字母大写。如果一个程序中的变量使用public static final声明,则此变量将成为全局变量,如下面代码所示。
public static final String NAME = "哈士奇";