java基础之十三->内部类

成员内部类(类中的一个普通成员变量)

java基础之十三->内部类_第1张图片
1、一个java文件中可以包含多个class,但是只能有一个public class
2、如果一个类定义在另一个类的内部,此时可以称之为内部类

使用

1、创建内部类的时候,跟之前的方法不一样,需要在内部类的前面添加外部类来进行修饰,如:InnerClassDemo.InnerClass innerClass = new InnerClassDemo().new InnerClass();

特点

java基础之十三->内部类_第2张图片
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(){添加未实现的方法},就叫做匿名内部类
java基础之十三->内部类_第3张图片

示例

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();
    }
}

方法内部类

java基础之十三->内部类_第4张图片

特征:
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);
    }
}

静态内部类

java基础之十三->内部类_第5张图片
特征:
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();//非法
 }
}

总结

java基础之十三->内部类_第6张图片
java基础之十三->内部类_第7张图片

你可能感兴趣的:(java)