java中关于变量定义前面可以有前缀加以修饰,具体包括:private, public, protected.
private修饰的变量只能在其所属的类中被直接访问
class A {
private int a = 1;
public int b = 2;
}
class B extends A {
System.out.println(a); //私有变量,不可以访问
System.out.println(b); //可以访问
}
但是,并不是说不能访问,可以通过间接的方式访问到父类中的私有变量
package Think.Seven;
// 代码来自JAVA编程思想
class Cleanser {
private String s = "Cleanser";
public void append(String a) {s += a; }
public void dilute() {append(" dilute() "); }
public void apply() {append(" apply() "); }
public void scrub() {append(" scrub() "); }
public String toString() {return s; }
public static void main(String[] args) {
Cleanser x = new Cleanser();
x.dilute(); x.apply(); x.scrub();
System.out.println(x); //调用toString()方法
}
}
public class Detergent extends Cleanser {
public void scrub() {
append(" Detergent.scrub() ");
super.scrub(); //调用原来的scrub
}
public void foam() {append(" foam() "); }
public static void main(String[] args) {
Detergent x = new Detergent();
x.dilute();
x.apply();
x.scrub();
x.foam();
System.out.println(x);
System.out.println("Testing base class:");
Cleanser.main(args);
}
}
其输出为:
这里涉及到许多知识点:
首先,JAVA程序运行,在一般会寻找到public类中main函数(所以,一般一个代码中只能有一个public类,且要和文件同名。)main函数新建了一个Detergent类x,一系列操作后,打印x,它会调用该类中的toString()方法。由于父类中的toString方法是public修饰的,故而也被继承来了,因此将变量打印来了。整个过程中,虽然Cleanser中的变量s是私有的,但是依然可以在Detergent被打印。
总结就是:
私有属性在子类中并不是不能访问,只是不能直接访问。
打印类,会调用toString方法。