一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

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

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

服務器之家 - 編程語言 - Java教程 - Java編程復用類代碼詳解

Java編程復用類代碼詳解

2021-03-26 13:36iaiti Java教程

這篇文章主要介紹了Java編程復用類代碼詳解,分享了相關代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下

本文研究的主要是Java編程中的復用類,那么到底復用類是什么東西,又有什么用法,下面具體介紹。

看了老羅羅升陽的專訪,情不自禁地佩服,很年輕,我之前以為和羅永浩一個級別的年齡,也是見過的不是初高中編程的一位大牛之一,專訪之后,發現老羅也是一步一個腳印的人。別說什么難做,做不了,你根本就沒去嘗試,也沒有去堅持。

If you can't fly then run,if you can't run then walk, if you can't walk then crawl,but
whatever you do,you have to keep moving forward——Martin Luther King.

復用類這標題剛開始很難懂,后面專門去看了書的英文原版,其實標題是reusing classes,重新使用類,其實復用就是“利用現成的東西”的意思,其實實現的兩種方法就是java中經常聽到的——組合繼承

(1)組合

has-a的作用。

?
1
2
3
4
5
6
7
8
9
public class TV {
  Show show;
  public String toString(){
   return "showgirl";
  }
}
 
class Show{
}

提一下toString方法,當你需要String而你是一個對象的時候,編譯器會調用對象的toString方法。

TV里有Show,現在的show沒有初始化,為null,不能調用show的方法。

組合的作用強大,以面向對象看,假如你在造一個Car類,那么你可以用組合輕易的將Glass,Light,Engine等等的Car這些部件組合起來。

(2)繼承

is-a

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.myown.iaiti;
public class Father {
    public int i;
    void get(){
        System.out.println("father");
    }
}
package son;
import com.myown.iaiti.*;
public class Son extends Father{
    Father f = new Father();
    int j = f.i;
    Son son = new Son();
    son.get();
}
public void get(){
    super.get();
    System.out.println("son");
}
}

這里有個包訪問權限的問題,假如沒有加public的時候,默認是包內成員訪問,不同包訪問,即Son中的Father成員訪問get方法是不可見的。而public的話是可見的,所以i訪問得到。

private部分是不能繼承,屬于父類私有,而public的部分,將繼承,需要修改的方法,可以進行重寫。要添加的屬性可以單獨添加。

而且繼承的方法,如果原本的father的public方法重寫之后沒將public加上,會有Cannot reduce the visibility of the inherited method from Father,也就是不能減少父類中繼承方法的可見性。super指的是父類,即Father。

還有一點是,其實java中所有的類都隱式地繼承了Object類。Object是父類,其他類是子類
老外喜歡講為基類。子類也叫導出類或者派生類。

(3)代理

設計模式里面有個比較難懂的——代理模式,作者講的很有趣,代理是組合和繼承的中庸之道。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package son;
class Father{
  public void get(){
    System.out.println("father");
  }
}
public class Son extends Father{
  public static void main(String[] args) {
    Father f = new Father();
    f.get();
  }
}
 
class FatherProxy{
  private Father f = new Father();
  public void get(){
    f.get();
  }
}

像直接把Father當做成員,那么father的方法就暴露給這個類了,那我們可以使用FatherProxy這樣的代理類,我自己定義好get方法是怎么拿的,我自己知道是調用father的get方法,但是使用我這個代理的人不知道,我只告訴他你要用就用代理的get的方法就可以了。封裝性就體現出來了。上面只是隨便敲的一個簡單例子。

(4)重寫和重載

?
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
class Father{
  public void get(String s){
    System.out.println("father");
  }
   
  public void get(boolean b){
    System.out.println("boolean");
  }
}
public class Son extends Father{
  @Override
  public void get(String s){
    System.out.println("father");
  }
   
  // @Override //會有錯誤提示 因為父類沒有該方法,不是重寫
  public void get(int i ){
    System.out.println("sonint");
  }
   
  public static void main(String[] args) {
    Son s = new Son();
    s.get("d");
    s.get(false);
    s.get(1);
  }
}

重寫是重新覆蓋父類的方法,如果沒有重寫或者重載,那么子類調用一個子類沒有的方法時,其實是調用父類。

重載是同樣的方法名,但參數名稱不同,為了防止你錯誤的進行重載可以加上@Override標簽,那樣會提示你并沒有重寫方法。

(5)protected

Java編程訪問權限的控制代碼詳解

在前面一篇提前寫了,因為之前沒講繼承的東西。

可以簡單將protected看成父類給兒子繼承的遺產,其他非繼承類不能訪問。

(6)final關鍵字

加上final關鍵字的基本類型,表示這個變量初始化后不會改變。類似c的define,你希望一個變量在這個程序里就是這個值不需要改變。就可以用final。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Son{
  int age = 2;
  public static void main(String[] args) {
     
    final int i = 1;
    // i = 2; 值不能再改變
    final Son son = new Son();
    // son = new Son();
    //The final local variable son cannot be assigned. 
    //It must be blank and not using a compound assignment
    //final修飾的局部變量son不能被分配,必須為空或者不要再次分配
     
    son.age = 4;
    //雖然引用恒定不變,但是,對象本身卻可以改變。
  }
   
  void change(final int c){
    // c= this.age; 無法賦予新值 因為值只有在方法傳參決定  對象引用和這個類似
    //age ++;    無法改變
  }
}

static本來是靜態初始化,和final一起用就是占據了一塊不能改變的存儲空間。

static final即編譯期常量,常量名按照c的常量命名傳統,全部用大寫字母,單詞之間用下劃線分開。

?
1
static final VALUE_ONE = 1

final修飾方法時

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Print {
  final void cannotprint(){
    System.out.println(1);
  }
}
 
public class PrintSon extends Print{
  //void cannotprint(){}
  //無法重寫 因為被final修飾了
   
  public static void main(String[] args) {
    PrintSon ps = new PrintSon();
    ps.cannotprint();
  }
}

可以看成父類要求子類必須繼承的不可修改財產(祖傳)。private隱式地指定為final,因為private根本就不給你繼承。這比給你繼承但不能修改還更私有。

順便將權限理清。

  • public,公共財產,不止是子類,其他類也可以用。
  • final,祖傳珍寶,留給子類,但不允許修改。
  • private,父類私有財產,不會給子類繼承。
  • protected,父類專門留給子類的財產,其他人不能用它。

當final修飾的是類的時候,是為了讓這個類不會被繼承。

(7)繼承和初始化

這里的順序問題是一個很有趣的問題。看例子。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class GrandFather{
  private static int i = print();
  private static int print(){
    System.out.println("g");
    return 1;
  }
}
class Father extends GrandFather{
  private static int i = print();
  private static int print(){
    System.out.println("f");
    return 1;
  }
}
public class Son extends Father{
  private static int i = print();
  private static int print(){
    System.out.println("s");
    return 1;
  }
  public static void main(String[] args) {
    System.out.println("first");
  }
}

打印的結果是first嗎?錯了。

雖然執行的是main方法,但是看到son這個需要靜態初始化的i沒有,結果是s,first嗎?

這還有初始化的問題,son是繼承father,那么編譯器會加載father,并初始化i,那father繼承grandfather,那么編譯器會去加載grandfather,類似遞歸。

那最后最先初始化的是grandfather的i。

所以最后的結果是:g,f,s,first。

總結

以上就是本文關于Java編程復用類代碼詳解的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

原文鏈接:http://blog.csdn.net/iaiti/article/details/38438403

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 幻女free性zozo交体内谢 | 精品久久久久久午夜 | 国产欧美日韩视频在线观看一区二区 | 国产精品久久国产三级国电话系列 | 青青成人福利国产在线视频 | 亚洲午夜精品久久久久久抢 | 久久爽狠狠添AV激情五月 | 国产欧美国产综合第一区 | 亚洲激情自拍偷拍 | 精品国产一区二区三区在线观看 | 亚洲a在线视频 | 手机在线伦理片 | 俄罗斯大白屁股 | 高级黄色片 | 舔穴吸奶| 国产99久久久国产精品成人 | 97视频免费人人观看人人 | 精品国产国产精2020久久日 | 96日本xxxxxxxxx70| 日日摸夜夜爽色婷婷91 | 国产精品第一区揄拍 | 五月色综合婷婷综合俺来也 | 日日摸夜夜爽色婷婷91 | 我被黑人彻底征服的全文 | 日本日日黄 | 精品videoss另类日本 | 四虎最新紧急更新地址 | 操比视频| 天美蜜桃精东乌鸦传媒 | 99热久久这里只精品国产www | 成年私人影院免费视频网站 | 欧美一区二区三区成人看不卡 | 青草视频在线观看视频 | 亚洲国产综合久久久无码色伦 | 亚洲成色| 天天亚洲综合 | sedog在线长片 | 日本搜子同屋的日子2国语 日本爽p大片免费观看 | 亚洲欧美在线免费 | 日韩网新片免费 | 国语自产拍在线播放不卡 |