先从java中说起
首先 B 继承自 A,那么 A 中的所有东西,B 都会继承到。但B能不能访问,就是另一回事了。
有点拗口,看图和例子
第一条指的是:继承是全部继承了,但能不能用是另一回事
第二条指的是:没看懂
(protected,指在:如B继承了A,则B中可以访问到A的protected,但B的对象b,则访问不到)
例子
先看目录结构
A | B | C |
---|---|---|
父类 | 子类 | 用来测试的 |
A:
package day5;
public class A {
protected int a = 1;
private int b = 2;
int c = 3;
public void say() {
System.out.println(b);
}
}
B:
package day5;
public class B extends A {
public void doo() {
System.out.println("B");
}
}
C1:
package day5;
public class C1 {
public static void main(String[] args) {
A a = new A();
A a1 = new B();
B b = new B();
System.out.println(a.a); // protected
System.out.println(a.c); // default
a1.say(); // public 证明 B 是把所有东西都继承了
System.out.println(b.a); // protected
System.out.println(b.c); // default
}
}
C2:与A、B不在同一个包中
package day6;
import day5.A;
import day5.B;
public class C2 {
public static void main(String[] args) {
A a = new A();
A a1 = new B();
B b = new B();
}
}
- 只能访问 A 中public
另外,如何通过反射得到B的父类的成员
import java.lang.reflect.Field;
import t2.A;
import t2.B;
public class C2 {
public static void main(String[] args) {
// 这样得不到
Class clazz = B.class;
for (Field field : clazz.getDeclaredFields()) {
System.out.println(field.getName());
}
System.out.println("--------------------");
// 使用B.class.getSuperclass();
Class clazz2 = B.class.getSuperclass();
for (Field field : clazz2.getDeclaredFields()) {
System.out.println(field.getName());
}
}
}
再来说说python的
Python并没有对私有成员提供严格的访问保护机制。
私有 | 公有 |
---|---|
以两个或多个下划线开头‘__’,并不以两个或多个下划线结束 | 无 |
在类外不能被直接访问,需要以 object._classname__varname 的形式来访问,或者像 Java中的get、set方法一样访问 | 可直接访问 |
class Demo:
def __init__(self, t1, t2, t3):
self.t1 = t1 # 公有实例变量
self._t2 = t2 # 公有实例变量
self.__t3 = t3 # 私有实例变量
d = Demo('a', 'b', 'c')
print(d.t1)
print(d._t2)
print(d._Demo__t3)