Java内部类

什么是内部类:

Java支持在一个类中定义另一个类,这样的类称作内部类,而包含内部类的外部类称为内部类的外嵌类。这样做的目的是为了增强封装!!!!

内部类与外部类的联系:

  • 内部类的外嵌类的成员变量在内部类中仍然有效,内部类中的方法也可以调用外嵌类中的方法。
  • 内部类的类体中不可以声明类的变量和类方法。外嵌类的类体中可以用内部类声明对象,作为外嵌类的成员。
  • 内部类仅供它的外嵌类使用,其他类不可以用某个类的内部类声明对象。

1、普通内部类

普通内部类,又称为成员内部类,在内部类类体中可以声明内部类的成员变量、构造方法、、实例方法。

public class Test
{
	String name="李四";
	
	//普通内部类
	class inner{                     //内部类开始
	    String name;
	    public inner(){
	    	name="张三";
	    }
	    
	    public void demo(){
	    	System.out.println("这是普通内部类");
	    	System.out.println("内部类变量=="+this.name);
	    	//内部类调用外嵌类变量
	    	System.out.println("外嵌类变量=="+Test.this.name);
	    }
	}                               //内部类结束
	public static void main(String[] args)
	{
		//创建外嵌类变量
		Test m=new Test();
		System.out.println("外部类变量=>"+m.name);
		//创建内部类对象
		inner i=m.new inner();
		System.out.println("内部类变量=>"+i.name);
		i.demo();		
	}
}

但是内部类类体中不能有staitc修饰的块、变量和方法!

2、静态内部类

静态内部类的类体中可以有成员变量、构造方法、实例方法、Static变量、Static块、Static方法。

public class Test
{
	static String name="李四";
	
	//静态内部类
	static class inner{                     static //内部类开始
	    String name;
	    static int age;
	    static {
	    	age=4;
	    }
	    public inner(){
	    	name="张三";
	    }
	    
	    public void demo(){
	    	System.out.println("这是普通内部普通方法");
	    	System.out.println("内部类变量姓名=="+this.name);
	    	System.out.println("内部类变量年龄=="+this.age);
	    	/*
	    	 * 普通内部类调用外嵌类变量
	    	  System.out.println("外嵌类变量=="+Test.this.name);
	    	 */
	    	//静态内部类调用外嵌类变量
	    	System.out.println("外嵌类变量=="+Test.name);
	    }
	    
	    public static void demo2() {
	    	System.out.println("这是普通内部类静态方法");
	    	System.out.println("外嵌类变量姓名=="+Test.name);
	    	System.out.println("内部类变量姓名2=="+name);
	    	System.out.println("内部类变量年龄2=="+age);
	    }
		
	}                               //内部类结束
	public static void main(String[] args)
	{
		//创建外嵌类变量
		Test m=new Test();
		System.out.println("外部类变量=>"+m.name);
		/*
		 * 静态内部类创建对象
		 inner i=m.new inner()
		 */
		
		//静态内部类创建对象
		inner i=new inner();
		System.out.println("内部类变量=>"+i.name);
		i.demo2();
				
	}
}

通过代码运行,得出以下结果:

  • 在静态内部类的非静态方法中,调用内部类的变量,不需要static修饰(但是用static修饰了,内部类的非静态方法也可以调用);调用外嵌类的变量时,外嵌类的变量必须要用Static修饰,否则会报错。
  • 在静态类的静态方法中,无论时调用内部类变量,还是外嵌类变量都要用Static修饰。

 3、局部内部类

局域内部类是指定义在方法中的内部类。不能用Static修饰。


public class Test1
{
	String name="张三";
	int age=5;
	
	public void demo(){
		System.out.println("----外嵌类实例方法---------");
		int heigh=18;
		String name="李四";
		class inner{                                              //内部类开始
			String city="西红市";
			String ph="123456";
			public inner() {
				System.out.println("这是局部内部类的构造函数");
				System.out.println("外嵌类方法中的变量=="+heigh);
				System.out.println("局部内部类变量=="+city);
				System.out.println("外嵌类变量=="+name);
				System.out.println("与内部类同名的外嵌类变量"+Test1.this.name);
			}
			
			public void indemo() {
				System.out.println("这是局部内部类的实例方法");
				System.out.println("外嵌类方法中的变量=="+heigh);
			}
		}                                                                //内部类结束
		inner i=new inner();
		i.indemo();
	}
	public static void main(String[] args)
	{
		Test1 t=new Test1();
		t.demo();
	}

}

通过代码运行,得出以下结果:

  • 在局部内部类中直接可以访问外部类的所有成员。 
  • 局部内部类中不能定义 static 成员
  • 局部内部类只在当前方法中有效,只能在实例方法中实例化。

4、匿名构造类

匿名构造类主要用对接口方法的重写。可以有效的减少代码量,提高效率。

interface Stu{
	void speak();
}

class StuAaction{
	public void turnOn(Stu stu)
	{
		stu.speak();
	}
}

public class Test2
{
	public static void main(String[] args)
	{
		StuAaction action=new StuAaction();
		action.turnOn(new Stu()                //和接口有关的匿名构造类
		{                                      //匿名构造类开始                     
			
			@Override
			public void speak()
			{
				System.out.println("努力学习");
				
			}
		});                                      //匿名构造类结束    
				
	}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值