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() {
        }
    }
}

划重点了,面试题经常考这个点。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值