加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java中的内部类

发布时间:2020-12-15 08:01:28 所属栏目:Java 来源:网络整理
导读:一,静态内部类 它是用static修饰的,在访问限制上它只能访问外部类中的static所修饰的成员变量或者是方法 public class OuterClass1 { private String name1; private static String name2; public static class InnerClass{ public void sayHello(){ Syste

一,静态内部类

它是用static修饰的,在访问限制上它只能访问外部类中的static所修饰的成员变量或者是方法

public class OuterClass1 {
    private String name1;
    private static String name2;

    public static class InnerClass{
        public void sayHello(){
            System.out.println("hello "+name2);
        }

        public void getOuterName(String name){
            //静态内部类不能应用外部类的非静态的长远变量
            //name1 = name;
        }

        public static void test(){
            System.out.println("内部static方法");
        }
    }

    public static void main(String[] args) {
        InnerClass.test();
        InnerClass innerClass = new InnerClass();
        innerClass.sayHello();
    }
}

?

?

二,成员内部类

成员内部类是最普通的内部类,它可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。

public class OuterClass2 {
    private String name;
    private static String name2;

    public OuterClass2(String name){
        this.name = name;
    }

    /**
     * 方法内部类访问外部类变量时,无论外部类变量时静态或非静态,若变量名相同,则用“外部类名.this.变量名”
     * 若不相同,直接用变量名进行访问。和成员内部类相似。
     * 若果方法名相同,也是一样到道理  外部类名.this.方法名称()。
     */
    public class InnerClass{
        public void sayHello(){
            System.out.println("hello "+name);
        }

        public void getOuterName(String name){
            OuterClass2.this.name = name;
        }

        //内部类为成员变量时,非静态时,不能有静态方法
//        public static void test(){
//            System.out.println("内部static方法");
//        }
    }

    public InnerClass getInnerClass(){
        return new InnerClass();
    }

    public static void main(String[] args) {
        //不能从静态方法中创建InnerClass
        //InnerClass innerClass = new InnerClass();
        OuterClass2 outerClass2 = new OuterClass2("李四");
        InnerClass innerClass1 = outerClass2.getInnerClass();
        innerClass1.sayHello();
    }
}

当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的是成员内部类的成员。如果要访问外部类的同名成员,需要以下面的形式进行访问:

?   ? 外部类.this .成员变量
    外部类. this .成员方法

?

三,局部内部类

局部内部类是定义在外围类的方法中的,在访问的时候它可以直接访问外围类的所有成员!但是不能随便访问局部变量,除非这个局部变量被final修饰。

public class OuterClass3 {
    private String name;
    private static String name2 = "张三";

    public OuterClass3(String name){
        this.name = name;
    }

    public void foo(){
        final int i = 22;
        class InnerClass{
            public void test(){
                System.out.println(i);
                System.out.println(name);
                System.out.println(name2);
            }
        }
        InnerClass innerClass = new InnerClass();
        innerClass.test();
    }

    public static void main(String[] args) {
        OuterClass3 outerClass3 = new OuterClass3("Jack");
        outerClass3.foo();
    }
}

?

?

四,匿名内部类

1、匿名内部类其实就是局部内部类的简写格式,只能使用一次。
2、定义匿名内部类的前提:内部类必须是继承一个类或者实现接口。
3、匿名内部类的格式:??new 父类或者接口(){定义子类的内容}
4、其实匿名内部类就是一个匿名子类对象,可以理解为带内容的对象。
5、匿名内部类中定义的方法最好不要超过3个。

public interface Sender {
    public void send();
}

?

public class EmailSender {

    public Sender method(){
        return new Sender() {
            @Override
            public void send() {
                System.out.println("AAA");
            }
        };
    }
}

?

public class OuterClass4 {

    public static void main(String[] args) {
        Sender sender = new Sender() {
            @Override
            public void send() {
                System.out.println("aaa");
            }
        };
        sender.send();
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读