关于java:java基础之十三内部类

成员外部类(类中的一个一般成员变量)


1、一个java文件中能够蕴含多个class,然而只能有一个public class
2、如果一个类定义在另一个类的外部,此时能够称之为外部类

应用

1、创立外部类的时候,跟之前的办法不一样,须要在内部类的后面增加外部类来进行润饰,如:InnerClassDemo.InnerClass innerClass = new InnerClassDemo().new InnerClass();

特点


1、外部类能够不便的拜访外部类的公有属性
2、外部类不能拜访外部类的公有属性(其余权限修饰符的属性也不行)、办法等等,只能将外部类的对象创立进去才能够办法属性和办法,如:System.out.println(new InnerClass().age);
3、一般的成员外部类中不能定义动态属性和静态方法(动态外部类中能够)
4、当外部类和外部类具备雷同的公有属性,在内部类中拜访的时候,间接拜访外部类的属性,如果须要拜访外部类的属性,如此:外部类的类名.this.属性名称
5、外部类能够嵌套多层,用法一样

示例

package com.msbline.innerclass;
public class InnerClassDemo {
    private int id;
    private String name="zhangsan";
    public void show(){
        System.out.println("show");
        //外部类拜访外部类的属性
 System.out.println(new InnerClass().age);
    }
    class InnerClass{
        private int age;
        private String name="lisi";
        public void test(){
            System.out.println("test");
            //能够拜访外部类的公有属性
 System.out.println(id);
            //同名属性默认拜访本人的外部属性
 System.out.println(name);
            //拜访外部类的同名属性
 System.out.println(InnerClassDemo.this.name);
        }
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
package com.msbline.innerclass;
public class TestInnerClass {
    public static void main(String[] args) {
        InnerClassDemo innerClassDemo = new InnerClassDemo();
        innerClassDemo.show();
        InnerClassDemo.InnerClass innerClass = new             InnerClassDemo().new InnerClass();
        innerClass.test();
    }
}

匿名外部类

当定义了一个类,实现了某个接口,在应用过程中只须要应用一次,没有其余用处,其实思考到代码编写的简洁,能够思考不创立具体的类,而采纳new interface(){增加未实现的办法},就叫做匿名外部类

示例

package com.msbline.innerclass;
public class NoNameInnerClassDemo {
    public static void main(String[] args) {
        //new Runnable看起来像是new了一个接口,实际上是new了一个Runnable的实现类
 new Thread(new Runnable() {
            @Override
 public void run() {
            }
        }).start();
    }
}

办法外部类

特色:
1、办法外部类不能定义成static
2、办法外部类外面也不能定义静态方法和属性
3、应用的时候只能在办法中创建对象,意外此class的作用域就是以后办法

示例

package com.msbline.innerclass;
public class MethodInnerClass {
    public void show(int b){
        System.out.println("show");
        class InnerClass{
            private String name;
            public void test(int a){
                System.out.println("test");
                System.out.println(a);
                System.out.println(b);
            }
        }
        new InnerClass().test(12);
    }
    public static void main(String[] args) {
        new MethodInnerClass().show(11);
    }
}

动态外部类


特色:
1、动态外部类合乎static的属性,只能拜访static润饰的内容(无论是拜访外部类还是外部类本人,都只能拜访static润饰的内容)
2、外部类能够拜访外部类的动态属性和办法,如:外部类名.属性名,外部类名.办法名,然而不能拜访外部类的非动态属性,只能通过创立外部类对象来拜访

示例

package com.msbline.innerclass;
public class StaticInnerClass {
    private static int id;
    private int gender;
    public void test(){
        //外部类拜访外部类的动态属性
 System.out.println(InnerClass.name);
        //外部类拜访外部类的一般属性
 System.out.println(new InnerClass().age);
        System.out.println("test");
    }
    static class InnerClass{
        private static String name;
        private String age;
        public static void show(){
            //拜访外部类的static属性和办法
 System.out.println(id);
            //不能拜访外部类的非static属性
//            System.out.println(age);
 //也不能拜访本人的非static属性
//            System.out.println(gender);
 System.out.println("show");
        }
        public void show1(){
            //拜访外部类的static属性和办法
 System.out.println(id);
            //不能拜访外部类的非static属性
//            System.out.println(age);
 //也不能拜访本人的非static属性
//            System.out.println(gender);
 System.out.println("show");
        }
    }
    public static void main(String[] args) {
        InnerClass innerClass = new StaticInnerClass.InnerClass();
        innerClass.show();
        innerClass.show1();
        //动态外部类的动态属性和静态方法跟一般类一样的拜访形式,能够不必new对象
 System.out.println(InnerClass.name);
        InnerClass.show();
//        InnerClass.show1();//非法
 }
}

总结


评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理