JAVA内部类梳理

根据定义位置分类

定义在外部类的局部位置上

(1)局部内部类 (有类名)

局部内部类定义在外部类的局部位置上 ,通常在方法

不能添加访问修饰符,但可以使用final 修饰

作用域 :仅在它作用的方法或者代码块中

局部内部类可以直接访问外部类的成员

外部类在方法中可以创建 局部内部类实例 调用其方法
代码实现

class Outer {
		private int n1 = 100 ;
		private void m2 (){
		System.out.println("m2被调用");
		}
		public void m1(){
		
		final class Inner1 (){//局部内部类
		
		public void f1() {
				System.out.println("调用局部内部类方法");
				
				m2() ; //在局部内部类调用外部类方法
				
				}
		}
		Inner1 inner1 = new Inner1(); //在外部类实例化 局部内部类 
		
		inner1.f1() ; // 在外部类调用 局部内部类方法

		}		
				 

(2)匿名内部类 (没有类名)

为什么使用匿名内部类?

需求 是 类只是用一次,后面不再使用 ,可以用匿名内部类用来简化开发
匿名内部类 是系统分发类名 

规范:
外部类名+$+编号 ;----->可用getClass() 来获取运行类型

匿名内部类本质还是一个类 但该类没有名字 同时它也是一个对象

基本语法 :

new 类或接口 (参数列表){
--------类体----------
}

基于类和抽象类的匿名内部类

	public class Hello {
    /*
    匿名内部类的演示
     */
    public static void main(String[] args) {

        Father jack = new Father("jack"){
            @Override   //匿名内部类重写 tast 方法
            public void test() {
                System.out.println("tast重写");
            }
        };
        System.out.println("jack 的运行类型"+ jack.getClass());

        Animal animal = new Animal(){
            @Override
            void eat() {
                System.out.println("重写抽象类 eat方法");
            }
        };

        //输出 animal 运行类型
        System.out.println("animal 运行类型是 "+animal.getClass());

    }
}


class Father{
    public Father(String name){
        super();
    }


    public void test()  {

    }
}

abstract class Animal  {
    //基于抽象类的 匿名内部类
    abstract void eat();
}

定义在外部类的成员位置上

(1)成员内部类

1.可以使用所有访问修饰符修饰 —>本质上来说属于外部类的一个成员
2.可以访问外部类的所有成员 ,包括私有
3.作用域 和其他外部类的成员一样 ,为整个类体

成员内部类 ----访问 ----外部类成员 —(直接访问)
外部类—访问----成员内部类 访问方式 :创建对象 ,再访问
外部其他类 ---- 访问 ----成员内部类 三种方式
外部类.成员内部类 变量名 = new 变量名.成员内部类
在外部类中写一个方法 返回成员内部类的一个实例

7 ,如果外部类成员名 和内部类成员名重名时 遵循就近原则

 可以通过 外部类名.this.属性 来访问外部类属性
public class Taxe02 {
    public static void main(String[] args) {

        Outer outer = new Outer(); //实例化外部类

        Outer.Inner01 inner01 = outer.getInner01(); //实例化 成员内部类
        inner01.f1();  //调用 成员内部类 f1() 方法
        
        inner01.f2(3); //调用 成员内部类 f2() 方法
        
    }
}

class Outer {
    private int n1 = 100 ;

    Inner01 inner01 =new Inner01(); //在外部类 中实例化 成员内部类

    public Inner01 getInner01() {
        //该方法返回一个 成员内部类实例
        return inner01;
    }

    public class Inner01{  //定义 成员内部类

        public void f1(){ //定义成员内部类方法1

            System.out.println("调用成员内部类");

        }

        public void f2(int i){ //定义成员内部类方法2    该方法使用外部类 私有属性 n1
            System.out.println(i+n1);

        }
    }
    
}

(2)静态内部类

定义位置 定义在外部类的成员位置上 用static 修饰

可以访问外部类的所有静态成员 包括私有 但不能访问非私有成员

可以使用所有访问修饰符 ----->本质还是外部类的一个成员

作用域和其他外部类成员一样为整个类体

访问形式 :

静态内部类—访问----外部类静态成员 ----直接访问

外部类—访问—>静态内部类 创建对象

外部其他类 ---- 访问 ----成员静态内部类

代码实现 :

public class test03 {
    public static void main(String[] args) {
        int n2 = Outer2.Inner01.n2;
        System.out.println(n2); //输出 静态内部类 中静态属性

        Outer2.Inner01.fi(); //调用 静态内部类方法

    }
}


class Outer2 {
    public  static int n1 = 100 ;


    public static class Inner01{

        static int n2 =11 ; //静态内部类 中 静态属性
        int n3 = 22 ;  //静态内部类 中 普通属性

        static void fi(){ // 静态内部类 中 静态方法
            System.out.println("调用fi方法"+(n1+n2));

        }
        public void fz(){ //静态内部类 中 普通方法
            System.out.println(n3);

        }
    }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值