手机扫码查看
面向对象的三大特效之继承
生活中的继承
生活中的 “ 继承 ” 是 施方的一种赠与, 受方的一种获得
将一方所拥有的东西给予另一方
程序中的继承
程序中的继承,是类与类之间 特征 和 行为 的一种赠与或获得
两个类之间的 继承关系 , 必须 满足 “ is a ” 的关系
狗继承动物,猫继承动物
父类的选择
现实生活中,很多类别之间都存在着继承关系,都满足 “is a” 的关系
狗是一种动物、狗是一种生物、狗是一种物质
多个类别都可作为 “ 狗 ” 的父类,需要从中选择出最适合的父类
动物
属性:品种、年龄、性别
方法:吃、睡、跑
生物
属性:品种、年龄、性别
方法:呼吸
功能越精细,重合点越多,越接近直接父类。
功能越粗略,重合点越少,越接近 Object(万物皆对象的概念)
父类的抽象
可根据程序需要使用到多个具体类,进行共性抽取,进而定义父类
父类:动物
属性:品种、年龄、性别
方法:吃、睡
子类:狗
属性:品种、年龄、性别
方法:吃、睡、跑
子类:猫
属性:品种、年龄、性别
方法:吃、睡、跑
子类:鱼
属性:品种、年龄、性别
方法:吃、睡、游
在一组相同或类似的类中,抽取出共性的特征和行为,定义在父类中,实现重用
继承
语法:class 子类 exdents 父类{}
应用:产生继承关系之后,子类可以使用父类中的属性和方法,也可定义子
类独有的属性和方法
好处:既提高代码的复用性,又提高代码的可扩展性
Java为单继承,一个类只能有一个直接父类,但可以多级继承,属性和方法逐级叠加。
不可继承
构造方法:类中的构造方法,只负责创建本类对象,不可继承
private修饰的属性和方法:
访问修饰符的一种,仅本类可见
父子类不在同一个包中时,default修饰的属性和方法:
访问修饰符的一种,仅同包可见
访问修饰符
本类 同包 非同包子类 其他 private 1 0 0 0 default 1 1 0 0 protected 1 1 1 0 public 1 1 1 1
什么是方法的覆盖?
子类中是否可以定义和父类相同的方法?为什么需要在子类中定义和父类相同的方法?
当父类提供的方法无法满足子类需求时,可在子类中定义和父类相同的方法进行覆盖。
方法的覆盖
原则:
1.方法列表,参数列表,返回值类型必须与父类相同
2.访问修饰符可与父类相同或是比父类更宽泛
执行:
子类覆盖父类方法后,调用时优先执行子类覆盖后的方法。
public class demos{
public static void main(String[] args) {
Dog d=new Dog();
d.name="狗";
d.eat("猫粮");
Cat c=new Cat();
c.name="猫";
c.eat("狗粮");
}
}
class Animal{
String name;
public void eat(){
System.out.println("父类的无参的方法");
}
public void eat(String feed){
System.out.println("父类的吃方法:"+name+"吃了"+feed);
}
}
class Cat extends Animal{//如果子类没有定义方法,则执行父类的方法
}
class Dog extends Animal{
public void eat(String feed){//方法的覆盖
System.out.println("子类覆盖父类的吃方法:"+name+"吃了"+feed);
}
}
public class demos{
public static void main(String[] args) {
Dog d=new Dog();
d.name="狗";
d.eat(3);
Cat c=new Cat();
c.name="猫";
c.eat("狗粮");
}
}
class Animal{
String name;
public void eat(){
System.out.println("父类的吃方法");
}
}
class Cat extends Animal{
public void eat(String feed){//方法的重载
System.out.println("子类的吃方法:"+name+"吃了"+feed);
}
}
class Dog extends Animal{
public void eat(int hours){//方法的重载
System.out.println("子类的吃方法:"+name+"吃了"+hours+"小时");
}
}



发表回复