栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

内部类(飞行札记)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

内部类(飞行札记)

观看老韩的java教程做的笔记,谢谢老韩和观看的你。

类的五大类成员:属性、方法、构造器、代码块、内部类

1.局部内部类

(1)可直接访问外部类的所有成员,包括私有成员

(2)它的地位相当于一个局部变量,只能添加final访问修饰符

(3)外部类要使用局部内部类的方法,需要创建该类的对象,然后调用方法

(4)外部其他类不能访问局部内部类

(5)外部类和局部内部类的属性重名时,遵循就近原则,                                                                         若想使用外部类,就要用外部类名.this.属性(外部类名.this的本质是外部类的对象)

package innerclass;

public class InnerClass01 {
    public static void main(String[] args) {
        Outer02 outer02 = new Outer02();
        outer02.m1();
    }
}

class Outer02 {
    private int n1 = 100;

    private void m2() {
        System.out.println("m2()");
    }

    public void m1(){
        //它的地位相当于一个局部变量,只能添加final访问修饰符或不添加
        final class Inner02{
            private int n1 = 100;
            public void f1(){
                //可直接访问外部类的所有成员,包括私有成员
                //外部类和局部内部类的属性重名时,遵循就近原则
        //若想使用外部类,就要用外部类名.this.属性(外部类名.this的本质是外部类的对象)
                System.out.println("n1 = " + n1 + " 外部类的n1 = " + Outer02.this.n1);
                m2();
            }
        }
        //外部类要使用局部内部类的方法,需要创建该类的对象,然后调用方法
        Inner02 inner02 = new Inner02();
        inner02.f1();
    }
}

*2.匿名内部类

   (1)匿名内部类是一个类的定义,也是一个对象。

   (2)可以直接访问外部类的所有成员,包括私有成员

     (3)   外部其他类不能访问匿名内部类

   (4)外部类和局部内部类的属性重名时,遵循就近原则,                                                                         若想使用外部类,就要用外部类名.this.属性(外部类名.this的本质是外部类的对象)

package innerclass;

public class AnonymousInnerClassDetail {
    public static void main(String[] args) {
        Outer05 outer05 = new Outer05();
        outer05.f1();


    }
}

class Outer05{
    private int n1 = 99;
    public void f1(){
        Person p = new Person(){
            public void hi(){
                System.out.println("匿名内部类重写" + n1);
            }
        };

        p.hi();

        new Person(){
            @Override
            public void hi(){
                System.out.println("匿名内部类重写hi");
            }

            @Override
            public void ok(String str) {
                super.ok(str);
            }
        }.ok("myh");
    }
}

class Person{
    public void hi(){
        System.out.println("Person hi()");
    }
    public void ok(String str){
        System.out.println("Person ok()" + str);
    }
}
package innerclass;

public class InnerClassExercise02 {
    public static void main(String[] args) {
        new Cellphone().alarmClock(new Bell() {
            @Override
            public void ring() {
                System.out.println("懒猪起床了");
            }
        });
        Cellphone cellphone = new Cellphone();
        cellphone.alarmClock(new Bell(){
            @Override
            public void ring(){
                System.out.println("小伙伴上课了");
            }
        });
    }
}

interface Bell {
    void ring();
}

class Cellphone{
    public void alarmClock(Bell bell){
        bell.ring();
    }
}

3.成员内部类

  (1)可以直接访问外部类的所有成员,包括私有成员

  (2)可添加public、private、默认、protected等修饰符(本质是成员,和局部变量不同)

  (3)外部类、外部其他类使用内部类时,需要新建一个内部类的对象

package innerclass;

public class MemberInnerClass {
    public static void main(String[] args) {
        Outer08 outer08 = new Outer08();
        outer08.t1();

        Outer08.Inner08 inner08 = outer08.new Inner08();
        inner08.say();

        Outer08.Inner08 inner08Instance = outer08.getInner08Instance();
        inner08Instance.say();
    }
}

class Outer08 {
    private int n1 = 10;
    public String name = "张三";

    private void hi(){
        System.out.println("hi方法");
    }

    public class Inner08 { //成员内部类
        public double sal = 99.8;
        private int n1 = 66;
        public void say() {
            System.out.println("n1 = " + n1 + " name = " + name + " 外部类的n1 = " + Outer08.this.n1);
            hi();
        }
    }

    public Inner08 getInner08Instance(){
        return new Inner08();
    }
    public void t1(){
        Inner08 inner08 = new Inner08();
        inner08.say();
        System.out.println(inner08.sal);
    }

}

4.静态内部类

  (1)不能访问非静态成员

  (2)可任意添加访问修饰符

package innerclass;

public class StaticInnerClass {
    public static void main(String[] args) {
        Outer10 outer10 = new Outer10();
        outer10.m1();

        Outer10.Inner10 inner10 = new Outer10.Inner10();
        inner10.say();

        Outer10.Inner10 inner101 = outer10.getInner10();
        inner101.say();

        Outer10.Inner10 inner11 = outer10.getInner11();
        inner11.say();
    }

}
class Outer10{
    private int n1 = 10;
    private static String name = "张三";
    static class Inner10{
        private static String name = "韩顺平教育";
        public void say(){
            System.out.println(name + " " + Outer10.name);
        }
    }

    public void m1(){
        Inner10 inner10 = new Inner10();
        inner10.say();
    }

    public Inner10 getInner10(){
        return new Inner10();
    }

    public static Inner10 getInner11(){
        return new Inner10();
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/878254.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号