目录
一、继承
继承的定义:
继承的基本用法:
如何调用父类的方法?
二、多态
多态性的好处
多态中的强制类型转换:
包的命名规则——域名倒叙
一、继承
继承的定义:
继承是面向对象编程中的一种机制,它允许一个类继承另一个类的属性和方法。通过这种方式,子类可以复用基类的代码,避免重复编写相同的代码。其中——父类又叫超类、基类。子类又叫派生类。
继承的基本用法:
在Java中,可以使用extends
关键字来声明一个类继承另一个类:
在这个例子中,Dog
类继承自Animal
类,因此Dog
类的对象可以使用Animal
类中的eat
方法,同时也可以调用Dog
类自己定义的bark
方法。
class Animal {void eat() {System.out.println("This animal eats food.");}
}class Dog extends Animal {void bark() {System.out.println("The dog barks.");}
}public class Main {public static void main(String[] args) {Dog myDog = new Dog();myDog.eat(); // 继承自父类 AnimalmyDog.bark(); // 子类 Dog 的方法}
}
注意!!!
继承有以下几个规则
- 子类只能继承父类中可访问的属性和方法。如果父类中的某个方法或属性被声明为
private
,则子类无法直接访问它们。 - 父类可以有很多个派生子类,但一个子类只能有一个父类。(区别于C++,能有多个父类)。
- 父类的对象一定先于子类生成,先于子类被初始化
- 被final修饰的类不可被继承,被final修饰的方法不可以被重写。
如何调用父类的方法?
继承父类的无参和有参函数和引用封装的过程相同,就是默认调用同名中的无参函数,当传参数时,才会调用同名函数中有参的函数。
(如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。)
super
关键字在Java等语言中用于引用当前对象的直接父类对象。通过使用super
,你可以在子类的方法中调用父类的同名方法、访问父类的成员变量(如果它们不是私有的),或者调用父类的构造函数。
在上面的例子中,我们发现——当子类中的方法与父类中的方法重名时,这通常被称为方法覆盖(Override)。在这种情况下,子类的方法会隐藏(或说覆盖)父类中的同名方法。当你想在子类的方法中调用被覆盖的父类方法时,需要使用super
关键字。重名方法只使用最新版。
二、多态
多态是面向对象编程中的一个核心概念,它指的是一个对象变量可以指向多种实际类型的现象,即同一个事件发生在不同的对象上会产生不同的结果。
多态性的好处
- 提高了代码的复用性:通过多态性,可以使用父类类型的引用来操作子类对象,从而实现了代码的复用。
- 提高了代码的灵活性:多态性允许在运行时动态地确定对象的类型,从而可以根据需要调用不同的方法。这使得程序更加灵活和可扩展。
- 简化了代码:多态性允许使用统一的接口来操作不同的对象,从而简化了代码。
示例:
x先被赋予父类Person后才被依次指向Child1,Child2,Child3,因此形成了一个多态。
我们会发现,同样都是执行x.m1()方法,因为作用在不同的对象上,结果不一样。
注意!!!
一个类的句柄可以指向自己类的对象或自己的子孙后代类的对象。反过来则不成立。
多态中的强制类型转换:
-
向上转型(Upcasting):将子类对象转换为父类对象。这是安全的,因为子类继承了父类的所有属性和方法。
Animal myDog = new Dog(); // 向上转型,安全 myDog.makeSound(); // 调用父类方法
-
向下转型(Downcasting):将父类对象转换为子类对象。这是不安全的,因为不是所有的父类对象都是子类对象。如果尝试将一个不是子类实例的父类对象转换为子类,会抛出
ClassCastException
。Animal someAnimal = new Animal(); // 创建一个Animal对象 Dog dog = (Dog) someAnimal; // 尝试向下转型,这里会抛出ClassCastException
-
同一个父类的多个派生类,不允许互相转换
(Dog)s1=(Cat) s2 //不允许