Java内部类全介绍

内部类

  1. 静态内部类
  2. 成员内部类
  3. 局部内部类
  4. 匿名内部类(属于局部内部类的一种)

1. 静态内部类

  • 静态内部类可以等同看作静态变量

  • 内部类的重要作用:

    • 可以访问外部类中的私有数据
  • 静态内部类可以直接访问外部类的静态数据(静态变量,静态方法),无法直接访问成员(实例变量,实例方法)

    class OuterClass {
    	// 静态变量
    	private static String s1="A";
    	//实例变量
    	private String s2 = "B";
    	//静态方法
    	private static void m1() {
    		System.out.println("static's m1() method executed");
    	}
    	//实例方法
    	private void m2() {
    		System.out.println("m2() method executed");
    	}
    	
    	// 定义静态内部类,可以使用 public, private, protected, default修饰
    	static class InnerClass{
    		// 静态方法
    		public static void m3() {
    			
    			System.out.println("static's m3() method executed");
    			System.out.println(s1);
    			m1();
    //			System.out.println(s2);
    //			m2();
    		}
    		// 成员方法
    		public void m4() {
    			System.out.println("m4() method executed");
    			System.out.println(s1);
    			m1();
    //			System.out.println(s2);
    //			m2();
    		}
    	}
        public static void main(String[] args) {
    		//执行m3
    		OuterClass.InnerClass.m3();
    		
    		// 执行m4
    		OuterClass.InnerClass inner = new OuterClass.InnerClass();
    		inner.m4();
    	}
    	
    }
    
    

2. 成员内部类

  • 成员内部类可以等同看作成员方法

  • 成员内部类中不能有静态声明

    • 包括静态变量和静态方法
  • 成员内部类可以访问外部类的所有数据

    public class MemberInnerClass {
    	// 静态变量
    	private static String s1="A";
    	//实例变量
    	private String s2 = "B";
    	//静态方法
    	private static void m1() {
    		System.out.println("static's m1() method executed");
    	}
    	//实例方法
    	private void m2() {
    		System.out.println("m2() method executed");
    	}
    	
    	// 定义静态内部类,可以使用 public, private, protected, default修饰
    	class InnerClass{
    		// 静态方法// 成员内部类中不能有静态方法
    //		public static void m3() {
    //			
    //			System.out.println("static's m3() method executed");
    //			System.out.println(s1);
    //			m1();
    				System.out.println(s2);
    				m2();
    //		}
    		// 成员方法// 成员内部类可以访问外部类的所有数据
    		public void m4() {
    			System.out.println("m4() method executed");
    			System.out.println(s1);
    			m1();
    			System.out.println(s2);
    			m2();
    		}
    	}
    	public static void main(String[] args) {
    		// 创建外部对象
    		MemberInnerClass mic = new MemberInnerClass();
    		InnerClass inner = mic.new InnerClass();
    		inner.m4();
    	}
    
    }
    

3. 局部内部类

  • 局部内部类等同于局部变量

  • 局部内部类不能用访问权限控制修饰符修饰

    • 局部变量也没有见过用public等修饰符修饰的(=_=)
  • 局部内部类中不能有静态声明(包括静态变量和静态方法)

  • 局部内部类中访问内部类外的局部变量必须是final

    -也可以不是final的,只要后续不在局部内部类改变这个变量的值就可以啦

  • 局部内部类相当于局部变量,出了大括号{}之后就没人认识了

    • 要使用局部内部类中的方法,必须在局部内部类外,创建局部对象
    public class TempInnerClass {
    	public void m1() {
    		final int i = 10;
    		// 声明局部内部类时候,class前面不能加访问控制修饰符
    		class InnerClass{
    //			public static void m1() {// 局部内部类中不能有静态声明
    //			};
    			public void m1() {
    				//Local variable i defined in an enclosing scope must be final or effectively final
    				System.out.println(i);// 局部内部类调用内部类外的变量时候,变量必须是final的或者是有效的final的
    			}
    		}
    //		i = 100;
    		// 调用局部内部类中的方法
    		InnerClass inner = new InnerClass();
    		inner.m1();
    	}
    	public static void main(String[] args) {
    		new TempInnerClass().m1();
    	}
    }
    

4. 匿名内部类

指的是:类没有名字
一般用于接口的实现

  • 优点:少定义一个类

  • 缺点:无法重复使用

    
    public class NamelessInnerClass {
    	
    	public static void t(CustomeService cs) {
    		cs.logout();
    	}
    	
    	public static void main(String[] args) {
    		//如何调用t方法??
    //		1. 新建一个类,实现CustomeService接口
    		t(new CustomeServiceImp());
    //		2. 使用匿名内部类
    			// new CustomeService() {} 这些全都属于匿名内部类
    		t(new CustomeService() {
    
    			@Override
    			public void logout() {
    				System.out.println("匿名内部类:成功退出程序");
    			}
    			
    		});
    	}
    }
    
    interface CustomeService{
    	void logout();
    }
    
    class CustomeServiceImp implements CustomeService{
    
    	@Override
    	public void logout() {
    		System.out.println("成功退出程序");
    	}
    	
    }
    
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tailor_long

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值