Java 内部类

2019-03-06 16:31:05 浏览数 (1)

类中还有类就是内部类

一.成员内部类

代码语言:javascript复制
public class Text {
	
	
	
	class  innerClass{//成员内部类
		int id = 88;//定义属性
		public innerClass(){//定义构造方法
			
		}
		public void  inf(){//内部成员方法 
			System.out.println("内部类id=" id);
		}
	}
	
	innerClass in = new innerClass();//创建内部类对象
	
	public void diaoy(){
		in.inf();//调用内部类方法
	}
	
	public static void main(String[] args) {
		Text text = new Text();
		text.diaoy();
		
		Text.innerClass class1 = text.new innerClass();//在main方法中创建类的内部类 
		//外部类.new 创建内部类
		class1.inf();
	}

}

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

看起来innerClass 像该类的一个成员。该类称为外部类,内部类可以无条件访问外部类。

外部类访问内部类需要创建一个对象。

内部类依附外部类而存在,要创建内部类,先要创建外部类的对象。

二.局部内部类

该类访问仅限于方法内和该作用域内

代码语言:javascript复制
public class Text2 {

	int qq = 1397995240;
	int tel = 151888;
	
	public outClass action(String x){
		
		
		class innerClass2 implements outClass{//在方法体中创建内部类,局部内部类
			
			int tel = 888151;
			
			public innerClass2(String s){//局部内部类构造方法
				s = x;
				System.out.println(s);
				System.out.println(qq);//内部类可以无条件访问外部类成员
				//如果重名 会显示内部类成员,此时若访问外部成员或方法需要指明
				System.out.println(tel);
				
				System.out.println(Text2.this.tel);//外部类.this.成员变量
			}
			
		}
		
		new innerClass2("do");//外部类要访问内部类成员 必须先创建这个类的对象
		//然后通过这个类来访问
		
		//若需要返回值, 由于外部没有这个类 可以创建一个接口  实现向上转型
		//则上面的 new innerClass2("do");可以去掉
		//返回值由void改为接口名; 类要继承这个接口 ;然后返回新建类型
		return new innerClass2("do");
	}
	
	public static void main(String[] args) {
		Text2 text2 = new Text2();
		text2.action("局部内部类");
	}
}
interface outClass{
	
}

三.匿名内部类

写法相当于注释掉的内容

代码语言:javascript复制
public class Text3 {

	public out aOut(){
		
//		return new inner();
		
		//只有在使用的时候才写方法体 不知道叫什么名字 
		return new out() {
			private int i = 0;
			public int getV(){
				return i;
			}
		};//直接写方法体
	
		
	}
	public static void main(String[] args) {
		Text3 text3 = new Text3();
	}
}
interface out{
	
}
//class inner implements out{
//	private int i = 0;
//	public int getV(){
//		return i;
//	}
//}

四.静态内部类

我们可以将main方法写在静态内部类当中,有一个调试的功能

它不能使用外部类的非static方法

代码语言:javascript复制
public class Text4 {

	static int i = 0;
	
	static class innerClass4{
		public static void main(String[] args) {
			System.out.println(i);
		}
	}
}

内部类的继承

代码语言:javascript复制
public class Text {
	
	class  innerClass{//成员内部类
		int id = 88;//定义属性
		public innerClass(){//定义构造方法
			
		}
		public void  inf(){//内部成员方法 
			System.out.println("内部类id=" id);
		}
	}

	
	public static void main(String[] args) {
		Text text = new Text(); 
		NewClass newClass = new NewClass(text);
		newClass.inf();
		
	}
}

class  NewClass extends Text.innerClass{//继承方式ClassA.ClassB

	public NewClass(Text text){//需要有一个参数的构造方法,这个参数则是外部类的对象
		text.super();//调用外部类的方法 只有这样才能为外部类提供对象引用
	}
}

0 人点赞