java学习笔记(二十二)继承的进一步研究
继承的进一步研究
1.1 子类对象实例化过程
子类对象的实例化::先调用父类的构造方法,然后再调用子类的构造方法。
实例:
class Person
{
private String name;
private int age;
public Person(){
System.out.println("父类person中的构造:");
}
public void setName(String name){
this.name=name;
}
public void setAge(int age){
this.age=age;
}
public String getName(){
return this.name;
}
public int getAge(){
return this.age;
}
};
class Student extends Person
{
//此处添加代码
private String school;
public Student(){
System.out.println("子类Student中的构造:");
}
public void setSchool(String school){
this.school=school;
}
public String getSchool(){
return this.school;
}
}
public class ExDemo01
{
public static void main(String args[]){
Student stu = new Student();
//stu.setName("张三");
//stu.fun();
}
}
结果为:
F:\java>javac ExDemo01.java
F:\java>java ExDemo01
父类person中的构造:
子类Student中的构造:
注意:实际上,此时,对于子类的构造方法中,隐含了一个“super”的语句。有时候将父类成为“超类”。
class Person
{
private String name;
private int age;
public Person(){
System.out.println("父类person中的构造:");
}
public void setName(String name){
this.name=name;
}
public void setAge(int age){
this.age=age;
}
public String getName(){
return this.name;
}
public int getAge(){
return this.age;
}
};
class Student extends Person
{
//此处添加代码
private String school;
public Student(){
super();//默认隐藏
System.out.println("子类Student中的构造:");
}
public void setSchool(String school){
this.school=school;
}
public String getSchool(){
return this.school;
}
}
public class ExDemo01
{
public static void main(String args[]){
Student stu = new Student();
//stu.setName("张三");
//stu.fun();
}
}
1.2 方法的覆盖
子类定义了与父类同名的方法,但在方法覆盖时候必须考虑到权限。即被子类覆盖的方法不能拥有比父类方法更加严格的访问权限。
所以父类中使用public定义的方法,子类的访问权限必须是public。
java中,访问权限有四种:
private:最小的访问权限
default:什么都不声明
public:最大的访问权限
private《default《public;
实例:
class Person
{
void print(){
System.out.println("父类");
}
};
class Student
{
public void print(){
System.out.println("子类");
}
};
public class ExDemo03
{
public static void main(String args[]){
Student stu = new Student();
stu.print();
}
}
输出为;
F:\java>javac ExDemo03.java
F:\java>java ExDemo03
子类
1.3 如果飞要调用父类的被覆盖的方法呢?
通过super关键字就可以完成此功能,super关键字可以从子类访问父类的内容,如果要访问被覆盖的方法:super.方法();
//import java.lang.*;
class Person
{
void print(){
System.out.println("父类");
}
};
class Student extends Person
{
public void print(){
super.print();
System.out.println("子类");
}
};
public class ExDemo03
{
public static void main(String args[]){
Student stu = new Student();
stu.print();
}
}
结果为:
F:\java>javac ExDemo03.java
F:\java>java ExDemo03
父类
子类
如果去掉super,默认是this.print();程序不断调用自己的子类的print();
//import java.lang.*;
class Person
{
void print(){
System.out.println("父类");
}
};
class Student extends Person
{
public void print(){
print();
System.out.println("子类");
}
};
public class ExDemo03
{
public static void main(String args[]){
Student stu = new Student();
stu.print();
}
}
结果:
at Student.print(ExDemo03.java:11)
at Student.print(ExDemo03.java:11)
at Student.print(ExDemo03.java:11)
at Student.print(ExDemo03.java:11)
at Student.print(ExDemo03.java:11)
at Student.print(ExDemo03.java:11)
at Student.print(ExDemo03.java:11)
at Student.print(ExDemo03.java:11)
at Student.print(ExDemo03.java:11)
at Student.print(ExDemo03.java:11)
at Student.print(ExDemo03.java:11)
at Student.print(ExDemo03.java:11)
at Student.print(ExDemo03.java:11)
at Student.print(ExDemo03.java:11)
at Student.print(ExDemo03.java:11)
at Student.print(ExDemo03.java:11)
at Student.print(ExDemo03.java:11)
at Student.print(ExDemo03.java:11)
at Student.print(ExDemo03.java:11)
at Student.print(ExDemo03.java:11)
1.4 this与super的区别
A:属性访问
this访问本类中的属性,如果本类没有此属性则从父类中继续查找。
super直接访问父类的属性
B:方法
this访问本类中的方法,如果本类没有此方法则从父类中继续查找。
super直接访问父类的方法
C:构造调用
this调用本类构造
super调用父类构造
D:
this表示当前对象
super无此概念