引出继承
// 老师
class Teacher
{
String name;
int age;
String level;// 级别
public void sleep(){}
}
// 学生
class Student
{
String name;
int age;
String sn;// 学号
public void sleep(){}
}
// 公司雇员
class Employee
{
String name;
int age;
String hireDate;// 入职工夫
public void sleep(){}
}
问题:上述 Teacher、Student、Employee 三个类中存在着独特的代码,解决代码反复的问题。
// 将多个类独特的信息提取进去
public class Person
{
String name;
int age;
public void sleep(){}
}
父类:寄存共性(独特的特色(状态 / 行为))。
子类:寄存个性(本人特有的个性(状态 / 行为))
从该例子,咱们发现,继承关系解决了代码冲符的问题。
// 将多个类独特的信息提取进去
class Person
{
String name;
int age;
public void sleep(){}
}
// 老师
class Teacher extends Person
{
String level;// 级别
}
// 学生
class Student extends Person
{
String sn;// 学号
}
// 公司雇员
class Employee extends Person
{
String hireDate;// 入职工夫
}
继承关系
什么是继承关系:
基于某个父类对对象的定义加以拓展,而产生新的子类定义,子类能够继承父类原来的某些定义,也能够减少原来父类所没有的定义,或者覆写父类中的某些个性。
从面向对象的角度上说:继承是一种从个别到非凡的关系,是种“is a”的关系,即子类是对父类的拓展,是一种非凡的父类,比方:狗是动物的一种非凡状况,狗属于动物。
在 Java 语言中,存在多个类的时候咱们应用 ”extends” 关键字来示意子类和父类之间的关系。
语法格局: 在定义子类的时候来表明本人须要继承拓展于哪一个父类。
public class 子类类名 extends 父类类名
{
编写本人也有的状态和行为
}
在 Java 中,类和类之间的继承关系 只容许单继承,不容许多继承。 也就是说一个类 A,只能有一个父类,不能呈现类 A 同时继承于类 B 和类 C。然而 Java 中容许多重继承。 如:上图动物分猫狗,猫狗又细分为具体不同种类的狗。
Java 中 除了 Object 类外, 每一个类都有一个间接的父类。如:class Student extends Person{}, 此时 Student 类的父类是 Person 类。Object 是 Java 语言的根类,所以 Person 的父类是 Object。
Object 要么是一个类的间接父类,要么是间接父类。
继承关系的作用:
- 解决了代码反复的问题;
- 真正的作用,体现出一个体系。
子类继承父类之后,能够领有父类的某一些状态和行为(子类复用了 父类的性能或状态)。
子类到底继承了父类的哪些成员(依据拜访修饰符来判断:)
1): 如果父类中的成员应用 public 润饰,子类继承
2): 如果父类中的成员应用protected 润饰 子类也继承 ,即便父类和子类不在同一个包中;
3): 如果父类和子类在同一个包中,此时子类能够 继承父类中缺省修饰符 的成员;
4): 如果父类中的成员应用 private 润饰,子类打死都 继承不到 。因为 private 只能在本类中拜访;
5): 父类的结构器子类也不能继承,因为结构器必须和以后的类名雷同。
办法笼罩
场景:
子类拓展了父类,能够取得父类的局部办法和成员变量。可是当父类的某个办法不适宜于子类自身的特色时,此时怎么办?
如企鹅 (Penguin) 和鸵鸟 (Ostrich) 是鸟类中的一个非凡种类,所以企鹊 / 鸵鸟类是鸟类的一个子类,然而鸟类有翱翔的性能,但
是对应企鹅 / 鸵鸟,翱翔的行为显然不适宜于它。
此时怎么办??
// 鸟类
class Bird
{
public void fly(){
System.out.println(“ 自在翱翔!”);
}
}
// 企鹅
class Penguin extends Bird
{
public void fly(){// 笼罩父类办法
System.out.println(“ 飞不起来!”);
}
}
// 办法笼罩
class OverrideDemo
{
public static void main(String[] args)
{
// 创立企鹅对象并调用其翱翔的办法
Penguin p = new Penguin();
p.fly();
}
}
办法覆写的准则 (一起两小一大) : override
一起:
1. 实例办法签名必须雷同。(办法签名 = 办法名 + 办法的参数列表)
两小:
2. 子类办法的返回值类型是和父类办法的返回类型雷同或者是其子类。即子类能够返回一个更加具体的类型。
3. 子类办法申明抛出的异样类型和父类办法申明抛出的异样类型雷同或者是其子类。
子类办法中申明抛出的异样小于或等 于父类办法申明抛出异样类型;
子类办法能够同时申明抛出多个属于父类办法申明抛出异样类的子类 (RuntimeException 类型除外)
一大:
④子类办法的拜访权限比父类办法拜访权限更大或相等。
private 润饰的办法不能被子类所继承也就不存在笼罩的概念。
判断是否是覆写办法的必杀技: @Override 标签 :若办法是覆写方,在办法前或上贴上该标签,编译通过,否则,编译出错。
只有办法存在笼罩的概念,字段没有笼罩。
办法笼罩解决的问题:当父类的某一个行为不合乎子类具体的特色的时候,此时子类须要从新定义父类。
办法重载和办法笼罩 (办法重写) 的区别:
办法重载: Overload
办法重写: Override
批评,自身二者一点关系都没有,仅仅只是因为名字很像
办法重载: Overload
** 作用:解决了同一个类中,雷同性能的办法名不同的问题。
既然是雷同的性能,那么办法的名字就应该雷同。
规定:两同一不同
同类中,办法名雷同,办法参数列表不同 (参数类型,参数个数参数程序)。**
办法重写: Override
** 作用:解决子类继承父类之后可能父类的某一个办法不满足子类的具体特色,此时须要从新在子类中定义该办法,并重写法体。
规定:一起两小,一大
一起:父类和子类的办法签名是雷同的,所以倡议:间接拷贝父类中办法的定义到子类中再重写办法体。**