1、super关键字的特点
(1)super和this关键字的特点类似:super代表的是父类对象的引用
(2)当子类的成员出现同名时,可以用super来区分
(3)在子类构造方法中,通过super关键字调用父类的构造方法,完成对相关字段值的初始化
强调:当构造一个子类对象的时候一定会先调用父类的构造方法来构造父类的对象。调用父类构造方法的语句必须是子类构造方法中的第一条指令
示例:
package jicheng.zhangkun.java;
class Person{
String name;
private String address; //当属性是用private修饰时,Student是不可以继承Person中的address的
//父类所有私藏的东西,子类是无法直接通过继承获取的,除非调用父类的构造方法
//public Person(){}
public Person(String name, String address){
this.name = name;
this.address = address;
System.out.println("父类构造方法被调用");
}
public void eat(){
System.out.println("人吃饭");
}
public void drink(){
System.out.println("人喝酒");
}
public void printInfo(){
System.out.println("name: "+name);
}
// private void printAddress(){
// System.out.println("address: "+address);
// } 当方法修改为private时,则该方法不能被继承
public void printAddress(){
System.out.println("address: "+address);
}
}
class Student extends Person{ //学生继承人的属性及方法
public Student(String name, String address){
super(name, address); //在子类构造方法中,通过super关键字调用父类的构造方法,完成对相关字段值的初始化
//当构造一个子类对象的时候一定会先调用父类的构造方法来构造父类的对象。调用父类构造方法的语句必须是子类构造方法中的第一条指令
System.out.println("子类构造方法被调用");
}
int score;
public void goToSchool(){
System.out.println("去上学");
}
public void eat(){
super.eat(); //当子类的成员(变量及方法)出现同名时,可以用super来区分
System.out.println("eat");
}
}
public class Test {
public static void main(String[] args) {
//Person p = new Person("张三", "北京");
//p.printInfo();
Student s = new Student("李四", "上海");
s.eat();
s.printInfo();
s.printAddress();
s.goToSchool();
}
}
运行结果:
父类构造方法被调用
子类构造方法被调用
人吃饭
eat
name: 李四
address: 上海
去上学
2、继承之私有权限相关细节
(1)当属性是用private修饰时,Student是不可以继承Person中的address的
(2)当方法修改为private时,则该方法不能被继承
(3)父类所有私藏的东西,子类是无法直接通过继承获取的,除非调用父类的构造方法
3、方法重写(override)
概念:方法重写是指子类可以根据需要对父类继承来的方法进行改写,是多态机制的前奏
特点:
(1)重写方法必须和被重写方法具有相同的方法名称、参数列表和返回值
(2)重写方法不能比被重写方法有更严格的访问权限
(3)父类中的私有方法,不能被重写
(4)在子类重写方法中继续调用父类被重写的方法可以通过super.函数名来获取
代码实例:
package jicheng.zhangkun.java;
class Person{
String name;
String address;
public void printInfo(String name){
System.out.println("Person name: "+name);
}
public void printAddress(String address){
System.out.println("Person address: "+address);
}
}
//重写方法必须和被重写方法具有相同的方法名称、参数列表和返回值
//重写方法不能比被重写方法有更严格的访问权限
//父类中的私有方法,不能被重写
//在子类重写方法中继续调用父类被重写的方法可以通过super.函数名来获取
class Student extends Person{
int score;
public void printInfo(String name){
super.printInfo(name);
System.out.println("Student name: "+name);
}
public void printAddress(String address){
super.printAddress(address);
System.out.println("Student address: "+address);
}
}
public class Test {
public static void main(String[] args) {
Student s = new Student();
s.printInfo("张三");
s.printAddress("上海");
}
}
运行结果:
Person name: 张三
Student name: 张三
Person address: 上海
Student address: 上海