关于java的内部类

本文深入解析Java内部类的四种类型:静态内部类、成员内部类、方法内部类和匿名内部类,探讨它们的特点、作用域及如何访问外部类资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一般而言,内部类与包含它的外部类有比较密切的关系,而与其他类关系不大,定义在类的内部,可以实现对外部的完全隐藏,可以有更好的封装性,代码也表现的更为简洁。

  • 不过内部类只是java编译器的概念,对于java虚拟机而言,不知道内部类这么一回事,每个内部类最后都会被编译成一个独立的类,生成一个独立得字节码文件。
  • 内部类的分类:(1)静态内部类(2)成员内部类(3)方法内部类(4)匿名内部类
  1. 静态内部类:静态内部类的定义与静态方法的定义的位置一样,也带有static关键字。
    public class Outer {
    	
    	@Test
    	public void test() {
    		StaticInner staticInner = new  StaticInner();
    		staticInner.test();
    		System.out.println("fangfa===========");
    	}
    	
    	private static class StaticInner {
    		public StaticInner() {
    			// TODO Auto-generated constructor stub
    		}
    		public void test() {
    			System.out.println("staticInner_method");
    		}
    	}
    }
    

    静态内部类为StaticInner,带有static修饰符,除了形式上的差别以外,别的与一个独立的类差别不大,可以包含静态变量、静态方法、构造函数、成员方法等等;但是只能访问外部类Outer的静态方法、静态变量(即静态资源)。在外部需要使用需要通过“外部类.静态内部类”的方式调用,如:

    Outer.StaticInner si = new Outer.StaticInner();
    si.test;

     

  2. 成员内部类:与静态内部类想比,成员内部类则是没有static关键字的修饰。
    public class Outer {
    	private String str = "nihao";
    	@Test
    	public void test() {
    		Inner inner = new  Inner();
    		staticInner.test();
    		System.out.println("fangfa===========");
    	}
    	
    	private class Inner {
    		public Inner() {
    			// TODO Auto-generated constructor stub
    		}
    		public void test() {
    			System.out.println("Inner_method"+str);
    		}
    	}
    }

    与静态内部类不同的是成员内部类除了可以访问外部类Outer的静态方法和变量以外,还可以直接访问外部类的实例变量和方法,如Inner的方法test()直接访问外部类Outer的str变量。同时也可以使用

    Outer.this.str

    来调用。

  3.方法内部类:                                                                                                                                                                                              

public class Outer {
	private String str = "nihao";
	
	@Test
	public void method() {
		int a = 100;
		System.out.println("fangfa===========");
		class MethodInner {
			
			public void test() {
				System.out.println("staticInner_method"+Outer.this.str);
				System.out.println("staticInner_method"+ a);
			}
		}
		
		MethodInner inner = new MethodInner();
		inner.test();
	}
}

 

类MethodInner定义在外部类方法method中,方法内部类只能在定义的方法内使用。若方法是实例方法,则除了静态变量和方法,内部类还可以直接访问外部类的实例变量和方法,如直接访问外部私有实例变量str。但是如果方法是静态方法,则方法内部类只能访问外部类的静态变量及方法。

  4.匿名内部类:匿名内部类是与new关键字关联的,在创建对象的时候定义类,new后面是父类或者父接口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值