在Java中,在创建类和接口以及处理继承时,是否有明确的规则来确定何时使用每个访问修饰符,即默认的(包私有)、公共的、受保护的和私有的?
当前回答
Java中的访问修饰符。
Java访问修饰符用于在Java中提供访问控制。
1.默认值:
只能访问同一包中的类。
例如
// Saved in file A.java
package pack;
class A{
void msg(){System.out.println("Hello");}
}
// Saved in file B.java
package mypack;
import pack.*;
class B{
public static void main(String args[]){
A obj = new A(); // Compile Time Error
obj.msg(); // Compile Time Error
}
}
这种访问比公共访问受到更多的限制和保护,但比私人访问受到更少的限制。
2.公众
可以从任何地方访问。(全球访问)
例如
// Saved in file A.java
package pack;
public class A{
public void msg(){System.out.println("Hello");}
}
// Saved in file B.java
package mypack;
import pack.*;
class B{
public static void main(String args[]){
A obj = new A();
obj.msg();
}
}
输出:您好
3.私人
只能在同一类中访问。
如果您试图访问另一个类中一个类的私有成员,将引发编译错误。例如
class A{
private int data = 40;
private void msg(){System.out.println("Hello java");}
}
public class Simple{
public static void main(String args[]){
A obj = new A();
System.out.println(obj.data); // Compile Time Error
obj.msg(); // Compile Time Error
}
}
4.受保护
只能访问同一包中的类和子类
例如
// Saved in file A.java
package pack;
public class A{
protected void msg(){System.out.println("Hello");}
}
// Saved in file B.java
package mypack;
import pack.*;
class B extends A{
public static void main(String args[]){
B obj = new B();
obj.msg();
}
}
输出:您好
其他回答
简单的规则。首先声明所有内容都是私有的。然后,随着需求的出现和设计的需要,向公众迈进。
当公开成员时,问问自己是公开表示选择还是抽象选择。第一种是您需要避免的,因为它会引入太多对实际表示的依赖,而不是对其可观察行为的依赖。
作为一般规则,我试图通过子类化来避免重写方法实现;搞砸逻辑太容易了。如果要重写抽象受保护的方法,请声明该方法。
此外,在重写时使用@Override注释,以防止重构时出错。
访问修饰符用于限制多个级别的访问。
公共:它基本上和您可以从任何类访问一样简单,无论它是否在同一个包中。
若要访问同一个包,可以直接访问,但若您在另一个包中,则可以创建类的对象。
默认值:它可以在同一个包中从任何一类包访问。
要访问,可以创建类的对象。但不能在包外访问此变量。
受保护:您可以访问同一包中的变量以及任何其他包中的子类。所以基本上它是默认+继承的行为。
要访问基类中定义的受保护字段,可以创建子类的对象。
私有:可以在同一类中访问。
在非静态方法中,由于该引用(也在构造函数中),您可以直接访问,但要在静态方法中访问,您需要创建类的对象。
区别可以在已经提供的链接中找到,但使用哪一个链接通常取决于“最少知识原则”。只允许所需的最小可见性。
平民的如果用public声明类成员,则可以从任何地方访问它受保护的如果用关键字protected声明类成员,则可以从相同的类成员、同一包内的外部类成员和继承的类成员访问该类成员。如果类成员受到保护,则不能从外部包类访问它,除非外部包类被继承,即扩展其他包超类。但是,受保护的类成员始终可用于相同的包类,无论是否继承了相同的包类别违约在Java中,默认值不是访问修饰符关键字。如果声明的类成员没有任何访问修饰符关键字,那么在这种情况下,它被视为默认成员。默认类成员始终可用于相同的包类成员。但即使外部类是与受保护成员不同的子类,外部包类成员也不能访问默认类成员私有的如果用关键字protected声明了类成员,那么在这种情况下,它只对相同的类成员可用
Java中的访问说明符:java中有4个访问说明符,即private、packageprivate(默认)、protected和public,访问顺序依次递增。
私人:当您正在开发某个类,并且希望该类的成员不暴露在该类之外时,应该将其声明为私有。私有成员只能在定义了它们的类(即封闭类)中访问。私有成员可以在“this”引用上访问,也可以在包含这些成员的类的其他实例上访问,但只能在该类的定义内访问。
包专用(默认):除了下面描述的访问之外,此访问说明符还将提供专用访问说明符指定的访问。
当您开发某个包并因此开发其中的某个类(比如Class1)时,您可以使用默认(无需明确提及)访问说明符,将类中的成员暴露给(同一)包中的其他类。在这些其他类(在同一个包中)中,您可以访问Class1实例上的这些默认成员。此外,您还可以在Class1的子类中访问这些默认成员,例如Class2(在该引用上、Class1的实例上或Class2的实例上)。
基本上,在同一个包中,您可以直接访问类实例上的默认成员,也可以访问子类中的“this”引用。
受保护的:除了下面描述的访问之外,此访问说明符还将提供由包专用访问说明符指定的访问。
当您正在开发某个包,从而在其中开发某个类(例如Class1)时,如果您不希望在包外部(例如在包的消费者的包中,即使用您的API的客户机)访问Class1中的数据成员,则应在Class1中使用受保护的访问说明符,但您希望创建一个例外,并且仅当客户端编写扩展Class1的Class2类时才允许访问该成员。因此,一般来说,受保护的成员可以在派生类(即Class2)中的“this”引用上访问,也可以在Class2的显式实例上访问。
请注意:
您将无法访问中继承的Class1受保护成员如果您试图在Class1的显式实例上访问它,尽管它是遗传的。当您在相同/不同的包中编写另一个类Class3时如果扩展了Class2,则可以访问Class1中的受保护成员该引用以及Class3的显式实例。这将对于任何扩展的层次结构(即受保护的成员)均为true仍然可以在此引用或扩展实例上访问班注意,在Class3中,如果创建Class2的实例但您将无法从Class1访问受保护的成员它是遗传的。
所以,底线是,只有当来自此其他包的某个类、包含此受保护成员的扩展类以及受保护成员在扩展类的定义内通过“this”引用或扩展类的显式实例访问时,才能在其他包中访问受保护成员。
public:除了下面描述的访问之外,此访问说明符还将提供受保护访问说明符指定的访问。
当您正在开发某个包以及其中的某个类(比如Class1)时,如果您希望在其他包的某个类别中创建的Class1实例的其他包中可以访问Class1中的数据成员,则应使用Class1中数据成员的公共访问说明符。基本上,当您打算无条件地向世界公开数据成员时,应该使用此访问说明符。
推荐文章
- 到底是什么导致了堆栈溢出错误?
- 为什么Android工作室说“等待调试器”如果我不调试?
- Java:路径vs文件
- ExecutorService,如何等待所有任务完成
- Maven依赖Servlet 3.0 API?
- 如何在IntelliJ IDEA中添加目录到应用程序运行概要文件中的类路径?
- getter和setter是糟糕的设计吗?相互矛盾的建议
- Android room persistent: AppDatabase_Impl不存在
- Java的String[]在Kotlin中等价于什么?
- Intellij IDEA上的System.out.println()快捷方式
- 使用Spring RestTemplate获取JSON对象列表
- Spring JPA选择特定的列
- URLEncoder不能翻译空格字符
- Java中的super()
- 如何转换JSON字符串映射<字符串,字符串>与杰克逊JSON