编写以下代码时,编译器如何不抱怨?
public class MyClass
{
private int count;
public MyClass(int x){
this.count=x;
}
public void testPrivate(MyClass o){
System.out.println(o.count);
}
}
Run Code Online (Sandbox Code Playgroud)
即使它是testPrivate写入的同一个类的实例,它不应该给出编译错误System.out.println(o.count)吗?毕竟,我试图直接访问私有变量.
代码甚至运行良好.
所以前几天我正在创建一个类,当我意识到它生成了以下工作代码时,使用Eclipse的方法创建了equals方法:
class Test {
private int privateInt;
[...]
public boolean equals(Object obj) {
[...]
Test t = (Test) obj;
if ( t.privateInt == privateInt ) {
[...]
}
}
Run Code Online (Sandbox Code Playgroud)
t.privateInt .. ???? 它假设是私人的!所以我想除了私有,受保护,包保护和公共之外还有一个字段可见性.
那么这里发生了什么?怎么称呼?有人会用这个吗?这不会破坏封装吗?如果班级没有改变者并且我改变了这个怎么办?这也发生在C++上吗?这是一个OO成语吗?如果没有,那为什么Java会这样做呢?
一般来说,我在哪里可以找到有关此信息?
谢谢.
对于我在大学的学习,我不得不做一些丑陋的java基础知识,比如没有封装的工作,同一类的主要方法等等.(我不想在java风格指南上开一个讨论,我只想澄清一下,我不会在大学之外写这样的东西)
我偶然发现了一个我无法向自己解释的行为:
public class Person {
// fields
private int age;
public static void main(String[] args) {
Person foo1 = new Person();
foo1.age = 40;
System.out.println(foo1.age);
}
}
Run Code Online (Sandbox Code Playgroud)
为什么这段代码编译运行没有错误?我怎么可能访问私人领域?由于主要方法在同一个类中而导致奇怪的行为?
我不明白为什么我可以访问private int i课堂外的私人课程.
public class Fish {
private int i = 1;
public static void main(String[] args) {
Fish k = new Fish();
k.i = 2; // it IS possible
}
}
Run Code Online (Sandbox Code Playgroud)