内部类和静态内部类的调用方式

一、静态内部类的创建需要依赖外部类

二、非静态内部类

三、如何在成员内部类中区分调用外部类结构

四、开发当中,局部内部类的使用 

五、 内部类的示例

六、总结


简介 


内部类:
java中允许将一个类A声明在另一个类B中,则类A就是内部类,类B为外部类

内部类分类:成员内部类(静态,非静态) VS 局部内部类(方法内,代码块内,构造器内)

调用非静态外部结构:Person.this.eat();

 1 成员内部类:


    一方面:作为外部类的成员
          》调用外部类的结构
          》可被static修饰
          》可以被4种不同的权限修饰
          
    另一方面:作为一个类
          》类内部可以定义属性,方法,构造器等
          》可以被final修饰,表示此类不能被继承,言外之意不使用final、修饰可以被继承
          
          》可以被abstract修饰
          


  2 局部内部类:不能写任何权限修饰符 

 

  1.   因为局部成员的作用域是所在方法,其他程序单元永远不可能访问另一个方法中的局部变量,所以所有的局部成员都不能使用访问控制修饰符修饰。
  2.   局部内部类访问包含他的方法中的变量必须有final修饰; java8如果局部内部类中使用到变量默认final可以省略不写
  3.   如果局部内部类访问外部类的变量不用定义为final的,只有在访问包含他的方法中的变量需要定义为final

          
关注一下三问题
   1 如何实例化成员内部类
             //静态成员内部类创建
        Outer.InnerStatic innerStatic = new Outer.InnerStatic();
        innerStatic.show();
        //非静态成员内部类创建
        Outer.Inner inner = new Outer().new Inner();
        inner.sing();
   2 如何在成员内部类中区分调用外部类结构
            System.out.println(name); 形参
            System.out.println(this.name);内部类的属性
            System.out.println(Outer.this.name);外部类的属性
   3 开发当中,局部内部类的使用
    //局部内部类
    public Comparable getComparable() {   
        //方式一,显示实现类
       // 方式二 匿名内部类

       //创建一个实现Comparable接口的局部内部类
        class MyComparable implements Comparable {
            @Override
            public int compareTo(Object o) {
                return 0;
            }
        } return new MyComparable();
    }
   

 

一、静态内部类的创建需要依赖外部类

Out.Ind j=new Out.Ind();

 

//静态成员内部类创建
Outer.InnerStatic innerStatic = new Outer.InnerStatic();
innerStatic.show();

二、非静态内部类

Outside in=new Outside();

//在通过外部类对象创建一个内部类对象

Outside.Indoor oi = in.new Indoor();

 

 

Outer.Inner inner = new Outer().new Inner();
inner.sing();
System.out.println();
inner.display("AA");

三、如何在成员内部类中区分调用外部类结构

Outer.this.eat(); //调用外部方法
System.out.println(name); 形参
System.out.println(this.name);内部类的属性
System.out.println(Outer.this.name);外部类的属性

四、开发当中,局部内部类的使用 

//局部内部类
    public Comparable getComparable() {

        //创建一个实现Comparable接口的局部内部类
        //方式一,显示实现类
       // 方式二 匿名内部类
        class MyComparable implements Comparable {
            @Override
            public int compareTo(Object o) {
                return 0;
            }
        }

        return new MyComparable();
    }

五、 内部类的示例


public class Outer {

    String name = "小明" ;
    int age;
    String  salary = "200";

    public void eat() {
        System.out.println("吃饭");
    }

    public static void main(String[] args) {
        //静态成员内部类创建
        Outer.InnerStatic innerStatic = new Outer.InnerStatic();
        innerStatic.show();
        System.out.println();
        //非静态成员内部类创建
        Outer.Inner inner = new Outer().new Inner();
        inner.sing();
        System.out.println();
        inner.display("AA");
    }

    static class InnerStatic {
        String  name ;
        int age;

        public void show() {
            System.out.println("卡巴是条狗");

        }
    }

    class Inner {

        String name="杜鹃";
        int age;

        public void sing() {
            System.out.println("我是一只小小鸟");
            Outer.this.eat(); //调用外部方法
        }

        public void display(String name) {
            System.out.println(name);
            System.out.println(this.name);
            System.out.println(Outer.this.name);
            salary  = "aaa";
            System.out.println(salary);
        }


    }



    //局部内部类
    public Comparable getComparable() {

        //创建一个实现Comparable接口的局部内部类
        //方式一,显示实现类
       // 方式二 匿名内部类
      class MyComparable implements Comparable {
            @Override
            public int compareTo(Object o) {
                return 0;
            }
        }

        return new MyComparable();
    }

    public void hello () {
        String name  = "小鸟" ;

        class Bird {

            public void say () {
                salary ="bbb";
//                name = "ccc";  方法中name 被默认是定义为final 这里编译会报错
                System.out.println(salary);// 成员变量没有必要定义为final
                System.out.println(name);
            }
        }
    }
}

 

 

六、总结

不管是静态内部类还是非静态内部类都需要先new 外部的类。然后用外部的去直接点静态内部类或者 点new 非静态内部类

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值