激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java類的繼承實例詳解(動力節點Java學院整理)

Java類的繼承實例詳解(動力節點Java學院整理)

2020-09-09 13:27動力節點 Java教程

在Java開發中,我們常常用到繼承這一概念,可以說繼承是Java這類面向對象編程語言的基石,今天小編一起和大家一起學習java類的繼承

一.你了解嗎?

  在java中,類文件是以.java為后綴的代碼文件,在每個類文件中最多只允許出現一個public類,當有public類的時候,類文件的名稱必須和public類的名稱相同,若不存在public,則類文件的名稱可以為任意的名稱(當然以數字開頭的名稱是不允許的)。

  在類內部,對于成員變量,如果在定義的時候沒有進行顯示的賦值初始化,則java會保證類的每個成員變量都得到恰當的初始化:

  1)對于  char、short、byte、int、long、float、double等基本數據類型的變量來說會默認初始化為0(boolean變量默認會被初始化為false);

  2)對于引用類型的變量,會默認初始化為null。

  如果沒有顯示地定義構造器,則編譯器會自動創建一個無參構造器,但是要記住一點,如果顯示地定義了構造器,編譯器就不會自動添加構造器。注意,所有的構造器默認為static的。

  下面我們著重講解一下 初始化 順序:

  當程序執行時,需要生成某個類的對象,java執行引擎會先檢查是否加載了這個類,如果沒有加載,則先執行類的加載再生成對象,如果已經加載,則直接生成對象。

  在類的加載過程中,類的static成員變量會被初始化,另外,如果類中有static語句塊,則會執行static語句塊。static成員變量和static語句塊的執行順序同代碼中的順序一致。記住,在java中,類是按需加載,只有當需要用到這個類的時候,才會加載這個類,并且只會加載一次。看下面這個例子就明白了:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class test {
 public static void main(string[] args) throws classnotfoundexception {
 bread bread1 = new bread();
 bread bread2 = new bread();
 }
}
class bread {
 static{
 system.out.println("bread is loaded");
 }
 public bread() {
 system.out.println("bread");
 }
}

  運行這段代碼就會發現"bread is loaded"只會被打印一次。

  在生成對象的過程中,會先初始化對象的成員變量,然后再執行構造器。也就是說類中的變量會在任何方法(包括構造器)調用之前得到初始化,即使變量散步于方法定義之間。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class test {
 public static void main(string[] args) {
 new meal();
 }
}
class meal {
 public meal() {
 system.out.println("meal");
 }
 bread bread = new bread();
}
class bread {
 public bread() {
 system.out.println("bread");
 }
}

  輸出結果為:

bread
meal

二.你了解繼承嗎?

  繼承是所有oop語言不可缺少的部分,在java中使用extends關鍵字來表示繼承關系。當創建一個類時,總是在繼承,如果沒有明確指出要繼承的類,就總是隱式地從根類object進行繼承。比如下面這段代碼:

?
1
2
3
4
5
6
7
8
class person {
 public person() {
 }
}
class man extends person {
 public man() {
 }
}

  類man繼承于person類,這樣一來的話,person類稱為父類(基類),man類稱為子類(導出類)。如果兩個類存在繼承關系,則子類會自動繼承父類的方法和變量,在子類中可以調用父類的方法和變量。在java中,只允許單繼承,也就是說 一個類最多只能顯示地繼承于一個父類。但是一個類卻可以被多個類繼承,也就是說一個類可以擁有多個子類。

  1.子類繼承父類的成員變量

  當子類繼承了某個類之后,便可以使用父類中的成員變量,但是并不是完全繼承父類的所有成員變量。具體的原則如下:

  1)能夠繼承父類的public和protected成員變量;不能夠繼承父類的private成員變量;

  2)對于父類的包訪問權限成員變量,如果子類和父類在同一個包下,則子類能夠繼承;否則,子類不能夠繼承;

  3)對于子類可以繼承的父類成員變量,如果在子類中出現了同名稱的成員變量,則會發生隱藏現象,即子類的成員變量會屏蔽掉父類的同名成員變量。如果要在子類中訪問父類中同名成員變量,需要使用super關鍵字來進行引用。

  2.子類繼承父類的方法

  同樣地,子類也并不是完全繼承父類的所有方法。

  1)能夠繼承父類的public和protected成員方法;不能夠繼承父類的private成員方法;

  2)對于父類的包訪問權限成員方法,如果子類和父類在同一個包下,則子類能夠繼承;否則,子類不能夠繼承;

  3)對于子類可以繼承的父類成員方法,如果在子類中出現了同名稱的成員方法,則稱為覆蓋,即子類的成員方法會覆蓋掉父類的同名成員方法。如果要在子類中訪問父類中同名成員方法,需要使用super關鍵字來進行引用。

  注意:隱藏和覆蓋是不同的。隱藏是針對成員變量和靜態方法的,而覆蓋是針對普通方法的。(后面會講到)

  3.構造器

  子類是不能夠繼承父類的構造器,但是要注意的是,如果父類的構造器都是帶有參數的,則必須在子類的構造器中顯示地通過super關鍵字調用父類的構造器并配以適當的參數列表。如果父類有無參構造器,則在子類的構造器中用super關鍵字調用父類構造器不是必須的,如果沒有使用super關鍵字,系統會自動調用父類的無參構造器。看下面這個例子就清楚了:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class shape {
 protected string name;
 public shape(){
 name = "shape";
 }
 public shape(string name) {
 this.name = name;
 }
}
class circle extends shape {
 private double radius;
 public circle() {
 radius = 0;
 }
 public circle(double radius) {
 this.radius = radius;
 }
 public circle(double radius,string name) {
 this.radius = radius;
 this.name = name;
 }
}

  這樣的代碼是沒有問題的,如果把父類的無參構造器去掉,則下面的代碼必然會出錯:

Java類的繼承實例詳解(動力節點Java學院整理)

改成下面這樣就行了: 

Java類的繼承實例詳解(動力節點Java學院整理)

  4.super

  super主要有兩種用法:

  1)super.成員變量/super.成員方法;

  2)super(parameter1,parameter2....)

  第一種用法主要用來在子類中調用父類的同名成員變量或者方法;第二種主要用在子類的構造器中顯示地調用父類的構造器,要注意的是,如果是用在子類構造器中,則必須是子類構造器的第一個語句。

三.常見的面試筆試題

1.下面這段代碼的輸出結果是什么?

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class test {
 public static void main(string[] args) {
 new circle();
 }
}
class draw {
 public draw(string type) {
 system.out.println(type+" draw constructor");
 }
}
class shape {
 private draw draw = new draw("shape");
 public shape(){
 system.out.println("shape constructor");
 }
}
class circle extends shape {
 private draw draw = new draw("circle");
 public circle() {
 system.out.println("circle constructor");
 }
}
shape draw constructor
shape constructor
circle draw constructor
circle constructor

  這道題目主要考察的是類繼承時構造器的調用順序和初始化順序。要記住一點:父類的構造器調用以及初始化過程一定在子類的前面。由于circle類的父類是shape類,所以shape類先進行初始化,然后再執行shape類的構造器。接著才是對子類circle進行初始化,最后執行circle的構造器。

2.下面這段代碼的輸出結果是什么?

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class test {
 public static void main(string[] args) {
 shape shape = new circle();
 system.out.println(shape.name);
 shape.printtype();
 shape.printname();
 }
}
class shape {
 public string name = "shape";
 public shape(){
 system.out.println("shape constructor");
 }
 public void printtype() {
 system.out.println("this is shape");
 }
 public static void printname() {
 system.out.println("shape");
 }
}
class circle extends shape {
 public string name = "circle";
 public circle() {
 system.out.println("circle constructor");
 }
 public void printtype() {
 system.out.println("this is circle");
 }
 public static void printname() {
 system.out.println("circle");
 }
}
shape constructor
circle constructor
shape
this is circle
shape

  這道題主要考察了隱藏和覆蓋的區別(當然也和多態相關,在后續博文中會繼續講到)。

  覆蓋只針對非靜態方法(終態方法不能被繼承,所以就存在覆蓋一說了),而隱藏是針對成員變量和靜態方法的。這2者之間的區別是:覆蓋受rtti(runtime type  identification)約束的,而隱藏卻不受該約束。也就是說只有覆蓋方法才會進行動態綁定,而隱藏是不會發生動態綁定的。在java中,除了static方法和final方法,其他所有的方法都是動態綁定。因此,就會出現上面的輸出結果。

以上所述是小編給大家介紹的java類的繼承實例詳解(動力節點java學院整理),希望對大家有所幫助

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 97久久精品一区二区三区观看 | 欧美日本色 | 姑娘第5集高清在线观看 | 一级黄色毛片播放 | 中国老女人一级毛片视频 | 性欧美xxxx免费岛国不卡电影 | 国产精品成年片在线观看, 激情小说另类 | 国产乱一区二区三区视频 | 国产精品久久久久久久久久iiiii | 欧美成人一区二区三区电影 | 亚洲导航深夜福利涩涩屋 | 好吊色欧美一区二区三区四区 | 亚洲国产精品久久久久久久 | 国产一区视频在线免费观看 | 久久污 | 精品亚洲午夜久久久久91 | 日本aaaa片毛片免费观看视频 | 免费国产视频大全入口 | 久久久久久久久久网站 | 日本高清视频网站www | 91色综合综合热五月激情 | 国产精品午夜小视频观看 | 欧美在线中文字幕 | 日韩黄色一级视频 | 亚洲3atv精品一区二区三区 | 午夜爱爱福利 | 日韩电影av在线 | 国产毛片在线高清视频 | 91麻豆精品国产91久久久无需广告 | 一级做人爱c黑人影片 | 中文字幕网在线 | 黄色影院在线 | 国产chinesehd精品91 | 日本一区视频 | 91成人在线免费观看 | 欧美一级做a | 久久久久中精品中文字幕19 | 国产成人在线一区二区 | 国产精品自拍啪啪 | 欧美成人做爰高潮片免费视频 | av免费提供 |