Java中的继承和多态

目录

一. 什么是继承?

二. 怎样继承?

三. 父类成员的访问

1. 子类中访问父类的成员变量

2.子类中访问父类的成员方法

 3,super 关键字

四. 子类的构造方法

五. 继承的方式

六. 什么是多态

七. 如何实现多态

1.发生向上转型的时机 

 2.什么是重写 

3.向下转型

八. 多态的优缺点


一. 什么是继承?

顾名思义,就是通常我们理解继承的概念,是面向对象中复用某个类下属性和方法的有效手段,当子类继承父类的时候,子类就拥有了父类的属性和方法。

比如动物包含了姓名,年龄,吃东西等属性和功能,其中小狗作为动物的子类,则小狗就拥有了动物的属性和功能。

二. 怎样继承?

这个代码定义了两个类,一个父类(Animal类),一个子类(Cat类)通过extends关键字来实现继承。在子类中,继承了父类的name 和 age 属性和eat( )方法,同时在子类中也可以有自己的属性和方法

总结:继承是一种思想,是对共性的抽取从而达到代码的复用效果


三. 父类成员的访问

1. 子类中访问父类的成员变量

1. 如果访问的成员变量子类中有,优先访问自己的成员变量。
2. 如果访问的成员变量子类中无,则访问父类继承下来的,如果父类也没有定义,则编译报错。
3. 如果访问的成员变量与父类中成员变量同名,则优先访问自己的

总结:成员变量访问遵循就近原则,自己有优先自己的,如果没有则向父类中找。


2.子类中访问父类的成员方法

访问父类的成员方法和访问父类的成员变量类似

1. 如果子类和父类有相同的方法名,则优先访问子类自己的

2. 如果访问的成员方法子类中无,则访问父类继承下来的,如果父类也没有定义,则编译报错。

3. 遵循就近原则

 3,super 关键字

当子类和父类有相同的成员变量或者成员方法时,我们说采用就近原则,优先访问子类自己的成员变量和方法,但当我们使用super关键字也可以访问父类的成员变量和方法。

1. 访问父类的成员变量

 2.访问父类的成员方法

注意事项

1. 只能在非静态方法中使用,用来访问非静态成员方法和字段

2. 在子类方法中,访问父类的成员变量和方法 


四. 子类的构造方法

但我们在给子类构造对象时,需要先调用基类构造方法,然后执行子类的构造方法。

注意

子类构造方法中默认会调用父类的无参构造方法:super(),

如果父类也没有写构造方法,编译器也会提供一个不带参数的构造方法
用户没有写时,编译器会自动添加,而且super()必须是子类构造方法中第一条语句,
并且只能出现一次

注意

1. 如果父类构造方法是带有参数的,此时需要用户为子类显式定义构造方法,并在子类构造方法中选择合适的父类构造方法调用,否则编译失败

2. 当父类不提供构造方法时,编译器会自动提供一个不带参数的构造方法,当父类有带有参数的构造方法的时候,会优先使用带参数的构造方法

五. 继承的方式

1. 单继承

2. 多层继承 一般我们不希望出现超过三层的继承关系

 3. 不同类继承同一个类

4,多继承

Java是不支持多继承的 ! ! ! 


六. 什么是多态

多态是同一个行为具有多个不同表现形式或形态的能力。

 对于一台打印机来说,都具有打印的功能,但不同的打印机呈现出来的效果是不一样的,同一个事件发生在不同的对象上会产生不同的结果。这就是多态。 

七. 如何实现多态

在java中要实现多态,必须要满足如下几个条件,缺一不可:
1. 必须在继承体系下,发生向上转型
2. 子类必须要对父类中方法进行重写
3. 通过父类的引用调用重写的方法

 我用这个图详细解释一下发生多态的关键.

在上图中有一个父类 Shape 类,实现了draw( ) ,Circle类,Triangle 类,Square类继承了Shape类,并且重写了父类的draw( )

1.发生向上转型的时机 

向上转型实际就是创建一个子类对象,将其当成父类对象来使用。

1. 直接赋值的时候发生向上转型

2.方法的参数

 3.通过返回值实现向上转型

 向上转型的优点:让代码实现更简单灵活。
 向上转型的缺陷:不能调用到子类特有的方法

 2.什么是重写 

 在Java和其他一些高级面向对象的编程语言中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。

注意事项:

1. 方法的返回值,参数列表,方法名和父类的一样

2. 被重写的方法的访问修饰限定符 在子类中药大于等于父类的

3. 访问修饰限定符权限大小 : private < 默认权限 < protected < public

4.被 private修饰的方法不能被重写.因为private 修饰的方法只能在当前类中使用,如果被其他类继承,当前类是不能访问到的.

5.被final 修饰的方法是不能被重写的

6. 被static 修饰的方法是不能被重写的

6. 构造方法也是不能被重重写的. 因为构造方法是不能被继承的.子类对象在初始化的时候要先帮助父类进行初始化.

3.向下转型

向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用转为子类引用,这个过程是向下转型。如果是直接创建父类对象,是无法向下转型的

向下转型是非常不安全的,我们在平常也很少会用到. 

八. 多态的优缺点

优点

1. 能够降低代码的 "圈复杂度", 避免使用大量的 if - else

例如我们现在需要打印的不是一个形状了, 而是多个形状. 如果不基于多态, 实现代码如下

public static void drawShapes() {
    Rect rect = new Rect();
    Cycle cycle = new Cycle();
    Flower flower = new Flower();

    String[] shapes = {"cycle", "rect", "cycle", "rect", "flower"};

    for (String shape : shapes) {
        if (shape.equals("cycle")) {
            cycle.draw();
        } else if (shape.equals("rect")) {
            rect.draw();
        } else if (shape.equals("flower")) {
            flower.draw();
        }
    }
}

如果使用使用多态, 则不必写这么多的 if - else 分支语句, 代码更简单

public static void drawShapes() {

// 我们创建了一个 Shape 对象的数组.
Shape[] shapes = {new Cycle(), new Rect(), new Cycle(),

new Rect(), new Flower()};

for (Shape shape : shapes) {
   shape.draw();
}
}

缺点

代码的运行效率降低。
1. 属性没有多态性
当父类和子类都有同名属性的时候,通过父类引用,只能引用父类自己的成员属性
2. 构造方法没有多态性
 

  • 12
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
好的,关于Java继承多态,简单来说,继承是指一个可以基于另一个来创建自己的成员变量和方法,而多态则是指不同的对象可以以相同的方式进行处理。 下面是一个简单的继承示例: ``` class Animal { public void sound() { System.out.println("Animal makes a sound"); } } class Dog extends Animal { public void sound() { System.out.println("Dog barks"); } } class Cat extends Animal { public void sound() { System.out.println("Cat meows"); } } public class Main { public static void main(String[] args) { Animal a = new Animal(); Animal d = new Dog(); Animal c = new Cat(); a.sound(); d.sound(); c.sound(); } } ``` 在这个示例,我们定义了一个基 `Animal`,这个有一个 `sound` 方法,然后我们又定义了两个子 `Dog` 和 `Cat`,它们都继承了 `Animal` ,并且重写了 `sound` 方法。在 `Main` ,我们分别创建了一个基对象和两个子对象,并调用了它们的 `sound` 方法。由于子重写了基的 `sound` 方法,因此调用子对象的 `sound` 方法时输出的内容也不同。 接下来,我们来看一下多态的示例: ``` class Shape { public void draw() { System.out.println("Drawing a shape"); } } class Circle extends Shape { public void draw() { System.out.println("Drawing a circle"); } } class Square extends Shape { public void draw() { System.out.println("Drawing a square"); } } public class Main { public static void main(String[] args) { Shape s1 = new Circle(); Shape s2 = new Square(); s1.draw(); s2.draw(); } } ``` 在这个示例,我们定义了一个基 `Shape`,这个有一个 `draw` 方法,然后我们又定义了两个子 `Circle` 和 `Square`,它们都继承了 `Shape` ,并且重写了 `draw` 方法。在 `Main` ,我们分别创建了一个 `Circle` 对象和一个 `Square` 对象,并将它们赋值给一个型为 `Shape` 的变量。然后,我们调用了这两个变量的 `draw` 方法。由于这两个变量实际上分别指向了 `Circle` 对象和 `Square` 对象,因此它们在调用 `draw` 方法时输出的内容也不同。这就是多态的作用,即不同的对象可以以相同的方式进行处理。 希望这个简单的示例能够帮助你理解继承多态的概念和用法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值