Java必须掌握的继承的特点和继承体系的设计(含面试大厂题和源码)

Java继承是面向对象编程的一个基本特性,它允许一个类继承另一个类的属性和方法。设计良好的继承体系是高质量软件开发的关键。在大厂面试中,面试官可能会询问关于Java继承特点及如何设计一个合理的继承体系的问题,以评估你的面向对象设计能力和对Java语言特性的理解。以下是关于Java继承特点和继承体系设计的面试题,包含问题描述和解答要点。

Java继承的特点

面试题:描述Java继承的特点,并说明为什么这些特点在软件开发中是有益的。

解答要点

  1. 单继承:Java类只能直接继承一个父类,这简化了继承体系,减少了复杂性,并避免了多继承带来的歧义和复杂性。

  2. 多层继承:虽然Java只支持单继承,但允许多层继承,形成一个继承树。这意味着一个类可以继承另一个类,而那个类又继承自另一个类,依此类推。

  3. 方法重写:子类可以重写继承自父类的方法,提供特定的实现。这是多态性的基础,允许在运行时根据对象的实际类型调用相应的方法。

  4. 访问控制和封装:通过访问修饰符(private、protected和public),类可以控制其成员变量和方法的访问级别,这有助于封装和隐藏实现细节。

  5. 构造器不被继承:子类不能继承父类的构造器,但子类的构造器可以通过super关键字调用父类的构造器,确保父类属性被正确初始化。

  6. 使用final防止继承:使用final关键字可以防止类被继承或方法被重写,这对于创建不可变类或方法是有用的。

继承体系的设计

面试题:设计一个继承体系示例,并解释设计中考虑的面向对象原则。

解答要点

  • 示例设计:设计一个交通工具继承体系。Vehicle作为基类,具有基本属性如speedcapacity,以及方法display()CarTruck继承自Vehicle,添加特有属性和方法,如Car可能有airConditioner属性,而TruckloadCapacity属性。

  • 面向对象原则

    1. 封装:通过将数据(属性)和行为(方法)封装在类中,并使用访问修饰符控制访问级别,保护了对象的状态和实现细节。

    2. 继承:利用继承共享和重用代码,同时通过方法重写实现行为的定制化。

    3. 多态:通过继承和方法重写,同一个方法调用可以表现出不同的行为,具体行为取决于对象的实际类型。

    4. 开闭原则(Open/Closed Principle):系统应该对扩展开放,对修改关闭。在继承体系中,可以通过添加新的子类来扩展系统功能,而不需要修改现有的代码。

    5. 里氏替换原则(Liskov Substitution Principle):子类对象应该能够替换其父类对象被使用,而不影响程序的正确性。这要求子类遵守父类的行为契约。

  • 设计考虑:在设计继承体系时,重要的是识别共同特性和行为,将它们定义在父类中。同时,应该注意避免过度使用继承,因为这可能会导致设计过于复杂,难以维护。组合和接口往往是更灵活、更适合的选择。

通过这些面试题和解答要点,你可以展示你对Java继承特点和设计原则的深入理解,以及你在面向对象设计方面的能力。这些都是大厂面试官在候选人中寻找的关键技能。
题目1:动物类继承体系设计
请设计一个动物类继承体系,包含一个基类Animal,以及两个子类:Dog和Cat。Animal类包含name和age属性,以及一个makeSound方法。Dog和Cat类分别重写makeSound方法,输出对应的叫声。

class Animal {
    protected String name;
    protected int age;
    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public void makeSound() {
        System.out.println("Animal makes a sound");
    }
}
class Dog extends Animal {
    public Dog(String name, int age) {
        super(name, age);
    }
    @Override
    public void makeSound() {
        System.out.println("Dog says: Bow Wow");
    }
}
class Cat extends Animal {
    public Cat(String name, int age) {
        super(name, age);
    }
    @Override
    public void makeSound() {
        System.out.println("Cat says: Meow");
    }
}
public class Main {
    public static void main(String[] args) {
        Animal myAnimal = new Animal("Generic Animal", 1);
        Animal myDog = new Dog("Tommy", 5);
        Animal myCat = new Cat("Kitty", 3);
        myAnimal.makeSound();
        myDog.makeSound();
        myCat.makeSound();
    }
}

题目2:形状类继承体系设计
请设计一个形状类继承体系,包含一个基类Shape,以及三个子类:Circle、Rectangle和Triangle。Shape类包含一个area方法,用于计算面积。Circle、Rectangle和Triangle类分别重写area方法,计算对应形状的面积。

class Shape {
    public double area() {
        return 0;
    }
}
class Circle extends Shape {
    private double radius;
    public Circle(double radius) {
        this.radius = radius;
    }
    @Override
    public double area() {
        return Math.PI * radius * radius;
    }
}
class Rectangle extends Shape {
    private double width;
    private double height;
    public Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }
    @Override
    public double area() {
        return width * height;
    }
}
class Triangle extends Shape {
    private double base;
    private double height;
    public Triangle(double base, double height) {
        this.base = base;
        this.height = height;
    }
    @Override
    public double area() {
        return 0.5 * base * height;
    }
}
public class Main {
    public static void main(String[] args) {
        Shape myCircle = new Circle(5);
        Shape myRectangle = new Rectangle(4, 5);
        Shape myTriangle = new Triangle(3, 4);
        System.out.println("Area of Circle: " + myCircle.area());
        System.out.println("Area of Rectangle: " + myRectangle.area());
        System.out.println("Area of Triangle: " + myTriangle.area());
    }
}

题目3:交通工具类继承体系设计
请设计一个交通工具类继承体系,包含一个基类Vehicle,以及三个子类:Car、Bike和Plane。Vehicle类包含一个move方法,用于描述交通工具的移动方式。Car、Bike和Plane类分别重写move方法,描述对应交通工具的移动方式。

class Vehicle {
    public void move() {
        System.out.println("This vehicle moves on the ground");
    }
}
class Car extends Vehicle {
    @Override
    public void move() {
        System.out.println("Car moves on four wheels");
    }
}
class Bike extends Vehicle {
    @Override
    public void move() {
        System.out.println("Bike moves on two wheels");
    }
}
class Plane extends Vehicle {
    @Override
    public void move() {
        System.out.println("Plane moves in the air");
    }
}
public class Main {
    public static void main(String[] args) {
        Vehicle myCar = new Car();
        Vehicle myBike = new Bike();
        Vehicle myPlane = new Plane();
        myCar.move();
        myBike.move();
        myPlane.move();
    }
}
  • 36
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值