二十八.内部类

内部类基本概念

一般我们定义的成员都是属性和方法。但是在代码中任何结构都是可以嵌套的,在类里面再嵌套一个类,这就叫做内部类。

定义:

/**
 * 测试类
 * @author Administrator
 *
 */
public class CeShiText {

	 public static void main( String[] args ){
		 Class c = new Class();	
		 c.getInner();
	 }
}


class Class{	//外部类
	
	private String mssage = "Hello Wold";		//私有属性
	
	class Inner{	//内部类
		public void show(){		//内部类方法
			System.out.println(mssage);
		}
	}
	
	public void getInner(){		//调用内部类的方法
		Inner inner = new Inner();		//内部类实例化
		inner.show();
	}
	
}

内部类的优势:可以随时访问外部类的私有属性
如果是两个外部类那么要访问私有属性需要封装起来才能访问

内部类的相关说明

通过上面我们了解了内部类的结构和优势,也知道怎么创建和使用最基本的内部类了。接下来我们还需要对内部类进行一些相关的说明。 内部类可以轻松的访问外部类的私有成员,相反外部类也可以轻松的访问内部类的私有成员。

例子:外部类访问内部类私有成员

public class CeShiText {

	 public static void main( String[] args ){
		 Class c = new Class();	
		 c.getInner();
	 }
}


class Class{	//外部类
	
	private String className = "外部类私有成员";
	
	class Inner{	//内部类
		private String innerName = "内部类私有成员";
		
		public void show(){		//内部类方法
			System.out.println(className);
		}
	}
	
	public void getInner(){		//调用内部类的方法
		Inner inner = new Inner();		//内部类实例化
		inner.show();
		System.out.println(inner.innerName);
	}
	
}
输出结果:

外部类私有成员
内部类私有成员

使用了内部类后,外部类和内部类之间的私有属性就可以不用去进行封装setter、getter访问私有属性了。有一点要注意,内部类也是一个类,所以不要以为内部类被外部类括起来就不能实例化了,只要是类都能实例化。

内部类实例化语法:

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

例子:内部类实例化

public class CeShiText {

	 public static void main( String[] args ){
		 Class.Inner inner = new Class().new Inner();	//实例化内部类
		 
		 inner.show();
	 }
}


class Class{	//外部类
	
	private String className = "外部类私有成员";
	
	class Inner{	//内部类
		private String innerName = "内部类私有成员";
		
		public void show(){		//内部类方法
			System.out.println(className);
		}
	}
	
	public void getInner(){		//调用内部类的方法
		Inner inner = new Inner();		//内部类实例化
		inner.show();
		System.out.println(inner.innerName);
	}
	
}
输出结果:

外部类私有成员

那么如果内部类只允许外部类使用,那么要给内部类定义私有的访问修饰符private
例子:私有的内部类

public class CeShiText {

	 public static void main( String[] args ){
		 Class.Inner inner = new Class().new Inner();	//实例化内部类
		 
		 inner.show();
	 }
}


class Class{	//外部类
	
	private String className = "外部类私有成员";
	
	private class Inner{	//内部类
		private String innerName = "内部类私有成员";
		
		public void show(){		//内部类方法
			System.out.println(className);
		}
	}
	
	public void getInner(){		//调用内部类的方法
		Inner inner = new Inner();		//内部类实例化
		inner.show();
		System.out.println(inner.innerName);
	}
	
}
输出结果:

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
	The type Class.Inner is not visible
	The type Class.Inner is not visible
	The type Class.Inner is not visible

	at amazon.CeShiText.main(CeShiText.java:11)

当内部类加上了private那么调用范围只能在外部类里面,如果在其他类中调用会发生报错。

之前上面也说过任何结构都能嵌套,那么接口和抽象类同样也是能嵌套的,接下来给大家演示内部接口和内部抽象类。
例子:内部接口

public class CeShiText {

	 public static void main( String[] args ){	
		 OuterPort out = new OuterClass();
		 out.show(((OuterClass)out).new InnerClass());
	 }
}

class OuterClass implements OuterPort{		//外部类
	
	class InnerClass implements InnerPort{		//内部类

		@Override
		public String getContest() {
			// TODO Auto-generated method stub
			return "萝莉赛高";
		}
		
	}

	@Override
	public void show(InnerPort innerPort) {
		System.out.println(innerPort.getContest());
	}
}

interface OuterPort{			//外部接口
	
	public void show(InnerPort innerPort);
	
	interface InnerPort{			//内部接口
		public String getContest();
	}
}
输出结果:

萝莉赛高

接下里来看内部抽象类
例子:内部抽象类

public class CeShiText {

	 public static void main( String[] args ){	
		 OuterPort out = new OuterClass();
		 out.show();
	 }
}

class OuterClass implements OuterPort{		//外部类
	
	class InnerClass extends InnerAbstract{		//内部类

		@Override
		public String getContest() {
			// TODO Auto-generated method stub
			return "萝莉赛高";
		}
		
	}

	@Override
	public void show() {
		InnerAbstract innerAbstract = new InnerClass();
		System.out.println(innerAbstract.getContest());
	}
}

interface OuterPort{			//外部接口
	
	public void show();
	
	abstract class InnerAbstract{			//内部抽象类
		public abstract String getContest() ;
	}
}
输出结果:

萝莉赛高

还有一个更有意思的结构就是用内部类来实例化外部接口。
例子:接口内部进行接口实现

public class CeShiText {

	 public static void main( String[] args ){	
		 OuterPort out = OuterPort.getInnerClass();
		 out.show();
	 }
}

interface OuterPort{			//外部接口
	
	public void show();
	
	class InnerClass implements OuterPort{//内部类
		@Override
		public void show() {
			// TODO Auto-generated method stub
			System.out.println("萝莉永远滴神");
		}			
		
	}
	
	public static OuterPort getInnerClass(){
		return new InnerClass();
	}
}
输出结果:

萝莉永远滴神

static定义内部类

一般被static修饰的成员我们都称为静态成员,内部类被static修饰,就叫静态内部类。
静态内部类在实例化的时候不用通过外部类实例化而实例化了,可以直接实现静态内部类实例化。

  • 外部类不能被static修饰,java唯一可以被static修饰的就是静态内部类
  • 静态内部类可以包含静态成员,也可以包含非静态成员,但是在非静态内部类中不可以声明静态成员。
  • 静态类内部不可以访问外部类的实例成员,只能访问外部类的类成员,即使是静态内部类的实例方法也不能访问外部类的实例成员,只能访问外部类的静态成员

语法:

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

栗子

public class CeShiText {

	 public static void main( String[] args ){	
		 Outter.Inner inner = new Outter.Inner();
		 inner.show();
	 }
}

class Outter{	//外部类
	
	private static String msg = "Hello Wold";
	
	static class Inner{			//静态内部类
		public void show(){
			System.out.println(msg);
		}
	}
}
输出结果:

Hello Wold

方法中定义内部类

内部类可以在类中、方法中、代码块中创建

栗子:


public class CeShiText {

	 public static void main( String[] args ){	
		 Outter outter = new Outter();
		 outter.fun(10);
	 }
}

class Outter{	//外部类
	
	private String msg = "Hello Wold";
	
	public void fun(int num){		//方法
		class Inner{			//内部类
			public void show(){
				System.out.println(Outter.this.msg);
				System.out.println(num);
			}
		}
		
		new Inner().show();			//在方法中实例化
	}
}

输出结果

Hello Wold
10

匿名内部类

匿名内部类就是一个实现一次子类的操作,一般用作在抽象类或者接口上。

例子:实现接口

public class CeShiText {

	 public static void main( String[] args ){	
		 new Outter() {
			@Override
			public void show() {
				// TODO Auto-generated method stub
				System.out.println("萝莉");
			}
		}.show();
	 }
}

interface Outter{
	
	public void show();
}


输出结果:萝莉

那么当我们实现多个方法的时候呢?
用多态来实现

例子:实现接口多个方法

public class CeShiText {

	 public static void main( String[] args ){	
		 Outter o = new Outter() {
			
			@Override
			public void show() {
				// TODO Auto-generated method stub
				System.out.println("萝莉");
			}
			
			@Override
			public void fun(int num) {
				// TODO Auto-generated method stub
				System.out.println("等于:"+num);
			}
		};
		
		o.show();
		o.fun(14);
	 }
}

interface Outter{
	
	public void show();
	
	public void fun(int num);
}
输出结果:

萝莉
等于:14

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值