JAVA中的内部类

对于初学者来说内部类有点陌生,在学习期间直到了学完线程,教材上都没提及内部类,刷了几套题之后发现考的频率并不低所以今天想说一说这个陌生又不难理解的内部类。

使用内部类的原因:

每个内部类都能独立的继承一个类或实现一个接口,所以无论外部类是否继承了某个类或接口的实现,对于内部类没有影响。使用内部类的其他优点如下:

(1)内部类可以用多个实例,每个实例都有自己的状态信息,并且与其他外部类的对象的信息相互独立

(2)在单个外部类中可以让更多的内部类以不同的方式实现同一个接口或者继承同一个类

(3)内部类对象实例的创建并不依赖于外部类的创建

(4)内部类提供了更好的封装,除了它的外部类其他类都不能访问

内部类种类:

一、成员内部类

成员内部类定义在外部类的内部,相当于外部类一个成员变量的位置。内部类可以使用任意的访问控制符号(public private protected等),内部类定义的方法可以直接访问外部类定义的数据,不受访问控制符号的限制。定义了内部类后必须使用外部类对象来创建内部类的对象,像这样:

内部类 对象名=外部类对象.new 内部类();

成员内部类中不能存在任何静态变量和方法,可以定义常量

注意点:

1、外部类不能直接使用内部类的变量和方法,可先创建内部类的对象,然后通过内部类的对象来访问其成员变量和方法

2、如果内部类和外部类具有相同的变量和方法,内部类默认访问自己的成员变量和方法,如果要访问外部类的成员和方法可以使用this关键字,来一个很简单的例子来加深一下对内部类的理解。

public class OuterClass{
	String name="YU";
	int age=21;
	public class InnerClass{
		private String name="HUI";
		private void show() {
			System.out.println("姓名"+name);
			System.out.println("年龄"+age);
		}
	
	}
	public   static void main(String[] args) {
		OuterClass oc=new OuterClass();
		InnerClass ic=oc.new InnerClass();
		ic.show();	
	}
}

二、静态内部类(static修饰的内部类)

注意点:

1、静态内部类不能直接访问外部类的非静态成员,但可以通过new  外部类().成员的方式访问

2、如果外部类的静态成员与内部类的静态成员名称不相同,则可以通过成员名直接调用外部类的静态成员

3、创建静态内部类的对象时,不需要外部类的对象,可以直接创建像这样:

内部类   对象名 = new 内部类();

public class OuterClass{
	String name="YU";
	static int age=21;
	public static class InnerClass{
		private String name="HUI";
		private void show() {
			System.out.println("姓名"+name);
			System.out.println("年龄"+age);
		}
	
	}
	public  static  void main(String[] args) {
		OuterClass oc=new OuterClass();
		InnerClass ic=new InnerClass();
		ic.show();	
	}
}

三、方法内部类

方法内部类的作用域仅限于方法体内,方法外部无法访问该内部类

注意点:

1、方法内部类就像是方法里面的一个局部变量一样是不能有public private protected static修饰符的

2、只能访问方法定义的final类型的变量,原因:

当方法执行完毕之后,局部变量就销毁了,但内部类对象还可能存在,直到没有被引用时才会销毁,此时会出现一种情况,就是内部类要访问一个不存在局部变量,解决方法就是使用final修饰符,不仅会保持对象的引用不会改变,而且编译器还会维护这个对象在方法中的生命周期

在JDK8之后方法内部类中调用方法中的局部变量可以不需要修饰为final,匿名内部类也是一样的在,这是因为JDK8之后增加了Effectively final功能

public class OuterClass{
	String name="YU";
	int age=21;
	public void show() {
	 class InnerClass{
		String name="HUI";
		public void print() {
			final int age=20;
			System.out.println("姓名"+name);
			System.out.println("年龄"+age);
		}
			}
	 InnerClass ic=new InnerClass();
	 ic.print();
	}
	public  static  void main(String[] args) {
		OuterClass oc=new OuterClass();
		oc.show();	
	}
}

四、匿名内部类

注意点:

1、匿名内部类是直接使用new来生成一个对象的引用

2、对于匿名内部类,它是存在一个缺陷的,它只能被使用一次

3、使用匿名内部类时,我们必须要继承一个类或实现一个接口,但是两者同时只能操作一个,就是说要么继承一个类要么实现一个接口

4、匿名内部类中是不能定义构造函数的,匿名内部类中不能存在任何的静态变量和静态方法

5、匿名内部类不能是抽象的,它必须要实现继承的类或者实现接口的所有抽象方法

6、匿名内部类初始化:使用构造代码块,利用构造代码块能够达到为匿名内部类创建一个构造器的效果

public class OuterClass {
	public InnerClass getInfom(final int age,String name) {
		return new InnerClass(){
			public void getInfo() {
				System.out.println("名字"+name);
				System.out.println("年龄"+age);
			}
		};
	}
	public static void main(String[]args) {
		OuterClass oc=new OuterClass();
		InnerClass ic=oc.getInfom(21,"HUI");
		ic.getInfo();
	}
}
interface InnerClass{
	public void getInfo();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值