對於這兩個問題,貌似答案都是否認的,事實是怎樣呢???咱們經過代碼實例來驗證一下.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容器管理.