在java中,为了使我们的变量或方法公开,我们真的必须这样做吗?例如:
void aaa() {
...
}
Run Code Online (Sandbox Code Playgroud)
要么
public void aaa() {
...
}
Run Code Online (Sandbox Code Playgroud)
如果是必须的,为什么?
class SomeClass1 {
void method1() { }
public void method2() { }
private void method3() { }
protected void method4() { }
}
class DemoClass{
public static void main(String[] parameters) {
SomeClass1 sc = new SomeClass1();
sc.method1();
sc.method2();
sc.method4();
}
}
Run Code Online (Sandbox Code Playgroud)
受保护的方法只能由继承超类的类访问.正如我们在这里看到的,DemoClass不会扩展SomeClass.但是,它能够访问受保护的方法.这怎么可能?
根据第二个文档表(http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html),没有标识符的成员对子类不可见.
但是,当我运行以下示例代码时,会打印"1"(b的内容)!
class Class1{
private int a=0;
int b=1;
protected int c=2;
public int d=3;
}
class Class2 extends Class1{ }
public class HelloWorld{
public static void main(String []args){
Class2 klass=new Class2();
System.out.println(klass.b);
}
}
Run Code Online (Sandbox Code Playgroud)
如果无法从子类访问没有访问修饰符的成员,为什么在此示例中打印它?
它应该抛出一个错误,就像私有访问修饰符一样,不应该吗?
一个类的公共成员如何在java中造成破坏?有人可以用例子解释一下吗?我试图创造这种情况,但不能成功.我只是发现它们等同于'protected'访问修饰符.
受保护是首选但不公开的示例情况是什么?有人可以用例子详细说明吗?我已经看过公共,私人和受保护的聊天(见这里).
Java具有私有,受保护和公共访问修饰符.你能解释一下这些修饰语的可访问性范围吗?
如何在不同的包中访问受保护的成员?
我正在进入java并遇到了这个例子
interface Nose{
public int iMethod();
}
abstract class Picasso implements Nose{
public int iMethod(){
return 7;
}
}
class Clowns extends Picasso{}
class Acts extends Picasso{
public int iMethod(){
return 5;
}
}
Run Code Online (Sandbox Code Playgroud)
因为没有任何内容被声明为public,这是否意味着这些类都不能从另一个文件中调用?我有另一个档案
public class Of76 extends Clowns{
public static void main(String[] args) {
Nose [] i = new Nose[3];
i[0] = new Acts();
i[1] = new Clowns();
i[2] = new Of76();
for(int x = 0; x < 3; x++) {
System.out.println(i[x].iMethod()+" "+i[x].getClass());
}
}
}
Run Code Online (Sandbox Code Playgroud)
因此,在这个示例中,类Of76可以从另一个没有任何公共类的文件中创建类.我很困惑为什么第一个文件可以拥有所有这些类以及为什么它们不在单独的类中.我读到默认情况下非公开的类是私有的,只能在同一个类中调用.那么Nose文件中的所有内容都只能在该Nose文件中调用?
我了解public和private关键字的基本知识(我仍然不确定是什么protected)
我有一个关于“保护数据成员以确保线程安全”的问题。
例如,假设我有一个类MyClass扩展Thread和属于这个类是私人称为数据成员MyDataMember。假设这个数据成员有公共访问器和设置器函数,确保同步数据成员。
现在,从“外部”的角度来看,这一切都很好,因为其他线程只能在正确同步时设置和检索数据成员。但是,怎么样等功能之内 MyClass?假设我在 MyClass调用中还有另一个函数DoSomething。我知道我不应该尝试MyDataMember直接访问,但我可能会不时忘记调用访问器/设置器方法并直接访问/设置数据成员。
我的问题是:是否有一个关键字可以用来声明函数成员对某些数据成员的独占访问?这样,如果我“不小心”从没有独占访问权的方法中直接访问数据成员,则会发生错误。我只是认为这会使开发过程中的事情变得更安全(至少对我而言!)
我正在尝试构建一个Earthquake对象的ArrayList,但Java抱怨不可见.
我的代码:
import java.io.*;
import java.util.Arrays.*;
public class ObservatoryTest {
private ArrayList <Earthquakes> listOfEarthquakes; //This list is not visible
Earthquakes Quake1 = new Earthquakes(4.5,"cheese",1995);
Earthquakes Quake2 = new Earthquakes(6.5,"fish",1945);
Earthquakes Quake3 = new Earthquakes(10.5,"Chorizo",2015);
public void buildList(Earthquakes... args){
for(Earthquakes myEarthquake : args){
listOfEarthquakes.add(myEarthquake);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的目标是建立一个地震对象清单.有人可以告诉我为什么以及如何修复我的代码?谢谢
- - - - - - - 编辑 - - - - - - - - - -
the type ArrayList is not visible然而,错误消息是将可见性修饰符更改为公共没有任何影响.
在使用包访问级别抽象类的非静态方法公开vs使它们受到保护时是否存在任何安全/访问差异?只有扩展抽象类的同一个包中的类才能访问非静态方法吗?那么,这些非静态方法是公共的还是受保护的是否重要,因为抽象类本身会限制谁可以扩展它?
abstract class MyClass {
protected void myFunction(){
System.out.println("Only child classes can print this");
}
}
abstract class MyClass {
public void myFunction(){
System.out.println("Still, only child classes can print this");
}
}
Run Code Online (Sandbox Code Playgroud)