Java笔记(常用类——内部类)

本文详细介绍了Java中的四种内部类:成员内部类、静态内部类、局部内部类和匿名内部类。成员内部类可以直接访问外部类的所有成员,静态内部类可以独立于外部类创建对象并访问外部类的静态成员。局部内部类仅在其定义的作用域内有效,且若要访问外部类的局部变量,该变量必须为final。匿名内部类通常用于快速实现接口或抽象类,简化代码,但可读性较差。文章通过示例代码解释了各种内部类的使用场景和特点。
摘要由CSDN通过智能技术生成

常用类

内部类

概念

在一个类的内部定义个完整的类

主要分为以下几种

  • 成员内部类(与main方法同级)
  • 静态内部类(static修饰类)
  • 局部内部类(在类的方法中定义的类)
  • 匿名内部类(一般是对某抽象类或接口直接new对象时生成)

成员内部类

格式:

package com.wjs.properise;

public class A {

	public static void main(String[] args) {
	
    }   

    class B{
        
    }
    
}

特点

  • 类B可以直接访问类A的所有的变量和方法,无论是否私有化
  • 外部类A不可以直接访问类B的变量或方法,需要创建对象访问
  • 如果内部类的方法或变量与外部类一样,则触发隐藏现象,内部类访问外部类变量时需要使用this关键字(外部类名.this.内部类名)
public class A {

    private String name;

    public static void main(String[] args) {
        
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    class B {
        private String name;

        public B(String name) {
        	//A.this
            A.this.name = this.name = name;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}

静态内部类

  • 不依赖外部类对象,可直接创建或通过类名访问,可声明静态成员。
  • 只能直接访问外部类的静态成员(实例成员需实例化外部类对象)。
import java.util.Scanner;

public class AAA {
    int age;
    static String sex;

    public static void main(String[] args) {

        //method();报错,找不到方法method
        B b = new B();

        //输出B中的名字
        System.out.println(b.name);

        //调用B中的方法
        b.method();
    }


    static class B {
        static String name = "朴实无华的小韦";

        public static void method() {
            Scanner scanner = new Scanner(System.in);
            sex = scanner.next();
            //age = 15;无法从 static 上下文引用非 static 字段 'age'
        }
    }
}

局部内部类

特点:访问权限仅在方法内或作用域内,且不能用任何修饰符修饰
局部内部类访问外部类当前方法中的局部变量时,因无法保障变量的生命周期与自身相同,变量必须修饰为final。

package com.wjs.properise;

public class AAA {

    public static void main(String[] args) {
        method();
    }

    public static void method(){
        //因为类声明在下方所以不可以在类还没被内存创建时使用
        //B b = new B();
        class B{
            private String name = "这里是局部内部类";

            public void method(){
                System.out.println("这里是局部内部类方法!");
            }
        }
        B b = new B();
        b.method();
    }
}

匿名内部类

  • 没有类名的局部内部类(一切特征都与局部内部类相同)。
  • 必须继承一个父类或者实现一个接口。
  • 定义类、实现类、创建对象的语法合并,只能创建一个该类的对象。
  • 优点:减少代码量。
  • 缺点:可读性较差。
  • 匿名内部类没有构造方法。也是唯一没有构造方法的内部类。匿名内部类和局部内部类只能访问外部类的final变量
public class A{
    public static void main(String[] args) {
        Test t = new Test() {
            @Override
            public void test() {
                System.out.println("实现了接口Test!");
            }
        };
        t.test();
    }
}

public interface TestT {
    public static final String name = "";

    void test();
    public static void j(){
        System.out.println("面具带笑");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值