Java.内部类


概述

  • 内部类是在一个类的内部定义的一个类
  • 内部类可以分为四种:成员内部类局部内部类匿名内部类静态内部类
  • 内部类可以通过private、protected修饰符很好的实现隐藏
  • 内部类可以访问外部类所有成员
  • 外部类不能直接访问内部类成员,需先建立内部类的对象后访问

⭐️成员内部类

  • 成员内部类属于外部类的示例成员,可以通过public、default、protected、private修饰

  • 在成员内部类中要访问外部类的成员应采用 外部类.this.成员变量/方法 的形式

  • 创建成员内部类的实例化之前要先创建外部类对象,然后使用 外部类名.内部类名 实例 = 外部类实例名.new 内部类() 的形式创建内部类的对象

  • 一般定义格式:

    class Outer{
    	
    	...//外部类
    	
        class Inner{
    		...//内部类
        }
    }
    
  • 使用示例:

    class Outer{
    	
    	private int data;
    	
    	void print(){
    		System.out.println("外部类打印");
    		Inner i = new Inner();
    		System.out.println("外部类数据:"+data+";内部类数据:"+i.data);
    	}
    	
        class Inner{
        	private int data;
        	void print(){
        		System.out.println("内部类打印");
        		System.out.println("内部类数据:"+data+";外部类数据:"+Outer.this.data);
        	}
        	Inner() {
        		data = 888;			
    		}
        }
        
        Outer() {
        	data = 666;
    	}
    }
    	
    public class Test {
    	public static void main(String[] args) {
    		Outer o = new Outer();
    		Outer.Inner i = o.new Inner();
    		o.print();
    		i.print();
    	}
    }
    
  • 输出:

    外部类打印
    外部类数据:666;内部类数据:888
    内部类打印
    内部类数据:888;外部类数据:666	
    

⭐️匿名内部类

  • 匿名内部类是没有名称的内部类,没有办法去引用它们。必须在创建时作为new语句的一部分来声明并创建它们的实例。

  • 匿名内部类必须继承一个类或者实现一个接口。父类或接口的抽象方法匿名内部类必须去实现它。

  • 匿名内部类中不能存在任何静态成员或方法。

  • 格式为 new 接口名/父类名() {类体}

  • 示例:

    interface A{ //接口A
    	abstract void print();
    }
    
    class B{  //父类B
    	void print(){
    		System.out.println("B类打印");
    	}
    }
    class Outer{
    	
    	A a = new A(){
    		public void print(){
    			System.out.println("匿名类打印");
    		}
    	};
    	
    	Outer() {
    		a.print();
    		new B().print();
    	}
    }
    	
    public class Test {
    	public static void main(String[] args) {
    		Outer o = new Outer();
    	}
    }
    
  • 输出:

    匿名类打印
    B类打印
    

静态内部类

  • 静态内部类和成员内部类相比多了一个static修饰符。它与类的静态成员变量一般,是不依赖于外部类的。

  • 因为是静态的,因此不需要外部类实例化即可使用。可以访问外部类的静态成员和静态方法。但是于此同时,静态内部类中也无法访问外部类的非静态成员。

  • 访问外部类的成员直接以 外部类.成员变量/方法 的形式访问。

  • 静态内部类对象的创建 外部类.内部类 类名 = new 外部类.内部类()

  • 示例

    class Outer{
    		
    		private static int data;
    		
    		static class Inner{
    	    	
    	    	Inner() {
    	    		System.out.println("data:"+Outer.data);			
    			}
    	    }
    	    
    	    static{
    	    	data = 666;
    	    }
    	}
    		
    public class Test {
    	public static void main(String[] args) {
    		Outer o = new Outer();
    		Outer.Inner i = new Outer.Inner();
    	}
    }
    
  • 输出:

    data:666
    

局部内部类

  • 局部内部类存在于方法中。

  • 局部内部类和成员内部类的区别在于局部内部类的访问权限仅限于该方法。虽然可以引用方法内成员变量,但该成员必须声明为 final

  • 局部内类不允许使用访问权限修饰符和static修饰符。

  • 示例:

    class Outer{
    		
    		void show(final int a,final int aa){
    			
    			class Inner{
    		    	void print(){
    		    		System.out.println(a+"的平方是"+aa);
    		    	}
    		    }
    			
    			new Inner().print();
    		}
    		
    		
    	}
    		
    public class Test {
    	public static void main(String[] args) {
    		int a = 6;
    		Outer o = new Outer();
    		o.show(a,a*a);
    	}
    }
    
  • 输出:

    6的平方是36
    

❤️ 本回完!❤️ ❤️ ❤️

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

money的大雨

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

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

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

打赏作者

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

抵扣说明:

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

余额充值