浅谈附属类,内部类,匿名内部类,静态内部类

一、附属类
附属类只能用默认的访问修饰符,没有静态附属类
二、内部类
1、内部类一般定义成private,直接在类中其他方法中调用;
2、内部类地位可以想象成类中的方法,内部类可以随意使用外部类的成员变量;

public class A {
    private String name = "张三";
    private static int num = 001;
    public float score = 90.0f;

    public void study() {
        System.out.println("学生学习");
    }

//内部类,随意访问外部类的成员变量,局部变量访问不到
    private class B {
        public void learn() {
            System.out.println(name + num + score);
        }
    }
}

3、内部类中与外部类有同名变量的情况下,内部类中变量会覆盖外部类的成员变量,访问外部类的成员变量需要使用“外部类名.this.属性名”

public class A {
    private String name = "张三";
    private static int num = 001;
    public float score = 90.0f;

    public void study() {
        System.out.println("学生学习");
    }

    private class B {
        private String name = "李四";
        public void learn() {
        //name = this.name = "李四";---内部类中的成员属性
        //A.this.name = " 张三" ---外部内中的成员属性
            System.out.println(name + num + score + A.this.name);
        }
    }
}

4、若内部类想在外部类中访问,需要先创建外部类对象,再创建内部类对象,通过外部类new一个内部类引用地址,最后通过内部类对象调用方法

public class A {
    private String name = "张三";
    private static int num = 1;
    public float score = 90.0f;

    public void study() {
        System.out.println("学生学习");
    }

    public class B {
        public void learn() {
            System.out.println(name + num + score );
        }
    }
}
public class Main {

    public static void main(String[] args) {
    // 先创建外部类对象
        A a = new A();
    //通过外部类对象new一个内部类的引用地址
        B b = a.new B();
    //通过内部类对象调用内部类中的方法
        b.learn();

    }

}

输入结果:张三190.0

5、内部类若调用外部类的方法,直接用外部方法名();

public class A {
    public String name = "张三";

    public void study() {
        System.out.println(name + "在学习");
    }

    public class B1 {
        public void exam() {
         //调用外部类的study()方法
            study();
            System.out.println(name + "在考试");
        }
    }
}
public class Main {

    public static void main(String[] args) {
        A a = new A();
        B1 b = a.new B1();
        b.exam();
    }
}

三、匿名内部类
1、匿名内部类是放在方法里面的,匿名内部类是new类型的子类,在创建对象的时候继承父类或者实现一个接口,用创建对象调用方法是调用的匿名内部类中重写的方法,若不是重写的方法,调用的则是创建对象时的里面自己本身的方法

public class A {
    private String name = "张三";
    public void study() {
        System.out.println(name + "在学习");
    }

}
public class Main {

    public static void main(String[] args) {
        A a = new A() {
        //匿名内部类
            public void study() {
                System.out.println("匿名内部类重写的方法");
            }
        };
        //调用的匿名内部类中重写的方法
        a.study();
        }
        //再创建一个A类对象a1,里面写一个A子类中独有的方法
        A a1 = new A() {
            public void study1() {
                System.out.println("匿名内部类独有的方法");
            }
        };
        //调用study的方法是调用的A类中的study方法,若使用a1.study();会报错,我也不知道怎么调用匿名内部类中独有的方法,求大神
        a1.study();

    }

输入结果:1、匿名内部类重写的方法
2、张三在学习

2、在匿名内部类调用外部类的变量,这个变量要么是属性,要么是final修饰的常量

3、在匿名内部类调用外部类的方法,用super关键字

4、匿名内部类因为没有名字,因此没有构造函数

四、静态内部类
1、相当于外部类的静态方法的地位,可以用到外部类中的静态属性和静态方法,若想调用外部类的非静态方法和属性,则需要创建外部类的对象,通过对象名. 方法名/属性名 调用

public class A {
    public static String name = "张三";
    public void study() {
        // 外部类方法调用静态内部类的方法,创建静态内部类对象,通过对象调用方法
        // 或者将静态内部类的方法写成static方法,通过类名.方法名调用
        B1 b = new B1();
        b.exam();
        System.out.println(name + "在学习");
    }
    //外部类的静态方法
    public static void study1() {
        System.out.println("外部类的静态方法");
    }
    //静态内部类
    public static class B1 {
        public void exam() {
            //调用外部类的非静态方法,创建外部类的对象,通过对象调用方法
            A a = new A();
            a.study();
            //调用外部类的静态方法,不需要创建对象,直接调用静态方法名
            study1();
            //直接调用外部类的中静态属性
            System.out.println(name + "在考试");
        }
    }
}

2、静态内部类调用内部类的方法(内部类和内部类的方法访问修饰符可以是private),通过外部类创建外部类对象,再通过外部类对象new一个内部类引用对象,通过内部类对象调用方法和属性;
内部类调用静态内部类的方法(内部类和内部类的方法访问修饰符可以是private),直接创建静态内部类对象,通过对象调用方法和属性

public class A {
    public static String name = "张三";

    public void study() {
        System.out.println(name + "在学习");
    }

    public static void study1() {
        System.out.println("外部类的静态方法");
    }

    private static class B1 {
        private void exam() {
            /*
             * 静态内部类调用内部类的方法,创建一个外部类的对象,
             * 用该对象new一个 内部类的引用地址,通过内部类对象调用内部类中的方法
             */
            A a = new A();
            B2 b2 = a.new B2();
            b2.exam();
            System.out.println(name + "在考试");
        }
    }

    private class B2 {
        private void exam() {
            /*
             * 内部类调用静态内部类的方法直接只用创建静态内部类的对象,
             *  通过对象调用静态内部类的方法
             */
            B1 b1 = new B1();
            b1.exam();
            System.out.println("内部类的考试方法");
        }
    }
}

3、在main函数中调用静态内部类和内部类的方法,首先静态内部类和内部类及其方法的类访问限定修饰符不能是private,其他与上面一致

public class Main {

    public static void main(String[] args) {
        A a = new A();
        //调用静态内部类的方法
        B1 b1 = new B1();
        b1.exam();
        //调用内部类的方法
        B2 b2 = a.new B2();
        b2.exam();


}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值