Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA-初学者-可以在类之外访问私有类属性吗?_Java_Private Class - Fatal编程技术网

JAVA-初学者-可以在类之外访问私有类属性吗?

JAVA-初学者-可以在类之外访问私有类属性吗?,java,private-class,Java,Private Class,我对Java OO编程比较陌生,并且已经回顾了类似的问题,尽管它们似乎没有直接回答我的问题 基本上,我理解如果一个类中的数据成员被声明为private,那么它只能从同一个类中访问 我的讲师总是建议所有属性都应该声明为私有-这是为什么 现在我熟悉了GET方法的使用,我的问题是,私有属性可以通过调用另一个类的公共“GET”方法(返回前面提到的属性)在它自己的类之外访问吗? 例如: public class Class() { private int number = 0; pub

我对Java OO编程比较陌生,并且已经回顾了类似的问题,尽管它们似乎没有直接回答我的问题

基本上,我理解如果一个类中的数据成员被声明为private,那么它只能从同一个类中访问

我的讲师总是建议所有属性都应该声明为私有-这是为什么

现在我熟悉了GET方法的使用,我的问题是,私有属性可以通过调用另一个类的公共“GET”方法(返回前面提到的属性)在它自己的类之外访问吗?

例如:

public class Class()
{

    private int number = 0;

    public Class()
    {
    }

    public int getNumber()
    {
        return number;
    }

}
然后从另一个班级:

public class Class2()
{

    Class class = new Class();

    public void showNumber()
    {
        System.out.print(class.getNumber());
    }
}
第二段代码是否允许类2中的showInt()中的方法实际访问类中的private属性

我想我真的很难决定是否应该将任何属性或方法声明为publicprivate

有什么特别的经验法则应该遵循吗

感谢响应者提供的任何帮助


亲切问候

是的,如果您使用公共访问器,您可以访问私有字段

关键是要隐藏实现,以便作为实现者,您以后可以决定使用另一种类型的字段(或间接,或动态计算),而不必强制类的用户更改其代码

它还允许您提供一个getter,而不提供任何setter(这样您的字段就只能从类外读取)

许多东西无法在代码中编译:

  • 添加括号以调用方法(getInt)
  • 类是一个保留字
  • 类不能被称为类,也不能像您那样声明
我建议您在提问之前在编辑器(例如Eclipse)中编写一段编译代码。这项任务可能会帮助您了解至少部分问题

我的讲师总是建议所有属性都应该声明为私有

好主意。这条规则也有例外,但我想从这个开始

我理解,如果类中的数据成员被声明为private,那么它只能从同一个类中访问

它是可接近的

  • 在同一文件中嵌套类
  • 通过反射进行访问
第二段代码是否允许类2中showInt()中的方法实际访问类中的private属性

在这种情况下,事实上是的。通过使用getter,字段可以更改名称,被常量或计算替换,或者被记录下来,Class2不需要知道。

但是,您必须调用该方法(并且不能将
class
用作类名):

发生的情况是,您没有访问私有成员,但收到了该值的副本。在本例中,您访问的是方法getInt(),而不是属性。如果要尝试访问该属性,请执行以下操作:

public class Class2()
{

    Class myClass = new Class();

    public void showInt()
    {
        System.out.print(myClass.x);
    }
}
您将无权访问。

简短回答:否

将所有内容私有化的一般原因是确保类的用户不能以他们不应该的方式修改内容

您可以做的是定义getter和setter方法。一般来说,最好只暴露getter,例如

private int foo;

public int getFoo(){
  return foo;
}

通过这种方式,人们可以看到
foo
,但不能更改它。

关键点是,公共
get
方法只返回私有成员的当前值,而不允许访问成员本身。这意味着您无法以某种方式“获取”成员并更改其值。

请永远不要命名类
:)我理解-这只是一个示例,用于演示目的。无论何时调用方法,请使用所需参数插入括号。.两个旁注:
类类=新类()
不会编译,因为
是保留关键字<代码>私有int x;public int getInt(){}不遵守约定。当你实现一个getter时,你应该把它叫做get+大写的属性名,例如:
getX(){}
。谢谢-我会纠正这个关于Java命名约定的错误。好的,谢谢,我发布的代码是“反射”的示例吗?@AlexM否。你的示例中没有使用任何反射。@AlexM。。。或嵌套类。afaik反射不能用于更改私有成员,但我可能错了。它可以。您首先调用setAccessible(true)。哦,这更有意义!!谢谢你,先生,我只是需要有人帮我这么说。当做
private int foo;

public int getFoo(){
  return foo;
}