天天看點

繼承中構造方法的通路特點 -代碼優化和記憶體圖解-代碼塊

作者:小謝吖

十:繼承中構造方法的通路特點

1.1 問題提問

1 繼承中構造方法的通路特點有哪些

2 super()的如何使用

3 一個類如果沒有顯示的繼承一個類預設是什麼           

1.2 視訊時長

13分41秒           

1.3 問題答案

1 繼承中構造方法的通路特點有哪些
子類的構造方法都會預設通路父類的無參構造方法
子類在初始化的時候有可能會使用到父類中的資料,如果父類沒有完成初始化子類将無法使用

2 super()的如何使用
通過構造super(...)通路父類的構造方法完成父類成員的初始化

3 一個類如果沒有顯示的繼承一個類預設是什麼
Object類是所有類直接或者間接父類
如果編寫的類沒有指定父類那系統會預設繼承Object類
也就是說Object類的所有能被繼承的屬性和方法在其他類中都會有一份
這也就是我寫一個類沒有寫任何方法但是我建立對象之後,通過對象就有能調用的方法           

十一:父類沒有空參數構造方法

super用法詳細
super的用法:
1第一個用法 super.
class Super{
int a=10;
public void print1(){
System.out.println("fu");
}
}
class Sub extends Super{
int a=50;
public void print(){
int a=40;
System.out.println(a); // 40
System.out.println(this.a); //50
System.out.println(super.a); //10
print1(); // zi
super.print1(); //fu
}

public void print1(){
System.out.println("zi");
}
}

2 第二個用法 super()
public class Test {
public static void main(String[] args) {
new Dog(); // 1 列印結果是 Animal() Dog() 預設行為 當建立子類 //對象的時候 首先要初始化父類 調用父類的構造方法
new Dog("abc");//2 列印結果是 Animal() Dog(String)
}
}
class Animal {
public Animal(){
System.out.println("Animal()");
}
public Animal(String str){ //3 我這個有參數的構造方法什麼時候能用
System.out.println("Animal(String)");
}
}
class Dog extends Animal{
public Dog() {
//super("abc");
//4 和this相似 用愛構造方法中 用來指定調用父類的哪個構造方法
// 預設是super() 調用父類無參的構造方法 預設寫在構造方法第一行
System.out.println("Dog()");
}
public Dog(String str){
System.out.println("Dog(String)");
}
}

總結:構造方法的第一句話有三種情況 this() super()或者是一個其他的語句
是以如果一個構造方法中的第一個語句不是this 也不是super 系統會預設添加 super() 無參。預設調用父類的無參構造方法

通過super給父類屬性指派
public class Test {
public static void main(String[] args) {
new Dog("大黃"); //1 調用子類的有參構造方法
}
}
class Animal {
private String name; //子類如何給這個父類的私有屬性指派,
public Animal(){
System.out.println("Animal()");
}
public Animal(String str){
System.out.println("Animal(String)");
name=str; //3 給父類的私有屬性指派
}
}
class Dog extends Animal{
public Dog() {
System.out.println("Dog()");
}
public Dog(String str){
super(str); // 2 初始化父類 調用父類的有參構造
System.out.println("Dog(String)");
}
}

例子:猜對錯
class Super{
public Super(String str){}
}
class Sub extends Super{

}



這個例子是錯誤的雖然看上去沒有啥毛病 但是類中是有好多系統幫你添加的代碼是你看不見的
class Super{
public Super(String str){}
}
class Sub extends Super{

}
/*public Sub(){
super();
}
*/
//子類sub中預設有一個無參構造方法方法的第一句話是一個super() 預設調用的是父類的無參構造而父類有一個有參構造
//系統不會預設添加無參數的構造方法 這個super() 找不到父類的無參構造方法 是以報錯

是以super 常常用來把構造參數傳給父類 去設定父類的屬性
總結**
super的作用
1 引用: 父類對象 在子類中通路父類被子類遮蓋的屬性或者被覆寫重寫的方法
2 在子類構造方法中指定調用父類的哪一個構造方法

超類,基類 點選菜單Navigate,然後選擇“Type Hierarchy”,或者直接使用快捷 鍵“F4”更為友善 ctrl+h
1 如果沒顯示的聲明一個類的父類,則此類預設繼承java.lang.Object類
2 所有的java類除了(Object)都直接或者間接的繼承自java.lang.Object類
3 所有的java的類都具有java.lang.Object類中聲明的功能           

十二.代碼優化和記憶體圖解

子類繼承自父類的成員屬性指派的時候
通過子類有參構造方法把參數通過super(參數表)傳遞給父類進行初始化
本類的自己初始化
1 子類中所有的構造方法都會通過super()通路父類中的無參數構造方法
2 每個子類的構造方法預設第一句都是super();
3 this()/super() 都必須放在構造方法的第一句并且二者不能共存


子類是可以繼承到父類的私有的屬性和方法的           
繼承中構造方法的通路特點 -代碼優化和記憶體圖解-代碼塊

十三:代碼塊

1.1 問題提問

1 什麼是普通代碼塊有什麼作用

2 什麼是靜态代碼塊有什麼作用           

1.2 視訊時長

12分01秒           

1.3 問題答案

1 什麼是普通代碼塊有什麼作用
>局部代碼塊
位置: 定義在方法中
作用: 限定變量的聲明周期,及早釋放,提高記憶體的使用率
>構造代碼塊:
位置: 定義在類中方法外
特點: 每次構造方法執行時,都會執行該代碼塊中的代碼 并且在構造方法執行之前執行.
作用: 将多個構造方法中相同的代碼,抽取到構造代碼塊中,提高代碼的複用性

2 什麼是靜态代碼塊有什麼作用
位置: 類中方法外
特點: 通過static關鍵字修飾,随着類的加載而加載 并且隻執行一次
作用: 在類加載的時候做一些資料初始化的操作           

1.4 問題補充

public class demo {
public static void main(String[] args) {
Zi z = new Zi("光頭哥", 26);
/*
我是父類中的靜态代碼塊
我是子類靜态代碼塊
我是父類中的成員代碼塊
我是父類中的無參構造方法
我是子類構造代碼塊
我是子類構造方法
光頭哥 26
*/
//1, 因為new用到了Zi.class,并且子類繼承了父類。是以會先找到 //Fu.class,再找到Zi.class檔案并加載到記憶體中
//2, 執行父類靜态代碼塊
//3, 執行子類靜态代碼塊
//4, 在堆記憶體中開辟空間,配置設定記憶體位址 對父類屬性 預設初始化/顯式初始化
//5, 執行父類的構造代碼塊
//6, 執行父類的無參構造方法 ---父類執行完畢
//7, 在堆記憶體中建立對象的特有屬性,并進行子類對象的預設初始化
//8, 對子類對象的屬性顯式初始化
//9, 執行子類構造代碼塊
//10,執行子類構造方法
//11, 将記憶體位址指派給棧記憶體中的z變量
}
}
class Fu{
//成員屬性
String name = "李四";
int age = 6;
//成員方法
public void method(){
System.out.println("我是父類的普通成員方法");
}
//靜态方法
public static void staticFu(){
System.out.println("我是父類中的靜态成員方法");
}
//靜态代碼塊
static {
System.out.println("我是父類中的靜态代碼塊");
}
//構造代碼塊
{
System.out.println("我是父類中的構造代碼塊");
}
//構造方法
public Fu() {
System.out.println("我是父類中的無參構造方法");
}
}
class Zi extends Fu{
//成員屬性
String address="北京";
//成員方法
public void method2(){
System.out.println("我是子類中的普通成員方法");
}
//靜态方法
public static void staticZi(){
System.out.println("我是子類中的靜态方法");
}
//靜态代碼塊
static {
System.out.println("我是子類靜态代碼塊");
}
//構造代碼塊
{
System.out.println("我是子類構造代碼塊");
}

public Zi(String name, int age) {
this.name = name;
this.age = age;
System.out.println("我是子類構造方法");
System.out.println(name + " " + age);
}
}