专业的JAVA编程教程与资源

网站首页 > java教程 正文

三十、Java面向对象编程特性-继承

temp10 2024-10-03 01:30:41 java教程 10 ℃ 0 评论

在Java中,继承是面向对象编程的一个重要特性,允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的特性(如属性和方法)。通过继承,子类可以自动获得父类的属性和方法,进一步扩展和定制功能,无需重复编写已有的代码。

定义

继承是指一个类(称为子类、派生类或subclass)可以从另一个类(称为父类、超类、基类或 superclass)获取其属性和方法的过程。子类继承了父类的全部非私有(protectedpublic)字段、方法以及嵌套类。通过这种方式,子类不仅拥有了父类的所有功能,还可以在其基础上添加新的属性和方法,或者覆盖(override)父类的部分功能以实现特有的行为。

三十、Java面向对象编程特性-继承

继承的优点

序号

优点

描述

1

代码重用

继承有助于减少代码重复,提高开发效率,父类的公用代码可以在多个子类中共享。

2

层次结构

继承帮助构建一个类的层次结构,反映现实世界中事物的分类和关系,使代码更具结构性和条理性。

3

可扩展性

子类可以基于父类的功能基础上新增属性和方法,实现功能的扩充和优化,满足不同场景的需求。

4

多态性

继承是实现多态性的基础。通过继承,我们可以创建具有共同接口的多个类,并在运行时根据需要选择使用哪个类。

使用extends关键字实现单继承

在Java中,单继承是指一个类只能直接继承一个父类,这是通过 extends 关键字实现的。Java不支持多重继承,即一个类不能同时继承自多个父类。但是,Java支持接口(Interface)的多重实现,这提供了一种替代多重继承的方式来实现类似的功能。

例如:

// 父类  
class Animal {  
    private String name;  
  
    public Animal(String name) {  
        this.name = name;  
    }  
  
    public void makeSound() {  
        System.out.println("The animal makes a sound");  
    }  
  
    public String getName() {  
        return name;  
    }  
}  
  
// 子类  
class Dog extends Animal {  
    private String breed;  
  
    public Dog(String name, String breed) {  
        super(name); // 调用父类的构造方法  
        this.breed = breed;  
    }  
  
    public void bark() {  
        System.out.println("The dog barks");  
    }  
  
    public String getBreed() {  
        return breed;  
    }  
}  
  
// 使用示例  
public class Main {  
    public static void main(String[] args) {  
        Dog myDog = new Dog("Buddy", "Labrador");  
        myDog.makeSound(); // 继承自Animal的方法  
        myDog.bark(); // Dog特有的方法  
        System.out.println("Dog's name: " + myDog.getName()); // 继承自Animal的属性  
        System.out.println("Dog's breed: " + myDog.getBreed()); // Dog特有的属性  
    }  
}

在上面的代码中,Dog类继承自Animal类。Dog类继承了Animal类的name属性和makeSound()方法,并添加了自己的breed属性和bark()方法。在Main类的main方法中,我们创建了一个Dog对象,并调用了它的方法和属性,包括继承自Animal的方法和属性。

子类继承父类的属性和方法

继承的过程中,子类不仅可以继承父类的非私有属性,还可以继承所有的非私有方法。在上述例子中,`Dog`类获得了`species`属性和`sleep`方法。子类可以直接访问父类的`protected`和`public`级别的成员,但不能直接访问`private`级别的成员。

方法的覆盖(Override)与super关键字的使用

在子类中,有时需要改变从父类继承过来的方法的行为,这时可以使用方法覆盖(Override)。方法覆盖要求子类中重写的方法与父类中的方法具有相同的签名(方法名和参数列表)。

public class Dog extends Animal {
    // ...
    @Override
    public void sleep() {
        System.out.println("Dog is sleeping like a puppy.");
    }
}

`Dog`类现在覆盖了`Animal`类的`sleep`方法,当通过`Dog`对象调用`sleep`方法时,将会执行子类的实现。

子类在覆盖父类方法的同时,还可以通过super关键字调用父类的同名方法:

@Override
public void sleep() {
    super.sleep(); // 调用父类Animal的sleep方法
    System.out.println("Dog is sleeping like a puppy.");
}

子类中覆盖父类方法时的注意点:

序号

注意点

1

方法名、参数列表必须与父类中被覆盖的方法完全相同。

2

返回类型必须与父类中被覆盖的方法的返回类型相同或是其子类型(协变返回类型)。

3

访问权限不能低于父类中被覆盖的方法的访问权限。

注意事项

序号

注意事项

1

构造器不能被继承,但子类可以通过 super 关键字调用父类的构造器。

2

子类可以覆盖(override)父类中的非私有(non-private)方法,提供定制化的实现。

3

子类无法访问父类的私有(private)成员。

4

如果父类中有抽象方法(使用 abstract 关键字声明的方法,没有具体实现),则子类必须实现这些抽象方法,除非子类本身也是抽象类

总结

Java中的继承机制通过extends关键字建立类间的关系,实现代码复用和功能扩展,而方法覆盖则提供了灵活性,允许子类根据需要重定义父类的行为。super关键字则提供了在子类中便捷调用父类方法的能力。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表