对于这两个问题,貌似答案都是否认的,事实是怎样呢???咱们经过代码实例来验证一下.java
为验证这个问题,咱们定义三个类:Test1,Test2,Test3app
其中Test1有两个私有成员变量,Test2和Test3没有成员变量,可是Test2继承Test1ide
咱们只有验证一下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因为没有成员变量因此大小最小this
稍微解释一下:spa
子类继承父类,子类拥有了父类的全部属性和方法。code
可是父类的私有属性和方法子类是没法直接访问的。固然私有属性能够经过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容器管理.