继承
1.继承的概念
继承体现的是类之间的一种“is-a”关系。
继承体现的是类之间的一种“is-a”关系。 A is-a B 关系成立,则 A 和 B 具有继承关系 A 继承 B ,则 A 是子类,B是父类 A extends B
继承是一种机制,通过继承可以使得子类直接使用父类中的属性和方法
2.继承的好处
1).子类通过继承可以直接使用父类中的属性和方法:提高代码的可复用性 2).子类可以定义自身独有的方法:可扩展性
3.继承的实现
父类的抽取
父类中抽取了每个子类的共性,一般情况,子类中都会有一些属于自己的属性和方法,所以父类中的信息是所有子类都具有的一般信息,而子类中的信息是自己独有的属性和行为特征,相对而言比较特殊。
父类的信息是一般的、抽象的;子类的信息是特殊的、具体的
语法:
class 父类{} class 子类 extends 父类{ }
子类可以继承父类的成员不包括:构造方法,private修饰的属性和方法
实例:重写cat类
package com.sk.entity;
/**猫*/
public class Cat1 extends Pet{
//父类如果有 有参构造子类必须调用父类的有参构造
public Cat1(String name, String color,String sex) {
super(name, color);//调用父类的有参构造
this.sex=sex;
}
//不需要再写和父类共有的属性和方法,因为已经继承
private String sex;
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public static void main(String[] args) {
Cat1 c=new Cat1("小狗","黑色","母");
String name= c.getName();//可以直接使用父类的共有方法
System.out.println(name);
System.out.println("*********************");
c.introduce();//调用的父类的方法 鼠标放到方法上是可以显示是哪一个对象的方法
c.eat();
}
}
4.方法的覆盖
方法覆盖(override):又称方法重写,在子类中定义和父类相同的方法。 要求: 子类的方法名、参数列表、返回值类型必须和父类相同 子类的访问修饰符合父类相同或是比父类更宽 使用: 子类对象名.方法名(实参); 子类中的方法优先被使用 场景: 当父类中方法的实现部分不满足子类需求时,子类可以重写父类中的方法,重写的是实现部分。
//方法的重写
@Override //用来检查是否符合重写规则,不符合会报错
public void introduce() {//调用时,会优先调用子类的重写方法
//子类重写父类的方法叫重写
//方法名相同,参数列表相同,返回值类型相同或是其子类
//修饰符不能严于父类
System.out.println("昵称:"+getName());//直接调用父类的方法
System.out.println("颜色:"+getColor());
System.out.println("性别:"+sex);
}
重载重写的区别
选项 | 位置 | 修饰符 | 返回值类型 | 方法名 | 参数列表 |
---|---|---|---|---|---|
重载 | 同一个类中 | 不限 | 不限 | 相同 | 不同 |
重写 | 子类重写父类的方法 | 不能严于父类 | 相同或是其子类 | 相同 | 相同 |
5.继承的特点
在c++语言中用虚继承方式实现的多继承关系,但是在实际应用中经常出现问题,Java语言中为了避免类似问题的出现,java采用的是单继承关系,一个类只能有一个直接的父类,这一点也体现Java语言的简单性。
java不支持多继承,,但是支持多重继承
狗的继承关系可以如下:
狗->犬科->食肉目->哺乳纲->脊椎动物门->动物界
6.访问修饰符
思考:一直在谈继承,那么子类可以继承父类中的哪些内容(构造方法、属 性、成员方法)?
构造方法不能被继承。 构造方法的方法名必须和类名一致,子类和父类的类名各不相同,所以子类需要定义自身的构造方法 子类具有更多的属性和方法,所以父类的构造方法不足以满足子类的需求
属性和成员方法是否能被继承取决于访问修饰符。
Java中4个访问修饰符及可访问的范围:
访问修饰符可以修饰的内容: 4个访问修饰符都可以用于修饰属性、成员方法、构造方法 只有public 和 [default] 可以修饰类
private 修饰构造方法 修饰的类不能被实例化
4个访问修饰符 修饰的属性和成员方法继承如下:
修饰符 | 继承性**(属性和方法)** |
---|---|
private(私有的) | 不能被继承 |
default | 同包子类可以继承 |
protected(受保护的) | 同包+非同包子类都可以继承 |
public(公开的) | 可以继承 |
7.super的应用
1).super的第一种用法:
super. : 用在子类的成员方法或是构造方法中,代表访问父类的属性和方法 super.属性名 :访问父类中的属性 super.成员方法名(实参) : 访问父类中的成员方法
@Override
public void introduce() {
super.introduce();//调用父类的方法
System.out.println("昵称:"+getName());//直接调用父类的方法.可以不使用super
System.out.println("颜色:"+getColor());
System.out.println("性别:"+sex);
}
2)super的第二种用法:
super()/super(实参):用在子类的构造方法的第一行中,代表创建父类对象时调用父类的哪一个构造方法完成父类对象的创建(显示指定)
如果在子类的构造方法中,既没有super()/super(实参),则JVM会在子类的构造方法的第一行默认添加super()
在同一个构造法方法中,super(参数)/this(参数)不允许同时存在
public Cat1(String name, String color,String sex) {
//调用父类的构造方法必须写在子类构造方法的第一行
super(name, color);//调用父类的有参构造
this.sex=sex;
}
8.创建对象的过程
所有类的父类都是 Object类