Java学习笔记之继承(2)

1、子类对象实例化过程

在继承操作中,实例化子类对象的时候,会先调用父类的构造方法,然后再调用本类的构造方法。

class Person{
    private String name;
    private int age;
    public Person(){
        System.out.println("父类构造方法");
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

class Student extends Person{
    private String school;
    public Student(){
    	// super();  默认隐藏了调用父类构造方法的super方法
        System.out.println("子类构造方法");
    }

    public String getSchool() {
        return school;
    }

    public void setSchool(String school) {
        this.school = school;
    }
}
public class InstanceDemo {
    public static void main(String[] args) {
        Student stu = new Student();
        stu.setName("张三");
        stu.setAge(18);
        stu.setSchool("NanKai");
        System.out.println("姓名:" + stu.getName() + " 年龄:" + stu.getAge() + " 学校:" + stu.getSchool() );

    }
}

// 运行结果:
父类构造方法
子类构造方法
姓名:张三 年龄:18 学校:NanKai

2、方法的覆写

所谓方法的覆写就是子类里定义了和父类一样名称的方法,但是子类同名方法的权限不能拥有比父类方法更加严格的访问权限。访问权限有三种,private, default, public。
比如父类一个方法的访问权限是public,那么子类覆写该方法的权限只能是public,否则编译会报错。

class Person{
	void print(){
		System.out.println("Person --> void print()");
	}
}

class Student extends Person{
	public void print(){
		System.out.println("Student --> void print()");
	}
}
public class OverrideDemo{
	public static void main(String args[]){
		Student s = new Student();
		s.print();
	}
}

// 运行结果
Student --> void print()

如果想要调用父类的方法该怎么办?我们可以用super关键字

class Person{
	void print(){
		System.out.println("Person --> void print()");
	}
}

class Student extends Person{
	public void print(){
		super.print();
		System.out.println("Student --> void print()");
	}
}
public class OverrideDemo{
	public static void main(String args[]){
		Student s = new Student();
		s.print();
	}
}

// 运行结果
Person --> void print()
Student --> void print()

如果将父类的方法设置为private访问权限,子类覆写的方法设置为default权限,是否可以继承呢?

class Person1{
    private void print(){
        System.out.println("父类print方法");
    }
    public void fun(){
        this.print();
    }
}

class Student1 extends Person1{
    void print(){
        System.out.println("子类print方法");
    }
}

public class OverrideDemo {
    public static void main(String[] args) {
        Student1 s = new Student1();
        s.fun();
    }
}

// 运行结果:
父类print方法

可以看到,子类覆写了父类的print方法,子类实例化对象调用父类的fun方法,而fun方法的功能是调用print方法,但是由于父类否print方法是private访问权限,因此子类所谓的覆写其实并没有覆写,而是相当于在子类里又重新定义了一个方法。

3、覆写和重载的区别

在这里插入图片描述

4、super关键字

super表示的是从子类调用父类的指定操作,例如调用属性,方法,构造等。而子类在实例化对象的时候会先调用父类无参的构造方法,如果希望调用有参的构造方法,则必须在子类中声明

class Person1{
	private String name;
	private int age;
	public Person1(String name,int age){
		this.setName(name);
		this.setAge(age);
	}
	// setter & getter 方法
}

class Student1 extends Person1{
    private String school;
    public Student1(String name,int age,String school){
    	super(name,age); // 明确调用父类中有两个参数的构造
    	this.school = school;
    }
	// setter & getter 方法
}

public class OverrideDemo {
    public static void main(String[] args) {
        Student1 s = new Student1("张三",20,"Tsing U");
    }
}

this 和 super关键字的区别
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zuolixiangfisher/article/details/85040400