关于java内部类的几点总结

Java的内部类主要分为三种:成员内部类,局部内部类,匿名类

首先是成员内部类

作用相当于一个内的成员一样,可以访问外部类的所有成员和方法,因为是属于外部类的所以自然也可以访问那些是private的成员和方法了,但是内部类对于外部类却是隐藏的,除了可以在外部类中创建内部类,然后通过内部类的对象进行访问。


public class OutClass {
	Inner in = new Inner();
	public void ouf() {
		
	}
	
	class Inner{
		int y = 0 ;
		Inner(){ } ;
		public void inf() { } ;	
	}
	public Inner doit() {
		//y = 5 ;
		in.y = 5 ;
		return new Inner() ;
	}
	public static void main(String[] args) {
		OutClass out = new OutClass() ;
		OutClass.Inner in = out.doit();
		OutClass.Inner in2 = out.new Inner();
	}
}

这里的对于内部类的构造都是呈现了两种,我个人感觉第二种更加的具有普遍性,“OutClass.Inner in = Object.new Inner()

内部类向上转型为接口,或基类

interface OutInterface{
	public void f() ;
}

class OuterClass{
	//定义一个实现接口的内部类
	private class InnerClass implements OutInterface{
		InnerClass(String s){
			System.out.println(s);
		}
		public void f() {
			System.out.println("访问内部类中的方法");
		}
	}
	
	public OutInterface f() {
		return new InnerClass("访问内部类的构造方法");
	}
	
}
public class OutClass {
	
	public static void main(String[] args) {
		OuterClass out = new OuterClass();
		OutInterface o = out.f();
		o.f();
	}
}

这里将内部类设置为private使得只有OutClass类可以访问InnerClass类,将内部类封装,同时提通了一个f()的接口,使得外部可以使用此接口创建内部类,向上转型为接口。

局部类(定义在方法中的类)

局部类只能访问当前代码块的常量以及类的所有成员,但是外部类不能够访问此内部类。

class OuterClass3{
	public OutInterface doit(String x) {
		/*
		 * 定义一个内部类实现外部接口
		 */
		class InnerClass2 implements OutInterface{
			InnerClass2(String s){
				s = x ;
				System.out.println(s);
			}
			public void f() {
				
			}
		}
		/*
		 * 这里返回内部类的引用是因为,在外部类中是看不到这个定义在方法中的内部类的。
		 */
		return new InnerClass2("doit");
	}
	
//	InnerClass2 a = new InnerClass2();
}
public class OutClass {
	
	public static void main(String[] args) {
		OuterClass3 out = new OuterClass3() ;
		OutInterface o = out.doit("hello");
	}
}

匿名类

class OuterClass3{
	public OutInterface doit() {
	return new OutInterface() {
			public void f() {
				System.out.println("匿名类 "+"hello world");
			}
		};
	}
	
//	InnerClass2 a = new InnerClass2();
}
public class OutClass {
	
	public static void main(String[] args) {
		OuterClass3 out = new OuterClass3() ;
		OutInterface a = out.doit();
		a.f();
	}
}

基本的格式是
retrun new A(){
…//内部的类体
};
匿名类因为没有名称,只能使用某人的构造方法来构造
最后的分号不是代表类的结束,而是代表了引用表达式的标识

内部类也是可以被继承的

public class OutputInnerClass extends ClassA.ClassB{
	public OutputInnerClass( ClassA a ) {
	a.super() ;
	}
	}
}

class A{
	class B{
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

able陈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值