继承
- 面向对象语言的三大特征:
封装,继承,多态
1、继承的含义
继承:在java中指的是“一个类
”可以“继承自
”“另一个类
”。 "被继承的类"叫做: 父类/超类/基类
,"继承其他类的类"叫做:子类
。继承后,“子类”中就“拥有”了“父类”中所有的成员(成员变量、成员方法)
。 “子类就不需要再定义
了”。
2、继承的好处
- 提高代码的复用性(减少代码冗余,相同代码重复利用)。
- 使类与类之间产生了关系。
3 继承的格式
通过 extends
关键字,可以声明一个子类继承另外一个父类,定义格式如下:
class 父类 {
...
}
class 子类 extends 父类 {
...
}
需要注意:Java是单继承
的,一个类只能继承一个直接父类,并且满足is-a
的关系,例如:Student is a Person
4、继承的演示
人类(父类):
public class Person {
// 成员变量(注意此处的成员变量并没有使用private修饰)
String name;
int age;
// 功能方法
public void eat(){
System.out.println("吃东西");
}
public void sleep(){
System.out.println("睡觉");
}
}
老师类(子类): extends 人类
public class Teacher extends Person {
double salary;// 独有的属性
public void teach(){}// 独有的方法
}
学生类(子类): extends 人类
public class Student extends Person{
}
测试:
public class Test {
public static void main(String[] args) {
Teacher t = new Teacher();
System.out.println(t.name);
System.out.println(t.age);
t.eat();
t.sleep();
}
}
继承图解如下
小结
-
public class 子类名 extends 父类名{ }
-
通过继承可以
将一些共性的属性,行为抽取到一个父类中
,子类只需要继承即可,提供了代码的复用性
5 继承后成员访问规则
5.1继承后构造方法
的访问规则
- 构造方法
不能被继承
public class Person {
// 成员变量(注意此处的成员变量并没有使用private修饰)
String name;
int age;
//构造方法
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 功能方法
public void eat(){
System.out.println("吃东西");
}
public void sleep(){
System.out.println("睡觉");
}
}
public class Student extends Person{
public void study(){}// 独有的方法
}
public class Test {
public static void main(String[] args) {
//Student student = new Student("张三",18);编译报错
}
}
5.2继承后私有成员
的访问规则
-
父类的“私有成员”可以被子类继承,但子类
不能被直接访问
。 -
私有成员变量对于
父类只能在父类内部使用
-
对于继承的
子类
,能通过get/set公共方法
进行设值或者获取public class Fu{ private int num = 100;//私有成员,只能在父类内部使用。 private void method(){ System.out.println("私有成员方法"); } } public class Zi extends Fu{ } public class Test{ public static void main(String[] args) { Zi z = new Zi(); System.out.println(z.num);// 编译错误 z.method();// 编译错误 } }
5.3继承后非私有成员
的访问规则
-
当通过“子类”访问
非私有成员
时,先在子类
中找,如果找到就使用子类的,找不到就继续去“父类”
中找。public class Fu{ int money = 100; public void method(){ System.out.println("Fu 类中的成员方法method"); } } public class Zi extends Fu{ int money = 1; public void method(){ System.out.println("Zi 类中的成员方法method"); } } public class Demo{ public static void main(String[] args){ Zi z = new Zi(); System.out.println(z.money);//1 z.method();// Zi 类中的成员方法method } }
小结
构造方法
不能被继承- 父类的“私有成员”可以被子类继承,但子类
不能被直接访问
。 - 当通过“子类”访问
非私有成员
时,先在子类
中找,如果找到就使用子类的,找不到就继续去“父类
”中找。
6、 继承的特点
- Java只支持
单继承
,不支持多继承。
// 一个类只能有一个父类,不可以有多个父类。
class A {
}
class B {
}
class C1 extends A {// ok
}
class C2 extends A, B {// error
}
- 一个类只能有一个父类,但可以有多个子类。
// A可以有多个子类
class A {
}
class C1 extends A {
}
class C2 extends A {
}
- 可以多层继承。
class A /*extends Object*/{// 爷爷 默认继承Object类
}
class B extends A {// 父亲
}
class C extends B {// 儿子
}
补充: 顶层父类是Object类。所有的类默认继承Object,作为父类。
class A {} 默认继承Object类 直接继承Object类
class B extends A{} B的父类就是A,但是A的父类是Object类 间接继承Object类
java中所有类都是直接或者间接继承Object,所有类都是Object类的子类
小结:
- 类的继承只能是
单继承
,不能多继承,但是可以多层继承
- java中所有类都是
直接或者间接继承Object
,所有类都是Object类的子类