Java 内部类

Java 内部类

在 Java 中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。

内部类一般来说包括四种:成员内部类、局部内部类、匿名内部类和静态内部类。

成员内部类

成员内部类是最普通的内部类,它的定义为位于另一个类的内部。

class Outer{
	//外部类的成员变量
	int num = 5;
	//写在Outer成员位置上的内部类
	class Inner{
		//内部类的成员函数
		void show(){
			//在内部类中访问外部类的成员变量
			System.out.println("Outer num = "+num);
		}
	}
	public void method(){
		//创建内部类对象,访问内部类的成员函数或者变量
		Inner in = new Inner();
		in.show();
	}
}

创建内部类对象,访问内部类方法

public class Test {
	public static void main(String[] args) {
		//通过创建外部类对象,接着创建内部类对象
		Outer.Inner in = new Outer().new Inner();
		in.show();
	}
}

当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的是成员内部类的成员。如果要访问外部类的同名成员,需要以下面的形式进行访问:

//外部类.this.成员变量
//外部类.this.成员方法

局部内部类

局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。

注意: 局部内部类就像是方法里面的一个局部变量一样,是不能有 public、protected、private 以及 static 修饰符的。

class Outer {
	
	void method(){
		//局部内部类
		class Inner {
			//局部内部类的成员函数
			void show() {
				System.out.println("Inner show");
			}
		}
		//在局部内部类所在的外部类函数中创建局部内部类对象
		Inner in = new Inner();
		in.show();
	}
}

当内部类在外部类的局部位置上时,这时在外部类以外的其他地方是无法创建局部内部类对象。只能在内部类所在的局部函数中创建对象,通过外部类调用内部类所在的函数从而执行内部类中的函数。

public class Test {
	public static void main(String[] args) {
		//创建外部类对象,调用method方法
		Outer out = new Outer();
		out.method();
	}
}

静态内部类

静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static。静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法。

class Outer{
	//外部类的成员变量
	 static int num = 5;
	//写在Outer成员位置上的静态内部类
	static class Inner{
		//内部类的成员函数
		void show(){
			//在内部类中访问外部类的成员变量
			System.out.println("Outer num = "+num);
		}
	}
}

当内部类在外部类成员位置上被static修饰时,由于静态可以直接使用类名调用。

public class Test {
	public static void main(String[] args) {
		//因为内部类是静态,所以不需要创建Outer的对象。直接创建内部类对象就哦了。
		Outer.Inner in = new  Outer.Inner();
		in.show();
	}
}

匿名内部类

匿名内部类是唯一一种没有构造器的类,匿名内部类是直接使用new来生成一个对象的隐式引用,是内部类的简化形式。

匿名内部类的使用是存在一个缺陷的,就是它仅能被使用一次,创建匿名内部类时它会立即创建一个该类的实例,该类的定义会立即消失,所以匿名内部类是不能够被重复使用。

内部类必须要继承父类或者实现接口。

格式:new 父类or接口(){子类的内容 重写的方法}

interface Inter
{
	void show1();
	void show2();
}
class Outer
{
	int num = 4;
	//在一个类使用一个接口的对象。可以通过内部类来实现。
	/*  这种方式有些麻烦,简化成匿名内部类实现
	class Inner implements Inter
	{
		public void show1()
		{}
		public void show2()
		{}
	}
	*/
	public void method()
	{
		/*
		Inner in = new Inner();
		in.show1();
		in.show2();
		*/
		//对其简化,写成匿名内部类的方式。
		Inter in = new Inter()//记住:内部类中一般方法不要过多。阅读性会很差。
		{
			public void show1()
			{}
			public void show2()
			{}
		};
		in.show1();
		in.show2();
	}
}

在使用匿名内部类的过程中,我们需要注意如下几点:

1.使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。

2.匿名内部类中是不能定义构造函数的。

3.匿名内部类中不能存在任何的静态成员变量和静态方法。

4.匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值