面试题答案
一键面试成员变量的作用域修饰符及区别
public
- 作用域:对所有类可见。即任何其他类,无论在同一个包中还是在不同的包中,都可以访问被
public
修饰的成员变量。 - 示例:
- 作用域:对所有类可见。即任何其他类,无论在同一个包中还是在不同的包中,都可以访问被
public class PublicClass {
public int publicVariable;
}
在其他类中可以这样访问:
public class AnotherClass {
public static void main(String[] args) {
PublicClass pc = new PublicClass();
pc.publicVariable = 10;
}
}
private
- 作用域:仅对本类可见。只有在定义该成员变量的类内部才能访问它,其他类无法直接访问。
- 示例:
public class PrivateClass {
private int privateVariable;
public void setPrivateVariable(int value) {
this.privateVariable = value;
}
public int getPrivateVariable() {
return this.privateVariable;
}
}
在其他类中不能直接访问privateVariable
,只能通过PrivateClass
提供的public
方法来间接访问:
public class AnotherClass {
public static void main(String[] args) {
PrivateClass pc = new PrivateClass();
pc.setPrivateVariable(10);
int value = pc.getPrivateVariable();
}
}
protected
- 作用域:对本类、同一个包中的类以及不同包中的子类可见。
- 示例:
package com.example;
public class ProtectedClass {
protected int protectedVariable;
}
在同一个包中的类可以直接访问:
package com.example;
public class SamePackageClass {
public static void main(String[] args) {
ProtectedClass pc = new ProtectedClass();
pc.protectedVariable = 10;
}
}
不同包中的子类也可以访问:
package com.other;
import com.example.ProtectedClass;
public class SubClass extends ProtectedClass {
public void accessProtectedVariable() {
this.protectedVariable = 20;
}
}
- 默认(不写修饰符)
- 作用域:对同一个包中的类可见,也称为包访问权限。不同包中的类,即使是子类也无法访问。
- 示例:
package com.example;
class DefaultClass {
int defaultVariable;
}
在同一个包中的类可以访问:
package com.example;
public class AnotherSamePackageClass {
public static void main(String[] args) {
DefaultClass dc = new DefaultClass();
dc.defaultVariable = 10;
}
}
成员变量和局部变量初始化顺序
- 成员变量:在类实例化(创建对象)时初始化。如果没有显式初始化,会有默认值。例如,
int
类型默认值是0
,boolean
类型默认值是false
,引用类型默认值是null
等。- 示例:
public class MemberVariableExample {
int memberInt; // 未显式初始化,默认值为0
String memberString; // 未显式初始化,默认值为null
public MemberVariableExample() {
System.out.println("memberInt: " + memberInt);
System.out.println("memberString: " + memberString);
}
public static void main(String[] args) {
new MemberVariableExample();
}
}
- 局部变量:在声明它的代码块被执行时初始化,并且必须显式初始化后才能使用,否则会编译错误。
- 示例:
public class LocalVariableExample {
public void printLocalVariable() {
int localInt; // 声明局部变量
// System.out.println(localInt); // 这里会编译错误,因为localInt未初始化
localInt = 10; // 显式初始化
System.out.println("localInt: " + localInt);
}
public static void main(String[] args) {
LocalVariableExample lve = new LocalVariableExample();
lve.printLocalVariable();
}
}