MST

星途 面试题库

面试题:Java访问控制符在继承体系中的表现及应用场景

在Java的继承体系中,当父类的成员使用不同访问控制符修饰时,子类对这些成员的继承和访问有哪些规则?请举例说明不同访问控制符在实际项目开发中的应用场景,比如private修饰符在封装性上的体现,protected修饰符在继承和扩展中的作用等。
29.4万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

1. 不同访问控制符下子类对父类成员的继承和访问规则

  • private
    • 继承和访问规则:子类无法继承父类中private修饰的成员,在子类中不能直接访问父类的private成员。例如:
class Parent {
    private int privateField = 10;
    private void privateMethod() {
        System.out.println("This is a private method in Parent");
    }
}
class Child extends Parent {
    // 这里不能直接访问privateField和privateMethod
}
  • 应用场景:在实际项目开发中,private修饰符用于实现封装性。例如在一个用户类User中,密码字段password通常会被声明为private,这样外部代码无法直接访问和修改密码,只能通过类内部提供的安全方法(如setPassword方法,在该方法内可以进行密码强度验证等逻辑)来操作,保证了数据的安全性。
class User {
    private String password;
    public void setPassword(String newPassword) {
        // 密码强度验证逻辑
        if (newPassword.length() >= 8) {
            this.password = newPassword;
        } else {
            System.out.println("Password is too short");
        }
    }
}
  • default(默认,无修饰符)
    • 继承和访问规则:子类可以继承父类中默认访问权限的成员,但这些成员只能在同一包内被访问。如果子类和父类在同一包中,子类可以直接访问父类的默认访问权限成员;如果不在同一包中,则无法访问。例如:
package com.example.package1;
class Parent {
    int defaultField = 20;
    void defaultMethod() {
        System.out.println("This is a default method in Parent");
    }
}
package com.example.package1;
class Child extends Parent {
    void accessDefaultMembers() {
        System.out.println("Default field value: " + defaultField);
        defaultMethod();
    }
}
  • 应用场景:在一个项目中,如果某些类只希望在特定的包内使用,且包内的子类需要访问父类的一些通用成员,可以使用默认访问权限。例如在一个小型的工具包项目中,一些基础工具类的成员可能只对同一包内的其他工具类和其子类有用,不需要对外公开,就可以使用默认访问权限。
  • protected
    • 继承和访问规则:子类可以继承父类中protected修饰的成员。无论子类和父类是否在同一包中,子类都可以访问父类的protected成员。例如:
package com.example.package1;
class Parent {
    protected int protectedField = 30;
    protected void protectedMethod() {
        System.out.println("This is a protected method in Parent");
    }
}
package com.example.package2;
class Child extends Parent {
    void accessProtectedMembers() {
        System.out.println("Protected field value: " + protectedField);
        protectedMethod();
    }
}
  • 应用场景:在继承和扩展中,protected修饰符很有用。比如在一个图形绘制库项目中,有一个Shape父类,它有一些protected的方法和字段用于图形的基本属性和操作,如颜色、位置等。子类CircleRectangle等继承自Shape,可以访问这些protected成员并在此基础上进行扩展,实现各自特定的绘制逻辑。
class Shape {
    protected String color;
    protected void setColor(String color) {
        this.color = color;
    }
}
class Circle extends Shape {
    void draw() {
        System.out.println("Drawing a " + color + " circle");
    }
}
  • public
    • 继承和访问规则:子类可以继承父类中public修饰的成员,并且在任何地方(只要能访问到子类对象)都可以访问这些成员。例如:
class Parent {
    public int publicField = 40;
    public void publicMethod() {
        System.out.println("This is a public method in Parent");
    }
}
class Child extends Parent {
    // 子类继承了publicField和publicMethod
}
class Main {
    public static void main(String[] args) {
        Child child = new Child();
        System.out.println("Public field value: " + child.publicField);
        child.publicMethod();
    }
}
  • 应用场景:在实际项目中,public修饰符用于那些需要广泛公开,供外部代码使用的类、方法和字段。比如在一个开发的SDK项目中,对外提供的核心功能接口方法通常会声明为public,方便其他开发者集成使用。例如一个网络请求SDK,其中发起网络请求的方法可能会声明为public,供使用者在不同的应用场景中调用。