继承
继承主要是为了代码的复用,其关系如同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.基类数据成员在子类当中的访问权限
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
方法的调用过程
在方法区中每一个类都有一个方法表,方法表中存储着各种方法名称和方法所在的地址,在调用方法的时候先通过类找到其方法表,然后在方法表中找到方法所在的地址,然后再找到方法执行。