继承的概念
子类继承父类的属性和行为,并增加他自己新的属性和行为。
继承是一种由已知的类创建新类的机制,利用继承可以先定义一个共有属性的一般类(People,name&age),根据一般类再定义具有特殊属性的子类,子类继承一般类的属性和行为,并根据需要增加自己的新的属性和行为(Student,num&learn)
Java继承的特点
1、Java语言是单继承,一个类的直接父类只有一个
2、Java语言可以多级继承,一个类的父类,是另一个类的子类
3、一个类的直接父类只有一个,但是一个父类可以有多个父类(如下图的”学生“和”老师“都是“人”的子类)
子类的继承性
- 子类和父类在同一包中的继承性:子类继承其父类不是private的成员变量/不是private的方法作为自己的成员变量/方法。继承的成员变量或方法访问权限不变。
- 子类和父类不在同一包中的继承性:子类只继承父类中的protect和public访问权限的成员变量/方法作为子类的成员变量/方法
- 子类对象的特点:子类不继承父类的私有成员变量,如果子类和父类不在同一包中,子类不继承父类的友好成员变量。但是子类从父类继承的方法可以操作这部分子类未继承的变量。
友好变量和方法:不被private、public、protected修饰的成员变量和方法。
protect的进一步说明
成员变量的隐藏和方法重写
- 成员变量的隐藏:子类中变量的声明和父类中继承来的成员变量名字相同(类型可以不同)这种情况下子类会隐藏所继承的成员变量。
隐藏成员变量特点如下:子类对象以及子类定义的方法:操作的与父类同名的成员变量是指重新声明的成员变量。子类仍可以利用子类继承的方法操作被隐藏的成员变量。子类继承的方法操作的成员变量依然是被子类继承或隐藏的成员变量。 - 方法重写:子类重写的方法可以隐藏已经继承的方法(方法覆盖)
在继承关系的子类中,重写的方法名、返回值类型、参数个数、参数的类型必须和父类完全相同(重写的方法不属于新增方法)。
*重写注意事项:*不允许降低方法的访问权限,但可以提高方法的访问权限(访问权限由高到低为:public、protected、友好的、private)
Super关键字:(操作被隐藏的成员变量和方法)
对象的上转型对象
A类是B类的父类
A a1 ;
用子类创建一个对象
B b1 = new B(); a1 = b1;
a1 是对象b1的上转型对象
对象的上转型对象的实体是子类负责创建的,上转型对象会失去原对象的一些属性和功能。
- 上转型对象不能操作子类新增的成员变量和新增的方法。(新增的不访问)
- 可以访问子类继承或隐藏的成员变量,调用子类继承的方法或子类重写的方法。如果子类重写了父类的某个实例方法,当对象的上转型对象调用这个实例方法时一定调用了子类重写的实例方法。
- 如果子类重写了父类的静态方法,那么子类对象的上转型对象不能调用子类重写的静态方法,只能调用父类的静态方法。
public class Person {
//成员变量未被隐藏和成员方法未被重写的情况下
/*String name;
int age;
public void fatherMethod()
{
System.out.println("父类定义的方法:"+name+"的年龄是"+age);
}*/
//成员变量被隐藏或成员方法被重写的情况下
String name;
int age = 10;
public void fatherMethod()
{
System.out.println("父类定义的方法:"+name+"的年龄是"+age);
}
}
public class Student extends Person {
//成员变量未被隐藏和成员方法未被重写的情况下
/*int num;
public void sonMethod(){
System.out.println("子类新定义的方法");
}*/
//成员变量被隐藏或成员方法被重写的情况下
int num;
int age = 20;//子类隐藏父类的成员变量
public void sonMethod(){
System.out.println("子类新定义的方法");
}
/*子类重写父类的成员方法*/
public void fatherMethod()
{
System.out.println("子类重写父类定义的方法:"+name+"的年龄是"+age);
}
}
public class StudentDemo {
public static void main(String[] args) {
Person person;
Student student = new Student();
person = student;//person 是对象student的上转型对象
//成员变量未被隐藏和成员方法未被重写的情况下
/*person.age = 12;
person.name = "李华";
person.fatherMethod();//可以调用父类中的成员变量和成员方法,不可以调用子类新增的成员变量和成员方法*/
//成员变量被隐藏或成员方法被重写的情况下
person.name = "李华";
/*
//调用子类重写的方法和子类新定义的重新定义的成员变量(子类成员变量与父类成员变量相同的情况下)
*/
person.fatherMethod();
}
}
抽象方法
定义:如果父类中的方法不确定如何进行{}方法体实现,那这就是一个抽象方法。加上abstract关键字,去掉大括号,直接分号结束。
注意
1、抽象方法所在的类必须是抽象类,抽象类中也可以有非抽象方法。非抽象类中不可以有抽象方法。
2、可以有构造方法,供子类创建对象时初始化父类成员
3、子类必须重写父类中的抽象方法
public abstract class AbstractDemo {
public abstract void eat();
}
抽象类和抽象方法的使用
不能直接创建抽象类对象,必须用一个子类继承一个抽象父类,子类必须重写父类的抽象方法,子类去掉abstract关键字,加上大括号。