了解内部类

概念

内部类就是在一个类中继续定义一个类,内部类的好处就是方便内部类访问外币类的私有属性, 但是内部类在安卓开发中使用比较多。

定义内部类
package com.CoderLB;

public class Outer {
    private String name="张三";
    //定义一个内部类
    public class Inner{
        public void say(){

            //在内部类中访问外部类(Outer)的私有属性
            System.out.println("名字是:"+name);
        }
    }
    public void print(){
        //外部类的方法实例化内部对象
        new Inner().say();

    }

}



public class Test {
    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.print();

    }

}
//输出 名字是:张三

上述在内部类中直接访问了外部类的私有属性,但是内部类对象是在外部类中创建的,如果在外部类之外创建呢?在主方法内?

在这里插入图片描述
不能在外部类之外直接创建内部类对象。因为内部类对象依赖于外部类对象存在。如果实例化内部类对象需要先实例化外部类对象。

实例化内部类对象
package com.CoderLB;


import com.baidu.vo.Dept;

public class Test {
    public static void main(String[] args) {
        new Outer().new Inner().say();
    }

}
//输出:名字是:张三

小结1

  1. 内部类能直接访问外部类的私有属性
  2. 内部类对象是依赖于外部类对象存在的,如果要取得内部类对象则需要先实现外部类对象。

静态内部类

使用static修饰的变量是静态变量,使用static修饰的方法是静态方法,静态变量和静态方法都不依赖对象存在(直接属于类),同理使用修饰的内部类就是静态内部类,又同理,静态内部类依赖于外部类的存在,可以直接在外部类之外实例化静态内部类对象。

定义静态内部类

问题:
在这里插入图片描述无法从静态上下文中引用非静态 变量 name
(静态内部类中不能访问外部类的费静态属性(name))

package com.CoderLB;

public class Outer {
    private static String name="张三";
    //定义一个内部类
    public static class Inner{
        public void say(){

            //在内部类中访问外部类(Outer)的私有属性
            System.out.println("名字是:"+name);
        }
    }
    public void print(){
        //外部类的方法实例化内部对象
        new Inner().say();

    }

}

public class Test {
    public static void main(String[] args) {
        Outer.Inner inner = new Outer.Inner();
        inner.say();
    }

}
//输出:名字是:张三

静态内部类实例化的时候是直接创建的,没有先创建外部类对象。所以静态内部类对象是不依赖外部类对象存在的。

小结2

1. 静态内部类不能访问外部类的非静态属性
2. 静态内部类对象不依赖于外部类对象

方法内部类

就是在方法中直接定义一个内部类,之后直接使用这个内部类对象的方法。

方法中定义内部类
package com.CoderLB;


import com.baidu.vo.Dept;

public class Test {
    public static void main(String[] args) {
        //调用fun方法
        fun();

    }
    public static void fun(){
        class Inner{
            public void say(){
                System.out.println("我是方法中的内部类");
            }
        }
     //就在该方法中实例化内部类对象
     new Inner().say();
    }

}
//输出:我是方法中的内部类
访问方法的参数和局部变量
package com.CoderLB;


import com.baidu.vo.Dept;

public class Test {
    public static void main(String[] args) {
        //调用fun方法
        fun("李四");

    }
    public static void fun( final String name){
        final int  age=10;
        class Inner{
            public void say(){
                System.out.println("我是方法中的内部类");
                System.out.println("名字是"+name);
                System.out.println("年龄是"+age);
            }
        }
     //就在该方法中实例化内部类对象
     new Inner().say();
    }

}
//输出:
我是方法中的内部类
名字是李四
年龄是10

方法中的内部类在jdk1.8版本之前如果访问方法的参数和局部变量需要使用final修饰变量和参数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值