006—Java内部类

成员内部类:
    1.位置
        class 外部类名{
            class 内部类名{}
        }

2.外部类只能使用 public default 修饰
   成员内部类 可以被四种权限修饰符修饰
3.在内部类中可以直接使用外部类的所有资源

4.外部类中可以使用内部类资源

5.可以采用内部类实现多继承的效果
    让内部类 外部类都去继承另一个类

6.内部类中不能声明静态的资源 但是可以有静态的常量

7.内部类会产生独立的字节码文件 命名方式
  外部类名$内部类名.class
  Outer$Inner.class

8.如果内部类与外部类又同名的属性
   访问外部类的属性 外部类名.this.属性名

成员内部类对象的创建的两种方式

必须用外部类对象.new的方式

Outer outer = new Outer()

方式一

                Outer.Inner inner = outer.new Inner()

方式二

                Outer.Inner inner = new Outer.new Inner()

静态成员内部类:
    1.位置
       class 外部类名{
            static class 内部类名{
            }
       }
   2.静态内部类可以有静态的资源
   3.静态内部类 不能【直接】使用 外部类的非静态资源
       可以创建外部类对象使用 外部类的非静态资源
   4.可以实现多继承的效果
   5.外部类使用静态内部类资源
        静态资源 内部类名.资源名
        非静态资源 内部类对象名.资源名
   6.静态内部类又独立的字节码文件
      命名方式 外部类名$内部类名.class
      Outer$Inner.class
   7.使用内部类资源
     7.1内部类静态资源
       外部类名.内部类名.资源名;
     7.2内部类非静态资源
      外部类名.内部类名 对象名 =   new 外部类名.内部类名();
      Outer.Inner inner = new Outer.Inner();

局部内部类:
    位置:方法内
   1.局部内部类使用外部类资源
     1.1 如果局部内部类在普通方法中 可以直接使用外部类所有资源
     1.2 如果局部内部类在静态普通方法中 可以直接使用外部类静态资源
   2.局部内部类 只能被 权限修饰符 default 修饰  不能使用static 可以使用 final abstract

   3.局部内部类中不能有静态的资源 但是可以有静态常量

   4.局部内部类也会产生独立的字节码文件 命名方式
     外部类名$序号内部类名.class
     Outer$1A.class
     Outer$2A.class  序号从1开始

   5. 如果局部内部类中 使用了方法中的局部变量  那么 此变量 会被final修饰
      jdk8之前  手动添加final
      jdk8(含)之后  自动添加final

package com.atguigu.innerclass.in3;

public class Test {
    public static void main(String[] args) {
        A a = getValue();// A a = new B();
        int num = a.getNum();
        System.out.println("num = " + num);
    }

    public static A getValue(){
        int m = 10;
        class B implements A{
            @Override
            public int getNum() {
                return m;
            }
        }
        B b = new B();
        return b;

    }
}

interface A{
    int getNum();
}

 

 

public static void main(String[] args) {

        int m = new Object(){
            @Override
            public int hashCode() {
                return 10;
            }
        }.hashCode();

        String s = new Object(){
            @Override
            public int hashCode() {
                return 10;
            }
        }.toString();
        System.out.println(s);
    }

 

匿名内部类:
    没有名字的内部类
  1.创建匿名内部类的形式
    1.1 new 类名(构造器){};
    1.2 new 接口名(){};
  2.创建匿名内部类 会有两个作用
     2.1创建了该类/接口的匿名子类
     2.2创建了该/接口匿名子类对象

  3.匿名内部类会生成独立的字节码文件
    命名方式 外部类名$序号.class
            Test$1.class

   4.匿名内部类是特殊的局部内部类   在方法中

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值