继承

继承主要是为了代码的复用,其关系如同Is-a,就如同狗是一个动物,狗就是子类,动物就是基类(父类),其就存在一定的继承关系,此篇文章主要讨论父类和子类直接的关系。
父类

/**
* 人类(基类)
* @author
*
*/
public class Person {
/**
* 姓名
*/
String name ;
/**
* 年龄
*/
int age;
/**
* 性别
*/
String sex;
/**
* 基类构造函数
* @param name
* @param age
* @param sex
*/
public Person(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
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 getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}

子类

/**
* 学生类(子类)
* @author
*
*/
public class Student extends Person {
/**
* 学号
*/
int num;
/**
* 班级
*/
String classroom;
/**
* 构造方法
* @param name 姓名
* @param age 年龄
* @param sex 性别
* @param num 学号
* @param classroom 班级
*/
public Student(String name, int age, String sex, int num, String classroom) {
super(name, age, sex);
this.num = num;
this.classroom = classroom;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getClassroom() {
return classroom;
}
public void setClassroom(String classroom) {
this.classroom = classroom;
}
}

此处用这两个类来进行探讨继承
1.子类继承了父类除构造函数之外的其他数据成员及方法。
2. super(参数列表) 调用父类的构造函数
如:Student的构造函数中的

super(name, age, sex);

super.data调用父类的数据成员
如在Student类中可以通过

super.age

调用年龄
super.func()即super.函数名,调用父类的成员方法。
如Student类中可以通过

super.getAge()

获得年龄

super.setAge(num);

修改年龄

3.子类的构造过程

基类static

(1)子类static

(2)基类 实例代码块

(3)基类构造方法

(4)子类 实例代码块

(5)子类构造方法

ps:在构造的时候,不管是子类还是基类其static类型的代码只初始化一次

此定理可以通过在不同的地方打印相应的语句证明

4.基类数据成员在子类当中的访问权限

38-咸鱼学Java-面向对象编程核心之继承_父类


5.子类和基类直接相互赋值

基类=子类 (√) //只把子类一部分赋值给基类

子类=基类 (×)

编译器支持从大的转小的转换

基类引用派生类对象(多态的基础)


Student a = new Student("Jiaoyan",19, "nam", 1606, "06");
Person b = new Person("jiaoyan", 10, "nan");
a = b; //错误
b = a;

6.派生类和基类同名方法的关系
overload(重载)
函数名相同,参数不同(返回值无要求)
如Person中加

public void show()
{
System.out.println("this is a Person");
}

在Student中加

public void show(int i)
{
System.out.println("this is"+i+" Student");
}

这就为重载
在Student对象中调用show()和show(i)就会触发两个不同的函数
override(重写or覆盖)
函数名相同,参数列表不同(返回值相同)
如Person中加

public void show()
{
System.out.println("this is a Person");
}

在Student中加

public void show()
{
System.out.println("this is a Student");
}

就为重写,在Student对象中调用show()只会触发Student中的Show打印出来​​this is a Student​​​
7.通过父类(引用)可以调用子类的重写的方法

Student a = new Student("Jiaoyan",19, "nam", 1606, "06");
Person b = new Person("jiaoyan", 10, "nan");
b = a;
b.show();

此时会打印出来​​this is a Student​

方法的调用过程

38-咸鱼学Java-面向对象编程核心之继承_构造函数_02


在方法区中每一个类都有一个方法表,方法表中存储着各种方法名称和方法所在的地址,在调用方法的时候先通过类找到其方法表,然后在方法表中找到方法所在的地址,然后再找到方法执行。