Java 内部类

内部类

1.内部类种类:成员内部类、静态内部类、局部(方法)内部类、匿名内部类

2.内部类优点

  • 可以有多个独立的实例,对其他外部类对象没有干扰

  • 内部类是一个独立的实体

  • 内部类提供了更好的封装,只有该类的外部类可以访问

  • 内部类的创建不依赖外部类的创建

内部类的使用

  • 成员内部类

特点:要使用成员内部类的对象,外部类的对象必须存在

public class Outer{
    private int outerVariable = 10;//外部类独有
    private int commonVariable = 20;//重名变量
    private static int outerStaticVariable = 30;//静态变量
    public Outer(){
        System.out.println("Outer被创建....");
    }
    public void outerMethod(){
        System.out.println("我是外部类的普通成员方法");
    }
    public static void outerStaticMethod(){
        System.out.println("我是外部类的静态成员方法");
    }
    //内部类
    public class Inner{
        priavte int commonVariable = 40;//和外部类重名的属性
        public Inner(){
            System.out.println("Inner被创建...");
        }   
        public void innerShow(){
            System.out.println("内部类自己属性:"+commonVariable);
            System.out.println("访问外部类的属性"+outerVariable);
            System.out.println("访问外部类重名的属性"+Outer.this.commonVariable);
            System.out.println("访问外部类静态属性"+outerStaticVariable);
            outerMethod();
            outerStaticMethod();
        }
    }
    //访问内部类信息
    public void outerShow(){
        //首先获取内部类对象
        Inner inner = new Inner();
        inner.innerShow();
    }
}

外部实例化

public class OuterTest{
    public static voidmain(String[] args){
        //1创建外部类对象调用
        Outer outer = new Outer();
        outer.outerShow ();
      System.out.println("-----------------------------");  
        //2通过外部类对象创建内部类对象
        Outer.Inner inner = Outer.new Inner();
        inner.innerShow();
    }
}

总结

1.创建内部类 和类的创建相似,可以继承,可以实现。方法该重写的重写。 2.可以使用任何访问权限控制符。 3.内部类不能存在静态修饰内容(静态代码块、静态属性、静态方法) 4.外部类想访问内部类,需要创建内部类对象进行使用。 5.内部类想访问外部类信息,直接使用,如果存在重名(属性、方法)。外部类类名.this.重名(方法名、属性)

运行结果

 

  • 静态内部类

特点:静态内部类,把外部类当作特殊的包使用,所以实例化时new 后面的Demo不需要小括号(和成员内部类区别)。

public class Demo {
    String name;                            //属性
    public void funOuter1() {               //方法
        System.out.println("外部类方法");
    }
//静态内部类
    static class StaticClass{
        
    }
}

外部实例化

public class Client {
    public static void main(String[] args) {
        //静态内部类,把外部类当作特殊的包使用
        Demo.StaticClass staticClass = new Demo.StaticClass();
    }
}

总结 1.静态内部类包含所有类创建信息 2.静态内部类只能访问外部类所有静态信息(属性、方法) 3.利用 外部类名称.内部类名称 变量名 = new 外部类名称.内部类(); 变量名.属性/方法 实例化 4.内部类是独立存在,并不依靠外部类。只有在内部类中调用外部类信息时,外部类才会加载到jvm虚拟机中。

  • 局部(方法)内部类

特点:可以在方法中定义,并实例化,但使用地方仅局限在此方法中。

public class MethodOuter {
    private int outerVariable = 10;//外部类独有
    private int commonVariable = 20;//重名变量
    private static int outerStaticVariable = 30;//静态变量
    public MethodOuter(){
        System.out.println("Outer被创建....");
    }
    static{
        System.out.println("我是外部类的静态代码块");
    }
//成员方法
    public void outerMethod(){
        System.out.println("我是外部类的普通成员方法");
    }
//静态成员方法
    public static void outerStaticMethod(){
        System.out.println("我是外部类的静态成员方法");
    }
//成员方法,内部类定义在方法中
    public void outerCreateMethod(int value){
        boolean b = true;
        int a ;
        a = 40;
    /*private 错误,局部内部类中不能使用权限修饰符 */
        class Inner{
            private int innerVariable = 40;
            private int commonVariable = 50;
                //局部内部类方法定义
            public void innerShow(){
                System.out.println("inner内部属性"+innerVariable);
                //访问方法中属性
                System.out.println("方法中参数"+b);
                System.out.println("方法参数中属性"+value);
                System.out.println("方法中为赋值参数"+a);
                //访问外部类信息
                System.out.println("outVariable"+outerVariable);
                System.out.println("内部类中重名"+commonVariable);
                System.out.println("外部类中重                       名"+MethodOuter.this.commonVariable);
                System.out.println("外部类中静态"+outerStaticVariable);
                //方法的访问
                outerMethod();
                outerStaticMethod();
                }
            }
        //局部内部类只能在方法内使用
        Inner inner = new Inner();
            inner.innerShow();
        }
        public static void main(String[] args) {
        //1.创建外部类对象
            MethodOuter outer = new MethodOuter();
        //2.调用包含内部类的方法
            outer.outerCreateMethod(100);
        }
}

总结 1.类前不能有访问修饰符 2.内部类仅能在方法内使用 3.无发创建静态信息 4.可以直接访问方法内的变量及参数,但是有限制(访问的变量或者参数必须赋值,且复制后不能发生改 变。在jdk1.8以前版本,局部内部类 只能访问final修饰的变量) 5.可以随意访问外部类的任何信息。

  • 匿名内部类

1.创建一个类(开发中常用于接口的实现)

 public interface Anoymous {
        void sayHello();//根据不同人说您好
    }

2.使用(直接创建接口对象/其父类对象/)

public static void main(String[] args) {
        Anoymous an = new Anoymous(){
            @Override
            public void sayHello() {
                System.out.println("中国人说:Hello");
            }
        };
        an.sayHello();
    }
public static Anoymous getAnoymous(){
    return new Anoymous() /*创建对象阶段 class XXX implements Anoymous*/{
    @Override
    public void sayHello() {
        System.out.println("英国人说:hello");
    }
};//子类对象;
    
public static void main(String[] args) {
    AnonymousClass.getAnoymous().sayHello();
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值