- private属性能否被继承?
- 抽象类能否被初始化?
对于这两个问题,貌似答案都是否定的,事实是怎样呢???我们通过代码实例来验证一下.
private属性能否被继承
为验证这个问题,我们定义三个类:Test1,Test2,Test3
其中Test1有两个私有成员变量,Test2和Test3没有成员变量,但是Test2继承Test1
我们只有验证一下Test1,Test2,Test3的对象大小就可以判断私有成员变量是否能继承
public class TestSize {
public static void main(String[] args) {
System.out.println("Test1 size:" + RamUsageEstimator.sizeOf(new Test1()));
System.out.println("Test2 size:" + RamUsageEstimator.sizeOf(new Test2()));
System.out.println("Test3 size:" + RamUsageEstimator.sizeOf(new Test3()));
}
}
class Test1 {
private int param = 1;
private String param1 = "1";
}
class Test2 extends Test1 {
}
class Test3 {
}
输出结果:
Test1 size:72
Test2 size:72
Test3 size:16
从输出结果可以看到,Test2和Test1的对象大小是一样的.Test3由于没有成员变量所以大小最小
稍微解释一下:
-
子类继承父类,子类拥有了父类的所有属性和方法。
-
但是父类的私有属性和方法子类是无法直接访问的。当然私有属性可以通过public修饰的getter和setter方法访问到的,但是私有方法不行。
所以:子类继承了父类的所有属性和方法或子类拥有父类的所有属性和方法是对的,只不过父类的私有属性和方法,子类是无法直接访问到的。即只是拥有,但是无法使用。由于private访问权限的控制.
抽象类能否被初始化
定义一个抽象类
public abstract class AbstractService implements TestService {
@Autowired
private UserService userService;
@Override
public String testAbstract() {
userService.testUserService();
System.out.println("testAbstract");
return "testAbstract";
}
// /**
// * 也可以通过构造函数注入
// * @param userService
// */
// public AbstractService(UserService userService) {
// this.userService = userService;
// }
}
两个子类
@Service
public class MyService1 extends AbstractService {
}
@Service
public class MyService2 extends AbstractService {
}
调用
@GetMapping("/testAbstract")
public Object testAbstract() {
return myService1.testAbstract();
}
程序会不会报错???如果抽象类不能实例化的话,就是 AbstractService 不会被Spring容器管理,那么 AbstractService 里面的 testAbstract 方法用到的 userService 是不是为 null ??
答案是不会报错,程序正常运行.
为什么呢??
因为 AbstractService 的两个子类在被 Spring 实例化的时候,会被注入 userService ,就是说子类已经有了 userService 这个Bean.
像第一个案例分析的一样.
子类继承了父类的所有属性和方法或子类拥有父类的所有属性和方法,只不过父类的私有属性和方法,子类是无法直接访问到的。即只是拥有,但是无法使用。由于private访问权限的控制.
还有一个是 AbstractService 不会被Spring容器管理.