上一篇地址:整理好了!2024年最常见 100 道 Java基础面试题(二)-优快云博客
五、Java 中访问修饰符public, private, protected, 默认的区别?
这些访问修饰符控制了类成员(变量和方法)的可见性和访问级别。
-
public:
public
是最宽松的访问修饰符,它允许在任何其他类或包中访问被public
修饰的类或成员。- 任何其他类都能访问
public
类或成员,不论它们定义在同一个包还是不同的包中。
-
private:
private
是最严格的访问修饰符,它只允许同一个类内部访问被private
修饰的成员。private
成员在类的外部是不可见的,即使是同一个包中的其他类也无法访问。
-
protected:
protected
允许同一个包内的其他类以及不同包中继承了当前类的子类来访问被protected
修饰的成员。- 与
private
相比,protected
还允许子类访问,但与public
相比,它不是完全开放的,因为不同包中非子类无法访问。
-
默认(无修饰符):
- 当没有指定访问修饰符时,类成员具有默认的访问级别,通常称为“包访问级别”。
- 默认访问级别的成员只能被同一个包内的其他类访问,不同包中的类,即使它们是子类,也无法访问。
访问级别总结:
- public:无限制访问。
- private:仅限同一类内部访问。
- protected:同一包内的类和不同包中的子类可以访问。
- 默认(无修饰符):同一包内的类可以访问。
在设计类时,选择适当的访问修饰符是非常重要的,它有助于封装和隐藏类的内部实现细节,同时提供适当的接口供外部使用。通常,将类成员设置为尽可能严格的访问级别是一种良好的编程实践,以提高代码的安全性和可维护性。
六、this 和 super 关键字有什么区别?
这两个关键字在面向对象编程中扮演着重要的角色,它们都与对象的方法调用有关,但使用场景和含义不同。
-
this
关键字:this
是一个指向当前对象的引用,也就是调用方法的那个对象的引用。- 它可以用来区分成员变量和局部变量,尤其是当它们的名称相同时。
this
也可以用在构造函数中,来调用另一个重载的构造函数,例如:this(param1, param2);
。- 还可以用在返回对象实例的方法中,来返回当前对象的引用。
-
super
关键字:super
是一个指向当前对象的父类对象的引用,也就是指向当前对象的直接父类的实例。- 它主要用于子类中,用来访问父类的成员,特别是当子类重写了父类的方法或变量时。
super
也可以用于调用父类中定义的方法或构造函数,当子类重写了这些方法或构造函数时,仍然可以通过super
来调用父类版本的方法或构造函数。- 在静态上下文中,
super
是不能使用的,因为它是与实例相关的。
使用场景示例:
public class Parent {
void show() {
System.out.println("Parent's show()");
}
}
public class Child extends Parent {
int i;
public Child(int i) {
// 使用this来区分成员变量i和构造函数参数i
this.i = i;
}
void show() {
// 使用super调用父类的show()方法
super.show();
System.out.println("Child's show()");
}
}
public class Test {
public static void main(String[] args) {
Child myChild = new Child(10);
myChild.show(); // 输出 Parent's show(); Child's show();
}
}
在这个例子中,this
被用来区分构造函数参数和成员变量,而 super
被用来调用父类 Parent
中的 show()
方法。
总结来说,this
代表当前对象的引用,通常用于区分成员变量和局部变量的名称冲突,或者在构造函数中调用另一个构造函数。而 super
代表当前对象的父类对象的引用,通常用于访问父类的成员,或者在子类中调用父类的方法和构造函数。