java類

類的構造

person.java

public class person {
    public static void main(String[] arge){ 
        class someone{
            private String name;
            private int id;
            //無參構造方法,最好加上
            public someone(){
            }
            
            /**
             * this代表當前所在類將來所產生的對象
             * 當參數和類變量重名時用this   
             */
            public someone(String name,int id){
                this.name=name;
                this.id=id;
            }
            
            public void put(){
                System.out.println("name:"+name+",id:"+id);
            }
        }
        //引用包內的類
        someone aa = new someone("zhangsan",201412112);
        aa.put();
    }
}
person.java執行結果

訪問控制

訪問控制 private成員 默認成員(friendly protected成員 publict成員
同一類中成員 O O O O
同一包中其他成員 X O O O
不同包中的子類 X X O O
不同包中的非子類 X X X O
  • friendly不是關鍵字,只是一種默認修飾符的稱謂。

p1:MyClass1.java

package p1;
public class MyClass1 {
    public int a = 10;
    private int b = 20;
    protected int c = 30;
    int d = 40;
    public void func1() {
        System.out.println("public方法 func1");
    }
    private void func2() {
        System.out.println("private方法 func2");
        System.out.println("包p1私有方法調用私有數據:"+b);
    }
    protected void func3() {
        System.out.println("protected方法 func3");
    }
    void func4() {
        System.out.println("friendly方法 func4");
    }
}

p1:MyClass2.java

package p1;
class MyClass2 {
    public void func1() {
        System.out.println("public func1 of MyClass2");
    }
}

p1:Test.java

package p1;
public class Test {
    public void func() {
        MyClass1 obj1 = new MyClass1();
        
        //a是公共屬性,任何地方都可以訪問
        System.out.println("公有數據:"+obj1.a);
        
        // Error,b為私有屬性,類外無法訪問
        //System.out.println("私有數據:"+obj1.b);
        
        // c是受保護屬性,同包的類可以訪問
        System.out.println("保護數據:"+obj1.c);
        
        // d是缺省屬性,同包的類可以訪問
        System.out.println("缺省數據:"+obj1.d);
        
        // func1()是公共方法,任何地方都可以訪問
        obj1.func1();
        
        //Error,func2()為私有方法,類外無法訪問
        //obj1.func2();
        
        // func3()是受保護方法,同一包中的類可以訪問,其他包中的子類也可以訪問
        obj1.func3();
        
        // func4()是缺省方法,同一包中的類可以訪問
        obj1.func4();
        
        // 同一包中的缺省訪問控制類可以訪問
        MyClass2 obj2 = new MyClass2();
    }
}

p2:Test.java

package p2;
import p1.MyClass1;

//Error,不能導入不同包中的缺省類
//import p1.MyClass2;

public class Test {
    public void func() {
        MyClass1 obj1 = new MyClass1();
        
        // 公共屬性,任何地方都可以訪問
        System.out.println(obj1.a);
        
        // Error,b為私有屬性,類外無法訪問
        //System.out.println(obj1.b);
        
        // Error,c是受保護屬性,不同包中的非子類無法訪問
        //System.out.println(obj1.c);
        
        // Error,d是缺省屬性,不同包中的類不能訪問
        //System.out.println(obj1.d);
        
        // func1()是公共方法,任何地方都可以訪問
        obj1.func1();
        
        // Error,func2()為私有方法,類外無法訪問
        //obj1.func2();
        
        // Error,func3()是受保護方法,不同包中的非子類無法訪問
        //obj1.func3();
        
        // Error,func4()是缺省方法,不同包中的類不能訪問
        //obj1.func4();
        
        // Error,不可以訪問不同包中的缺省類
        //MyClass2 obj2 = new MyClass2();
    }
}

p3:Test.java

package p3;

import p1.MyClass1;

//Error,不能導入不同包中的缺省類
//import p1.MyClass2;

//Test類繼承了p1包中的MyClass1類
public class Test extends MyClass1 {
    public void func() {
        // 公共屬性,任何地方都可以訪問
        System.out.println(a);
        
        // Error,b為私有屬性,類外無法訪問
        //System.out.println(b);
        
        // c是受保護屬性,子類可以訪問
        System.out.println(c);
        
        // Error,d是缺省屬性,不同包中的類不能訪問
        //System.out.println(d);
        
        // func1()是公共方法,任何地方都可以訪問
        func1();
        
        // Error,func2()為私有方法,類外無法訪問
        //func2();
        
        // func3()是受保護方法,子類可以訪問
        func3();
        
        // Error,func4()是缺省方法,不同包中的類不能訪問
        //func4();
        
        // Error,不可以訪問不同包中的缺省類
        //MyClass2 obj2 = new MyClass2();
    }
}

p0:main.java

package p0;
import p1.*;

public class main {

    public static void main(String[] args) {
        System.out.println("包p1的類調用包p1的對象");
        //定義p1中的Test對象
        Test p1t = new Test();
        p1t.func();
        System.out.println();
        
        System.out.println("包p2的類調用包p1的對象");
        //定義p2中的Test對象
        p2.Test p2t = new p2.Test();
        p2t.func();
        System.out.println();
        
        System.out.println("包p3的類繼承包p1的類并調用p1的對象");
        //定義p3中的test對象
        p3.Test p3t = new p3.Test();
        p3t.func();
        System.out.println();
    }
}

main.java

類與類之間的關系

  • 1、繼承與多態
    • 1.1 繼承
    • 1.2 多態
    • 1.3 super關鍵字
    • 1.4 final關鍵字
  • 2、其他關系
    • 2.1 依賴關系
    • 2.2 關聯關系
    • 2.3 聚合關系
    • 2.4 組成關系
  • 3、內部類
    • 3.1 成員內部類
    • 3.2 局部內部類
    • 3.3 靜態內部類
    • 3.4 匿名內部類

1.1 繼承

  • java中一個類不能繼承多個類
  • 雖然不支持多線程,但可以用接口來妳補
  • 構造方法執行的次序是:父類->子類;

語法

[訪問符][修飾符] class 子類 extends 父類{
......
}

FatherClass.java

package com.demon.test5;
//父類
public class Father {
    public int a;
    public FatherClass() {
        System.out.println("調用父類構造方法...");
        a = 10;
    }
}

ChildClass.java

package com.demon.test5;
//子類
public class ChildClass extends FatherClass {

    int b;

    public ChildClass() {
        System.out.println("調用子類構造方法...");
        b = 20;
    }

    public static void main(String[] args) {
        // 實例化一個子類對象
        ChildClass obj = new ChildClass();
        // 輸出子類中的屬性值
        System.out.println("a=" + obj.a + ",b=" + obj.b);
    }

}

運行結果

調用父類構造方法...
調用子類構造方法...
a=10,b=20

1.2 多態

  • 編譯時的多態:由聲明該變量所使用的類型決定。
  • 運行時的多態:由實際賦給該變量的值決定。
  • 一個父類具有多個子類,可以將子類的對象直接賦值給父類。
  • 重寫父類方法時,子類的返回值,方法名,參數,異常與父類保持一致。
  • 父類中的私有方法不能被重寫。
  • 子類方法的可訪問性必須與父類方法的可訪問性一致或者更公開。

OverrideDemo.java

package com.demon.test5;
//父類
class Base {
    public void print() {
        System.out.println("父類");
    }
}
//子類
class Son1 extends Base {
    // 重寫父類的print()方法
    public void print() {
        System.out.println("子類1");
    }
}

class Son2 extends Base {
    public void print() {
        System.out.println("子類2");
    }
}

public class OverrideDemo {

    public static void main(String[] args) {
        //多態
        //obj指向自己
        Base obj=new Base();
        obj.print();
        
        //obj指向子類Son對象
         obj = new Son1();
        obj.print();
        
        //obj指向子類Son2對象
        obj= new Son2();
        obj.print();
    }
}

運行結果

父類
子類1
子類2

1.3 super關鍵字

代表父類的對象

  • 在子類的構造方法中調用父類的構造方法。
  • 在子類的方法中訪問父類的屬性或者方法。
  • 若子類沒有明確調用父類的構造方法時,系統會自動調用父類的不帶參數的構造方法,即super()方法。

mysuper.java

package com.qst.chapter05;
//父類
class Base1 {
    private int a;
    private int b;
    
    public Base1(){
        //系統默認調用super();時調用父類的不帶參構造函數
        System.out.println("父類不帶參構造函數");
    }
    
    public Base1(int a,int b){
        this.a=a;
        this.b=b;
    }

    public int geta(){
        return a;
    }
    
    public int getb(){
        return b;
    }
    
    public void display(){
        System.out.println("a="+a+",b="+b);
    }
}
//子類
class Son extends Base1 {
    private int c;

    public Son(){
        
    }
    
    public Son(int a,int b,int c){
        //調用父類的構造方法來初始化父類中的基礎屬性
        super(a,b); //如果注釋掉的話則調用父類不帶參的構造函數
        this.c=c;
    }
    
    public void display(){
//      System.out.println("a="+this.geta()+",b="+this.getb()+",c="+c);
        //調用父類的display()輸出父類的兩個屬性
        super.display();
        System.out.println("c="+c);
    }
}

public class mysuper {

    public static void main(String[] args) {
        //多態
        //obj指向自己
        Base1 obj=new Base1(1,2);
        obj.display();
        
        //obj指向子類Son對象
        obj = new Son(1,2,3);
        obj.display();
    }
}

運行結果

a=1,b=2
a=1,b=2
c=3

注釋掉39行super()的運行結果運行結果

a=1,b=2
父類不帶參構造函數
a=0,b=0
c=3

1.4 final關鍵字

表示“不可改變、最終”的意思,用于修飾變量、方法和類。

  • 修飾變量,表示常量,不能改變。
  • 修飾方法,表示最終方法,不可被子類重寫。
  • 修飾類,表示最終類,不可悲子類繼承。

2.1 依賴關系

比較常見,在一個類中操作另一個類的對象,稱其依賴于第二個類。

DependentDemo.java

package com.demon.test5;
//依賴關系,Person依賴Car
class Car {
    void run(String city) {
        System.out.println("汽車開到" + city);
    }
}

class Person {
    // Car類的對象作為方法的參數
    void travel(Car car) {
        car.run("大連");
    }
}

public class DependentDemo {

    public static void main(String[] args) {
        Car car=new Car();
        Person p=new Person();
        p.travel(car);
//      new Person().travel(new Car());
    }
}

運行結果

汽車開到大連

  • 人出租汽車去玩,人依賴于汽車。

2.2 關聯關系

一個類使用另一個類的對象作為該類的成員變量。

AssociationDemo.java

package com.demon.test5;
//關聯關系,Person關聯Car
class Car {
    void run(String city) {
        System.out.println("汽車開到" + city);
    }
}

class Person {
    // Car對象作為成員變量
    Car car;

    Person(Car car) {
        this.car = car;
    }

    void travel() {
        car.run("大連");
    }
}

public class AssociationDemo {

    public static void main(String[] args) {
        Car car = new Car();
        Person p = new Person(car);
        p.travel();
        // new Person(new Car()).travel();
    }
}

運行結果

汽車開到大連

  • 人開著自己的車去玩,人關聯車。

2.3 聚合關系

關聯關系的一種特例,體現整體與部分的關系。
體現在一個類由多個其他類的對象作為成員變量。

AggregationDemo.java

package com.demon.test5;

//聚合關系,Department由Employee聚合而成
class Employee {
    String name;

    Employee(String name) {
        this.name = name;
    }
}

class Department {
    Employee[] emps;
    
    Department(Employee[] emps) {
        this.emps = emps;
    }

    void show() {
        // 循環遍歷
        for (Employee emp : emps) {
            System.out.println(emp.name);
        }
    }
}

public class AggregationDemo {

    public static void main(String[] args) {
        
        Employee[] emps = { 
                new Employee("張三"), 
                new Employee("李四"),
                new Employee("王五")};
        
        Department dept = new Department(emps);
        dept.show();
    }
}

運行結果

張三
李四
王五

2.4 組成關系

CompositionDemo.java

package com.demon.test5;

//組成關系,汽車由各設備組成
//發動機
class Engine {
}

// 底盤
class Chassis {
}

// 車身
class Bodywork {
}

// 電路設備
class Circuitry {
}

// 汽車
class Car {
    Engine engine;
    Chassis chassis;
    Bodywork bodywork;
    Circuitry circuitry;

    Car(Engine engine, Chassis chassis, Bodywork bodywork, Circuitry circuitry) {
        this.engine = engine;
        this.chassis = chassis;
        this.bodywork = bodywork;
        this.circuitry = circuitry;
    }
}

public class CompositionDemo {

    public static void main(String[] args) {
        Engine engine = new Engine();
        Chassis chassis = new Chassis();
        Bodywork bodywork = new Bodywork();
        Circuitry circuitry = new Circuitry();
        Car car = new Car(engine, chassis, bodywork, circuitry);
    }
}

3. 內部類

一個類體之內在定義一個類,外面的叫外部類,里面的叫內部類。

  • 能隱藏起來,不被同一包中的其他類訪問。
  • 能訪問外部類的所有屬性。

3.1 成員內部類

在外部類的內部定義一個類。

Cow.java

package com.demon.test5;

public class Cow {
    private double weight;

    // 外部類的兩個重載的構造器
    public Cow() {
    }

    public Cow(double weight) {
        this.weight = weight;
    }

    // 定義一個成員內部類
    private class CowLeg {
        // 成員內部類的一個實例變量
        private double length;

        // 成員內部類的一個重載的構造方法
        public CowLeg() {
        }

        public CowLeg(double length) {
            this.length = length;
        }

        // 下面省略length、color的setter和getter方法
        public void setLength(double length) {
            this.length = length;
        }

        public double getLength() {
            return this.length;
        }

        // 成員內部類的方法
        public void info() {
            System.out.println("高:" + length);
            // 直接訪問外部類的private修飾的成員變量
            System.out.println("本牛腿所在奶牛重:" + weight); 
        }
    }

    public void test() {
        CowLeg cl = new CowLeg(1.12);
        cl.info();
    }

    public static void main(String[] args) {
        Cow cow = new Cow(378.9);
        cow.test();
    }
}

運行結果

高:1.12
本牛腿所在奶牛重:378.9

  • 外部類:Cow.class
  • 內部類:Cow $ CowLeg.class

3.2 局部內部類

  • 在方法中定義的內部類
  • 不能用public和private訪問修飾符進行聲明。
  • 作用域在方法塊中
  • 可以訪問局部變量,但這些必須聲明為final。

LocalInnerClass.java

package com.demon.test5;

public class LocalInnerClass {
    public static void main(String[] args) {
        // 定義局部內部類
        class InnerBase {
            int a;
        }
        // 定義局部內部類的子類
        class InnerSub extends InnerBase {
            int b;
        }
        // 創建局部內部類的對象
        InnerSub is = new InnerSub();
        is.a = 5;
        is.b = 8;
        System.out.println("InnerSub對象中:a=" + is.a + ",b=" + is.b);
    }
}

運行結果

InnerSub對象中:a=5,b=8

  • LocalInnerClass.class
  • LocalInnerClass $ 1InnerBase.class
  • LocalInnerClass $ 1InnerSub.class
  • 多出來的數字一是為了區分相同名稱的內部類(處于不同方法中)。

3.3 靜態內部類

static修飾的內部類,將內部類變成與外部類相關

StaticInnerClassDemo.java

package com.demon.test5;

public class StaticInnerClassDemo {
    private int prop1 = 5;
    private static int prop2 = 9;
//  private static StaticInnerClass StaticInnerClass;

    static class StaticInnerClass {
        // 靜態內部類里可以包含靜態成員
        private static int age = 0;

        public void accessOuterProp() {
            // 下面代碼出現錯誤:
            // 靜態內部類無法訪問外部類的實例變量
//          System.out.println(prop1);
            // 下面代碼正常
            System.out.println(prop2);
            System.out.println(age);
        }
    }
    
    public static void main(String[] args){
        StaticInnerClassDemo.StaticInnerClass sic = new StaticInnerClassDemo.StaticInnerClass();
        sic.accessOuterProp();
    }
}

運行結果

9
0

3.4 匿名內部類

AnonymousClassDemo.java

package com.demon.test5;

public class AnonymousClassDemo {

    public static void main(String[] args) {
        System.out.println(new Object(){
            //重寫toString方法
            public String toString(){
                return this.put();
            }
            
            public String put(){
                return "這是匿名函數";
            }
        });
    }
}

運行結果

這是匿名函數

不重寫的運行結果

com.qst.chapter05.innerclass.AnonymousClassDemo$1@15db9742

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,001評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,786評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,986評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,204評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,964評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,354評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,410評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,554評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,106評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,918評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,093評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,648評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,342評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,755評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,009評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,839評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,107評論 2 375

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,726評論 18 399
  • 一:java概述:1,JDK:Java Development Kit,java的開發和運行環境,java的開發工...
    ZaneInTheSun閱讀 2,680評論 0 11
  • 1.import static是Java 5增加的功能,就是將Import類中的靜態方法,可以作為本類的靜態方法來...
    XLsn0w閱讀 1,257評論 0 2
  • 也許你很努力,也許你很堅持,也許你很堅持不懈,但是總有這樣那樣的因素讓你與優秀擦肩而過,然后,你開始焦慮,開始懷疑...
    青春屬于自己閱讀 307評論 0 0
  • Si自小就是“別人家的孩子”,大學畢業后,傾盡青春,立足在北上廣一線城市。妝容精致,衣著有品,出入CBD寫字樓,開...
    秋禾火閱讀 289評論 0 2