Java基礎整理(4) 內部類

一些混淆點


內部類

基礎知識

在內部類中可以隨意使用外部類的成員方法及成員變量。

成員內部類

package com.ptm.abstructdemo.Inner;

public class Test {
    public static void main(String[] args)  {
        //內部類依附於外部類而存在
        Outter outter = new Outter();

        //第一種方式:直接new方式
        Outter.Inner inner1 = outter.new Inner();
        inner1.sysInner();

        //第二種方式:獲取類變量方式
        Outter.Inner inner2 = outter.getInnerInstance();
        inner2.sysInner();

        //當成員內部類擁有和外部類同名的成員變量或者方法時,會發生隱藏現象
        // 即默認情況下訪問的是成員內部類的成員。
        outter.sysInner();
    }
}

class Outter {
    private Inner inner;
    private String str ="PTM";

    public Inner getInnerInstance() {
        if(inner == null)
            inner = new Inner();
        return inner;
    }

    public void sysInner() {
        System.out.println("------------------------");
        System.out.println("外部方法"+inner);
        System.out.println("------------------------");
    }

    class Inner {
        //構造器
        public Inner() {

        }

        public void sysInner() {
            System.out.println("------------------------");
            System.out.println("內部方法"+this);
            System.out.println("獲取外部類私有屬性"+str);
            System.out.println("------------------------");
        }
    }
}

emmmmmm一切盡在註釋中= =,執行結果如下圖:
在這裏插入圖片描述

局部內部類

局部內部類是定義在一個方法或者一個作用域裏面的類,局部內部類的訪問僅限於方法內或者該作用域內。

class Outter {

	//代碼塊中
    {
        class Inner {
            //構造器
            public Inner() {

            }

            public void sysInner() {
                System.out.println("------------------------");
                System.out.println("我是內部局部類1");
                System.out.println("------------------------");
            }
        }
        Inner inner = new Inner();
        inner.sysInner();
    }

	//方法中
    public void sysInner() {
        class Inner {
            //構造器
            public Inner() {

            }

            public void sysInner() {
                System.out.println("------------------------");
                System.out.println("我是內部局部類2");
                System.out.println("------------------------");
            }
        }
        Inner inner = new Inner();
        inner.sysInner();
    }

    public static void main(String[] args)  {
        Outter outter = new Outter();
        outter.sysInner();
    }
}

執行結果如下圖
在這裏插入圖片描述
(PS:局部內部類不能有public、protected、private以及static修飾符的。)
在這裏插入圖片描述

匿名內部類

public class ThreadTest {
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("最典型的當然是開線程啦"+Thread.currentThread().getName());
            }
        }).start();

        new Thread(
                () -> System.out.println("JDK8dark法好"+Thread.currentThread().getName())// 省略接口名和方法名
        ).start();
    }
}

運行結果如下圖
在這裏插入圖片描述
PS:匿名內部類也是不能有訪問修飾符和static修飾符的。

靜態內部類

Java中只有內部類纔可以是靜態的

public class Test {
    public static void main(String[] args)  {
        Outter.Inner inner = new Outter.Inner();
    }
}

class Outter {
    public Outter() {
    }

    static class Inner {
        public Inner() {
        }
    }
}

劃重點了,面試題經常考這個點。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章