MST

星途 面试题库

面试题:Java类中成员变量与方法的作用域及初始化顺序

在Java类中,成员变量有哪些作用域修饰符?它们的区别是什么?成员变量和局部变量在初始化顺序上有什么不同?请举例说明。
27.0万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

成员变量的作用域修饰符及区别

  1. public
    • 作用域:对所有类可见。即任何其他类,无论在同一个包中还是在不同的包中,都可以访问被public修饰的成员变量。
    • 示例:
public class PublicClass {
    public int publicVariable;
}

在其他类中可以这样访问:

public class AnotherClass {
    public static void main(String[] args) {
        PublicClass pc = new PublicClass();
        pc.publicVariable = 10;
    }
}
  1. 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();
    }
}
  1. 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;
    }
}
  1. 默认(不写修饰符)
    • 作用域:对同一个包中的类可见,也称为包访问权限。不同包中的类,即使是子类也无法访问。
    • 示例:
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;
    }
}

成员变量和局部变量初始化顺序

  1. 成员变量:在类实例化(创建对象)时初始化。如果没有显式初始化,会有默认值。例如,int类型默认值是0boolean类型默认值是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();
    }
}
  1. 局部变量:在声明它的代码块被执行时初始化,并且必须显式初始化后才能使用,否则会编译错误。
    • 示例:
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();
    }
}