Java内部类

Java内部类

刚学的知识,能力有限,暂时整理出这么多,简单的了解和使用

内部类的基本使用

概念:

​ 内部类就是在一个类中定义一个类,

格式:

public class 类名{
    public class 内部类名{
        
    }
}

内部类的访问:

  • 内部类可以直接访问外部类的成员,包括私有属性、方法
  • 外部类需要创建内部类对象,才能访问

成员内部类

成员内部类就是作为外部类的成员,也是最常见的内部类

  • 可以直接使用外部类的所有成员和方法,即使是private
  • 当内部类的成员属性或者方法也外部类同名时,会发生隐藏现象
    • 直接调用同名属性或方法,使用的是内部类中的
    • 使用 “ 外部类.this.成员变量/成员方法 ”才会使用外部的同名属性或者方法
  • 成员内部类属于外部类的成员,如果想要访问成员内部类,需要先创建外部类
  • 可以使用访问修饰符(public、protected、private都可以)

举例:

public class Test1 {
    public static void main(String[] args) {
        //先创建一个外部类对象   然后创建内部类对象
        Outer outer = new Outer();
        Outer.Inner inner = outer.new Inner();
        
        //也可以这样
        Outer.Inner inner1 = new Outer().new Inner();
        inner1.show();
    }
}
class Outer{
    private int num =10;
    public class Inner{
        public void show(){
            //直接使用外部类的num变量
            System.out.println(num);

            method();//调用的是内部类中的method方法

            Outer.this.method();//调用的是外部类中的method方法
        }
        public void method(){
            System.out.println("内部类中的方法");
        }
    }
    public void method(){
        System.out.println("外部类中的方法");
        Inner i = new Inner();
        i.show();
    }
}

局部内部类

就是在方法中定义的类,就叫做局部内部类

  • 局部内部类只能在方法的作用域内使用,它所在的方法外无法使用
  • 局部内部类的实例化也要在方法中进行。
  • 该类可以直接访问外部类的成员,也可以访问方法内的局部变量
  • 局部内部类不能使用访问修饰符

举例:

class Outer{
    private int num1 =999;
    public void method(){
        int num2 = 10;
        class Inner{
            public void show(){
                //可以访问外部类的属性
                System.out.println(num1);
                //也可以访问方法中的变量
                System.out.println(num2);
            }
        }
        //局部变量的实例化也要在方法中
        Inner inner = new Inner();
        inner.show();
    }
}

匿名内部类

匿名内部类是不能有名称的内部类,所以没有办法引用,必须在创建时,作为new语句的一部分来声明。

  • 匿名内部类不能有构造方法
  • 匿名内部类不能定义任何静态成员、方法和类
  • 只能创建匿名内部类的一个实例
  • 一个匿名内部类定义时一定在new后面,生成一个对象引用
  • 匿名内部类可以实现一个接口或者实现一个抽象类
  • 匿名内部类属于局部内部类,所以局部内部类的所有限制都对其有效
  • 内部类当中的this指的时匿名内部类本身,如果使用外部类中this则使用“外部类.this”
  • 匿名内部类不能使用访问修饰符和static关键字

举例:

//创建一个抽象类
abstract class Abs{
    public abstract void absTest();
    public abstract void method();
}
//创建一个接口
interface Inter01{
    public void interTest();
}

public class Test5 {
    public static void main(String[] args) {
        //创建接口的匿名内部类
        new Inter01() {
            @Override
            public void interTest() {
                System.out.println("匿名内部类实现接口的方法");
            }
        }.interTest();//直接调用匿名内部类的方法

        Test5 test5 = new Test5();
        //当这个方法需要一个接口的对象作为参数时,就可以定义一个匿名内部类传给方法
        test5.display(new Inter01() {
            @Override
            public void interTest() {
                System.out.println();
            }
        });
    }
    public void display(Inter01 inter01){
        //调用接口中的方法
        inter01.interTest();
    }
    
    
    //当一个方法需要一个抽象类的返回值,匿名内部类也可以作为返回值
    public Abs returnTest(){
        return new Abs() {
            @Override
            public void absTest() {

            }
            @Override
            public void method() {

            }
        };
    }


    //创建一个和抽象类中重名的方法
    public void method(){
        System.out.println("和抽象类中方法重名的方法");
    }
    //创建一个方法   测试匿名内部类中this的使用
    public void thisTest(){
        //创建抽象类的匿名内部类
        new Abs() {
            @Override
            public void absTest() {
                System.out.println("匿名内部类实现抽象类的方法");
                //这两个调用的是匿名内部类中的method方法
                method();
                this.method();
                //这种写法调用的是外部类中的method方法
                Test5.this.method();
            }

            @Override
            public void method() {
                System.out.println("匿名内部类中的一个普通方法");
            }
        }.absTest();
    }
}

静态内部类

使用static修饰的成员内部类

  • 静态内部类不需要依赖于外部类的存在
  • 静态内部类不能使用外部类中非静态的成员变量或方法
public class Test3 {
    public static void main(String[] args) {
        //可以直接访问内部类中的静态属性和方法,不依赖于外部类
        System.out.println(Outer.Inner.str);
    }
}

class Outer{
    static int num =100;

    static class Inner{
        static String str = "静态变量";
        public void method(){
            //只能访问外部类中的静态变量和方法
            System.out.println(num);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值