内部类

内部类

内部类:成员内部类(全局)、局部内部类、匿名内部类
1.成员内部类:在内部类中直接存取所在类的私有成员变量。

内部类的实例一定要绑定在外部类的实例上,如果从外部类中初始化一个内部类对象,那么内部类对象会绑定在外部类对象上。内部类初始化方式与其他类初始化方式相同,都是使用new关键字。

package test;

public class outClass {	
   innerClass in = new innerClass();  //外部类实例化内部类对象引用
   public void ouf() {
	in.inf();        //在外部类方法中调用内部类方法
}
   class innerClass{
	  innerClass() {  //内部类构造方法
	}
	  public void inf() {  //内部类成员方法
	}
	  int y = 0;  //定义内部类成员变量
   }
   public innerClass  doit() {
  //y = 4;           //外部类不可直接访问内部类成员变量
    in.y = 4;        //外部类不可直接访问内部类成员变量
    return new innerClass();     //返回内部类引用
   }
   public static void main(String[] args) {
		outClass out = new outClass(); //内部类对象实例化操作必须在外部类或外部类的非静态方法中的实现
		outClass.innerClass in = out.doit(); 
		outClass.innerClass in1 = out.new innerClass();	   
	    }
}

如果在外部类和非静态方法之外实例化内部类对象,需要使用外部类。内部类的形式指定该对象的类型。
内部类的对象会依赖外部类对象,除非已经存在一个外部类对象,否则类中不会出现内部类对象。
非内部类不能不能声明为private和protected。

使用this关键字获取内部类与外部类的引用

如果在外部类中定义的成员变量与内部类的成员变量名称相同,可以使用this关键字。

public class outClass {	
	private int x;
	private class inner{
		private int x = 9;
		public void doit(int x){
			x++;  //调用的是形参x
			this.x++; //调用内部类的变量x
			outClass.this.x++;  //调用外部类的变量X
	  }
   }
}

2.局部内部类

在方法体内使用局部变量,该局部变量需要被设置为final类型,在方法体内的内部类只能访问方法中final类型的局部变量,该局部变量相当于一个常量,它的生命周期超出方法运行的生命周期,由于该局部变量被设置为final,所以不能再内部类中改变该局部变量的值。

interface outinterface2{	
}
class   outClass3{
	public outinterface2 doit(final String x) {
		class innerClass2  implements outinterface2{
			 innerClass2(String s) {
				s = x;
				System.out.println(s);
			}
		}
		return new innerClass2("doit");
	}
}

一个静态内部类中可以声明static成员,但是在非静态内部类中不可声明静态成员。

3.匿名内部类

匿名内部类,没有名称,使用默认的构造方法生成对象在匿名内部类定义结束时需要分号标识,这个分号并不是结束标志,而是代表创建接口引用表达式的标识。

return new A(){
...//内部类体
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内部类是指在一个类的内部定义的另一个类。内部类可以访问外部类的私有成员,而不需要使用访问器或者公共方法。 Java中有四种类型的内部类:成员内部类、局部内部类、匿名内部类和静态内部类。下面分别介绍它们的写法。 1. 成员内部类 成员内部类是定义在外部类的成员位置上的类,它可以访问外部类的所有成员,包括私有成员。 ```java public class OuterClass { private int outerField; public class InnerClass { private int innerField; public void setOuterField(int value) { outerField = value; } public void setInnerField(int value) { innerField = value; } } } ``` 2. 局部内部类 局部内部类是定义在方法或代码块内部的类,它只能在定义它的方法或代码块中使用。 ```java public class OuterClass { private int outerField; public void method() { int localVariable = 0; class InnerClass { private int innerField; public void setOuterField(int value) { outerField = value; } public void setInnerField(int value) { innerField = value; } public void setLocalVariable(int value) { localVariable = value; // 局部变量必须是 final 或 effectively final } } InnerClass inner = new InnerClass(); inner.setOuterField(1); inner.setInnerField(2); inner.setLocalVariable(3); } } ``` 3. 匿名内部类 匿名内部类是没有名字的内部类,它通常用来实现接口或继承某个类。 ```java public class OuterClass { public void method() { Runnable runnable = new Runnable() { @Override public void run() { System.out.println("Hello, world!"); } }; Thread thread = new Thread(runnable); thread.start(); } } ``` 4. 静态内部类 静态内部类是定义在外部类内部的 static 类,它只能访问外部类的静态成员。 ```java public class OuterClass { private static int outerStaticField; public static class InnerClass { private int innerField; public void setOuterStaticField(int value) { outerStaticField = value; } public void setInnerField(int value) { innerField = value; } } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值