java继承circle类_java的继承
我總是記不住繼承是怎么個(gè)機(jī)制,今天我來(lái)徹底的總結(jié)一下。
先了解一下初始化的順序
當(dāng)程序執(zhí)行時(shí),需要生成某個(gè)類的對(duì)象,java執(zhí)行引擎會(huì)先檢查是否加載了這個(gè)類,如果沒有加載,則先執(zhí)行類的加載再生成對(duì)象,如果已經(jīng)加載,則直接生成對(duì)象。
類加載的過(guò)程中,類的static成員變量會(huì)被初始化,類的static語(yǔ)句塊會(huì)被執(zhí)行。
java中類是按需加載,只有當(dāng)用到這個(gè)類的時(shí)候才會(huì)加載這個(gè)類,并且只會(huì)加載一次
看看這個(gè)例子
public classT{public static voidmain(String[] args){
Shape shape1= newShape();
Shape shape2= newShape();
}
}classShape{static{
System.out.println("static is cout");
}publicShape(){
System.out.println("shape is cout");
}
}
會(huì)輸出什么?
staticis cout
shape is cout
shape is cout
View Code
解釋:在類加載時(shí)會(huì)執(zhí)行static塊,而且只執(zhí)行一次。創(chuàng)建了兩個(gè)Shape實(shí)例,所以shape的構(gòu)造器被調(diào)用兩次
再來(lái)看看
在生成對(duì)象的過(guò)程中,會(huì)先初始化對(duì)象的成員變量,然后再執(zhí)行構(gòu)造器。
public classT{public static voidmain(String[] args){newCircle();
}
}classShape{publicShape(){
System.out.println("shape is cout");
}
}classCircle{publicCircle(){
System.out.println("circle is cout");
}
Shape shape=newShape();
}
結(jié)果:
shape is cout
circle is cout
View Code
上面標(biāo)記的字體已經(jīng)解釋清楚了,這里并沒有用繼承,想想circle繼承shape會(huì)有什么不一樣呢。
(偷偷的告訴你,會(huì)輸出 shape is cout \n ?shape is cout \n ? circle is cout \n;因?yàn)闃?gòu)造circle前先構(gòu)造Shape,輸出第一句。然后初始化shape對(duì)象,調(diào)用Shape,輸出第二句話。然后調(diào)用Circle的構(gòu)造函數(shù))
為了看是否真的清楚了,我出一個(gè)題目
public classT{public static voidmain(String[] args){newCircle();
}
}classRudio{publicRudio(String type){
System.out.println(type+" Rudio is cout");
}
}classShape{private Rudio r=new Rudio("shape");publicShape(){
System.out.println("shape is cout");
}
}class Circle extendsShape{publicCircle(){
System.out.println("circle is cout");
}private Rudio r=new Rudio("circle");
}
shape Rudio is cout
shape is cout
circle Rudio is cout
circle is cout
View Code
如果不能看懂,說(shuō)明還要琢磨琢磨
再來(lái)看看下面這個(gè)例子
public classTest{public static voidmain(String[] args){
Shape shape=newCircle();
System.out.println(shape.name);
System.out.println(shape.age);
shape.printType();
shape.printName();
}
}classShape{public String name="shape";public static int age=10;publicShape(){
System.out.println("shape 的構(gòu)造器");
}public voidprintType(){
System.out.println("this type shape");
}public static voidprintName(){
System.out.println("this name shape");
}
}class Circle extendsShape{public String name="Circle";public static int age=18;publicCircle(){
System.out.println("Circle 的構(gòu)造器");
}public voidprintType(){
System.out.println("this type Circle");
}public static voidprintName(){
System.out.println("this name Circle");
}
}
想想結(jié)果是什么?
shape的構(gòu)造器
Circle的構(gòu)造器
shape10
thistype Circlethis name shape
View Code
解釋一下:
創(chuàng)建了一個(gè)父類類型的子類實(shí)例,因此,shape中的變量是Shape中的變量。如果子類覆蓋了父類的方法,調(diào)用子類的方法。如果父類某個(gè)方法加了static,final關(guān)鍵字,那么父類的該方法對(duì)子類隱藏,即使子類有同名方法,那依然是子類自己的方法,與父類無(wú)關(guān)。
先調(diào)用shape的構(gòu)造器和Circle的構(gòu)造器沒什么疑問(wèn),然后輸出shape和10,告訴我們shape的成員是從Shape獲得。由于子類覆蓋了父類的printType方法,因此調(diào)用該方法輸出的是this type Circle。由于printName方法使用了static變量,對(duì)子類隱藏了,所以輸出this name shape
其實(shí)這總結(jié)出來(lái)三句話
1、父類的構(gòu)造器調(diào)用以及初始化過(guò)程一定在子類的前面
2、類中的變量會(huì)在任何方法調(diào)用之前得到初始化
3、子類覆蓋父類,會(huì)調(diào)用子類的方法;父類成員和方法如果是static,final的會(huì)隱藏子類的同名成員和方法
再來(lái)看看這個(gè)
public classT{public static voidmain(String[] args){
Circle circle=newCircle();
System.out.println(circle.name);
System.out.println(circle.age);
circle.printType();
circle.printName();
}
}classShape{public String name="shape";public static int age=10;publicShape(){
System.out.println("shape 的構(gòu)造器");
}public voidprintType(){
System.out.println("this type shape");
}public static voidprintName(){
System.out.println("this name shape");
}
}class Circle extendsShape{public String name="Circle";public static int age=18;publicCircle(){
System.out.println("Circle 的構(gòu)造器");
}public voidprintType(){
System.out.println("this type Circle");
}public static voidprintName(){
System.out.println("this name Circle");
}
}
想想運(yùn)行結(jié)果
shape的構(gòu)造器
Circle的構(gòu)造器
Circle18
thistype Circlethis name Circle
View Code
這是故意讓你們明白究竟是怎么構(gòu)造的
最后再總結(jié)一下
1、創(chuàng)建子類時(shí)會(huì)先創(chuàng)建父類
2、創(chuàng)建類時(shí),最先是給類中成員變量初始化,然后才是調(diào)用構(gòu)造函數(shù)
3、父類中加了static和final的方法會(huì)對(duì)子類隱藏。父類和子類同名的方法會(huì)被覆蓋,被隱藏了的方法除外。
總結(jié)
以上是生活随笔為你收集整理的java继承circle类_java的继承的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 容量和内存:科技世界的两大法宝
- 下一篇: java 日期是否合法_java 中 D