面向对象特征之二:继承性
- 继承性的理解
生活上:财产的继承、颜值的继承
代码层面:
自上而下:定义了一个类A,在定义另一个类B时,发现类B的功能与类A相似,考虑类B继承于类A
自下而上:定义了类B,C,D等,发现B、C、D有类似的属性和方法,则可以考虑将相同的属性和方法进行抽取,
封装到类A中,让类B、C、D继承于类A,同时,B、C、D中的相似的功能就可以删除了。
- 继承性的好处
-
继承的出现减少了代码冗余,提高了代码的复用性。
-
继承的出现,更有利于功能的扩展。
-
继承的出现让类与类之间产生了
is-a的关系,为多态的使用提供了前提。 -
继承描述事物之间的所属关系,这种关系是:
is-a的关系。可见,父类更通用、更一般,子类更具体。
- 继承的格式:
class A{
//属性、方法
}
class B extends A{
}
继承中的基本概念:
类A: 父类、superClass、超类、基类
类B: 子类、subClass、派生类
- 有了继承性以后:
子类就获取到了父类中声明的所有的属性和方法。
但是,由于封装性的影响,可能子类不能直接调用父类中声明的属性或方法。
子类在继承父类以后,还可以扩展自己特有的功能(体现:增加特有的属性、方法)
extends:延展、扩展、延伸
子类和父类的理解,要区别于集合和子集
不要为了继承而继承。在继承之前,判断一下是否有is a的关系。
-
默认的父类:
Java中声明的类,如果没有显式的声明其父类时,则默认继承于java.lang.Object -
补充说明:
Java是支持多层继承。
概念:直接父类、间接父类
Java中的子父类的概念是相对的。
Java中一个父类可以声明多个子类。反之,一个子类只能有一个父类(Java的单继承性)
Person类
package com.atguigu03._extends;
public class Person {
//属性
String name;
private int age;
//方法
public void eat(){
System.out.println("人吃饭");
}
public void sleep(){
System.out.println("人睡觉");
}
public void show(){
System.out.println("age : " + age);
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Student类
package com.atguigu03._extends;
public class Student extends Person{
//属性
// String name;
// int age;
String school;
//方法
// public void eat(){
// System.out.println("人吃饭");
// }
// public void sleep(){
// System.out.println("人睡觉");
// }
public void study(){
System.out.println("学生学习");
}
public void show1(){
// System.out.println("age : " + age);
System.out.println("age : " + getAge());
}
}
ExtendsTest类
package com.atguigu03._extends;
public class ExtendsTest {
public static void main(String[] args) {
Person p1 = new Person();
p1.name = "Tony";
// p1.age = 12;
p1.eat();
System.out.println(p1.toString());
Student s1 = new Student();
s1.name = "Tom";
// s1.age = 12;
s1.eat();
//超纲:获取s1所属类的父类
System.out.println(s1.getClass().getSuperclass());
//超纲:获取p1所属类的父类
System.out.println(p1.getClass().getSuperclass());//java.lang.Object
}
}