java的内部类知识点

非静态的内部类可以访问外围类的所有成员

package practice;

public class Outter 
{
	private static int var1=1;
	private int var2=4; 
	private static void s()
	{
		System.out.println("static function in Outter");
	}
	private void d()
	{
		System.out.println("function in Outter");
	}
	 private class Inner
	 {
		 public void f()
		 {
			 System.out.println("static var in outter :"+var1);
			 System.out.println("var in outter :"+var2);
			 s();
			 d();
		 }
	 }
	public static void main(String[]args)
	{
		Outter out=new Outter();
		Outter.Inner in=out.new Inner();
		in.f();
	}
}

输出如下:

static var in outter :1
var in outter :4
static function in Outter
function in Outter


当在内部类中想要拥有一个外部类引用的时候可以使用

类名.this

例如outter.this

而在一个外部类创以前是不可能创建一个内部类对象的,就像上述代码所示的那样,先创建外围对象,然后通过.new才能创建其内部对象

当然上面所说的都是非静态的内部类


匿名内部类,当你需要一个辅助类完成某些任务又不希望这个类是公共可用的,这时匿名内部类就是一个很好的选择

但是当匿名类想要使用一个在其外部定义局部变量时那么那个参数引用必须是final类型的,至于为什么在内部类引用局部变量时必须是final型的,一种解释是因为局部变量与匿名类的生存期是不一致的,也就是说当一个方法调用结束了它的局部变量也就被”杀死”了,为匿名类却不一定,这样就造成了一个内部类使用了一个不存在的变量。


当不需要外围类与内部类存在任何联系时,我们应该使用static内部类。

既然不存在任何联系,在创建一个静态内部类时就不用去创建外围类了。


普通类与静态类的区别

普通类的字段与方法不能为静态的,其中也就不能包含静态类,而静态类却都可以做到。


内部类的存在价值,只说最重要的一点,那就是某种意义上的多重继承。

当希望继承两个类时,只有内部类才可以实现这样的效果(java中),这是因为内部类能够独立的实现一个类或者接口,无论外围类是否已经实现。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
匿名内部类是指在声明一个类的同时实例化它,而不需要为该类命名。在Java中,匿名内部类通常用于实现接口或继承抽象类。 下面是一些关于匿名内部类知识点: 1. 声明匿名内部类:可以在创建对象的同时定义匿名内部类,使用new关键字后紧跟接口或抽象类的定义,并重写其中的方法。例如: ```java InterfaceName obj = new InterfaceName() { // 匿名内部类的实现 // 重写接口中的方法 }; ``` 2. 实现接口:匿名内部类常用于实现接口,可以直接在创建对象时实现接口的方法,省去了单独创建一个实现类的步骤。 ```java Runnable runnable = new Runnable() { @Override public void run() { // 实现Runnable接口的run方法 } }; ``` 3. 继承抽象类:匿名内部类也可以继承抽象类,并重写其中的抽象方法。 ```java AbstractClass obj = new AbstractClass() { @Override public void method() { // 实现抽象类中的方法 } }; ``` 4. 访问外部变量:匿名内部类可以访问外部类中的成员变量,但需要将其声明为final或实际上是final的(Java 8之后,如果变量未被后续代码修改,可以不显式声明为final)。 ```java int num = 10; InterfaceName obj = new InterfaceName() { @Override public void method() { System.out.println(num); // 访问外部变量 } }; ``` 需要注意的是,匿名内部类没有名称,因此无法通过名称直接创建多个对象。每次使用都需要重新定义匿名内部类。匿名内部类通常用于简单的场景,如果需要复杂的逻辑或多次使用,建议单独定义一个具名的内部类

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值