java--继承

发布时间:2024年01月12日

继承:

? ?- 作用:代码复用

? ?- 通过extends来实现继承

? ?- 超类/父类:共有的属性和行为

? ? ?派生类/子类:特有的属性和行为

? ?- 派生类既能访问自己的,也能访问超类的,但超类不能访问派生类的

? ?- 一个超类可以有多个派生类

? ? ?一个派生类只能有一个超类-----------单一继承

? ?- 具有传递性

? ?- java规定:构造派生类之前必须先构造超类

? ? ?- 派生类的构造方法中若没有调用超类的构造方法,则默认super()调用超类的无参构造方法
? ? ?- 派生类的构造方法中若自己调用了超类的构造方法,则不再默认提供

? ? ?> super()调用超类构造方法,必须位于派生类构造方法的第一行

? ? ?```java
?

? ?//super的演示
? ? ?public class SuperDemo {
? ? ? ? ?public static void main(String[] args) {
? ? ? ? ? ? ?Boo o = new Boo();
? ? ? ? ?}
? ? ?}
? ? ?class Coo{
? ? ? ? ?Coo(int a){
? ? ? ? ?}
? ? ?}
? ? ?class Doo extends Coo{
? ? ? ? ?Doo(){
? ? ? ? ? ? ?super(5); //调用超类的有参构造
? ? ? ? ?}
? ? ? ? ?/*
? ? ? ? ?//如下代码为默认的:
? ? ? ? ?Doo(){
? ? ? ? ? ? ?super();
? ? ? ? ?}
? ? ? ? ? */
? ? ?}
? ? ?
? ? ?class Aoo{
? ? ? ? ?Aoo(){
? ? ? ? ? ? ?System.out.println("超类构造");
? ? ? ? ?}
? ? ?}
? ? ?class Boo extends Aoo{
? ? ? ? ?Boo(){
? ? ? ? ? ? ?//super(); //默认的,调用超类的无参构造
? ? ? ? ? ? ?System.out.println("派生类构造");
? ? ? ? ?}
? ? ?}

?super:指代当前对象的超类对象

? ?super的用法:

? ?- super.成员变量名----------------------访问超类的成员变量(了解)
? ?- super.方法名()---------------------------调用超类的方法----------明天讲
? ?- super()-------------------------------------调用超类的构造方法

? ?向上造型

? ? ?- 超类型的引用指向了派生类的对象

? ?//向上造型的演示
? ?public class UploadDemo {
? ? ? ?public static void main(String[] args) {
? ? ? ? ? ?Eoo o1 = new Eoo();
? ? ? ? ? ?o1.a = 1;
? ? ? ? ? ?o1.show();
? ? ? ? ? ?//o1.b = 2; ?//编译错误
? ? ? ? ? ?//o1.test(); //编译错误,超类不能访问派生类的
? ?
? ? ? ? ? ?Foo o2 = new Foo();
? ? ? ? ? ?o2.b = 1;
? ? ? ? ? ?o2.test();
? ? ? ? ? ?o2.a = 2; ?//正确
? ? ? ? ? ?o2.show(); //正确,派生类可以访问超类的
? ?
? ? ? ? ? ?Eoo o3 = new Foo(); //向上造型
? ? ? ? ? ?o3.a = 1;
? ? ? ? ? ?o3.show();
? ? ? ? ? ?//o3.b = 2; ?//编译错误
? ? ? ? ? ?//o3.test(); //编译错误,能点出来什么,看引用的类型
? ? ? ?}
? ?}
? ?
? ?class Eoo{
? ? ? ?int a;
? ? ? ?void show(){
? ? ? ?}
? ?}
? ?class Foo extends Eoo{
? ? ? ?int b;
? ? ? ?void test(){
? ? ? ?}
? ?}

总结:??

? ? ? 继承(Inheritance)是面向对象编程中的一个重要概念,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。通过继承,子类可以拥有父类的属性和方法,并且可以在此基础上进行扩展和修改。

? ? ?使用关键字extends来实现继承。子类继承了父类的属性和方法,可以直接使用它们,也可以根据需要添加新的属性和方法。下面是一个简单的代码示例:

// 父类
class Animal {
    public String name;

    public void eat() {
        System.out.println(name + " is eating");
    }
}

// 子类
class Dog extends Animal {
    public void bark() {
        System.out.println(name + " is barking");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.name = "Tom";
        dog.eat(); // 调用父类的方法
        dog.bark(); // 调用子类的方法
    }
}

? ? 在上面的例子中,Animal是一个父类,Dog是一个子类。Dog继承了Animal的属性name和方法eat(),并且还添加了一个新的方法bark()。在Main类中,我们创建了一个Dog对象,并设置了它的名字为"Tom"。然后我们分别调用了父类的方法eat()和子类的方法bark()

? ? ? 继承的好处是代码的重用和扩展性。通过继承,我们可以避免重复编写相同的代码,并且可以在子类中添加新的功能或修改父类的行为。此外,继承还可以通过多态的特性实现更灵活的代码设计。

? ? ?需要注意的是,一个子类只能继承一个父类(单继承),但可以实现多个接口(多实现)。如果一个类已经继承了一个父类,那么它可以通过接口来扩展它的功能。

? ??

当一个类继承另一个类时,子类继承了父类的属性和方法。在继承中,涉及到一些细节,如访问修饰符和构造函数的调用顺序等。

  1. 访问修饰符:访问修饰符用于控制类的成员(属性和方法)对其他类的可见性。常见的访问修饰符有public、private和protected。
  • public:被public修饰的成员可以在任何地方访问,包括子类和其他类。
  • private:被private修饰的成员只能在当前类中访问,子类和其他类无法访问。
  • protected:被protected修饰的成员可以在当前类和其子类中访问,其他类无法访问。
  1. 构造函数的调用顺序:构造函数是用来初始化对象的特殊方法。在继承中,子类会继承父类的构造函数和属性,但是有一些规则需要遵循。
  • 子类构造函数的第一行必须是调用父类的构造函数。可以使用关键字super来调用父类的构造函数。如果子类没有显示地调用父类构造函数,编译器会默认在子类构造函数的第一行插入super()。

  • 如果父类有多个构造函数,子类必须调用其中一个构造函数。

  • 如果子类的构造函数没有显式地调用父类的构造函数,则默认调用父类的无参构造函数。

  • 如果父类没有无参构造函数,子类的构造函数必须显式地调用父类的有参构造函数,否则会编译错误。

? ? 继承涉及到访问修饰符和构造函数的调用顺序时,需要注意以下几点:

  • 子类可以访问父类的public和protected成员。
  • 子类无法访问父类的private成员。
  • 在子类的构造函数中,必须调用父类的构造函数。
  • 如果父类没有无参构造函数,子类必须显式地调用父类的有参构造函数。

? ? ?

文章来源:https://blog.csdn.net/Flying_Fish_roe/article/details/135490178
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。