内部类:成员内部类,局部内部类,静态内部类,匿名内部类

来源:互联网 发布:加速器有mac 编辑:程序博客网 时间:2024/04/29 04:49
    public class OuterClass {        private String name = "123";        private int  age = 20;        private static char sex ='女';    /**     * 成员内部类     *  1.可以无限制访问外部成员,包括私有的和静态的     *  2.内部类不能含有static的变量或方法;因为含有static修饰的变量或成员在类加载的时候初始化,此时还没有外部类     *      有static修饰的变量或方法只能放在静态内部类中     *  3.外部类访问内部类的成员和方法     *      外部类名.成员内部类名  对象名 = new 外部类名().new 内部类名();     *      对象名.成员     *  4.外部类无法访问内部类的私有属性或方法     *  5.当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的是成员内部类的成员。     *      如果要在内部类中访问外部类的同名成员,需要以下面的形式进行访问     *          外部类.this.成员变量     *          外部类.this.成员方法     *  练习:     *  1. 创建一个外部类,含有一个成员变量age=30;     *  2. 创建一个内部类,含有一个内部成员变量age=20;     *  3. 在内部类里创建一个方法,里面有一个局部变量age=10,在这个方法里分别打印值不同的三个age     *  4. 在main方法中,调用内部类的方法     *       */        class InnerClass{            private char sex ='男';            private int age = 30;            public void print(){                int age = 10;                System.out.println(name);                System.out.println(OuterClass.this.sex);                System.out.println(age);                System.out.println(this.age);                System.out.println(OuterClass.this.age);            }        }    /**     * 2.局部内部类     *  局部内部类,是定义在一个方法或者一个作用域里面的类     *  局部内部类不能被public、protected、private以及static修饰符的。他的作用域被限定在声明这个局部类的块中     *  除了method方法,没有任何方法知道此类的存在     */        public void method(){            int a = 10;            class InnerClass2{                public void print(){                    System.out.println("哈哈哈");                }            }            InnerClass2 inner = new InnerClass2();            inner.print();        }        {            class InnerClass2{            }        }    /**     * 3.静态(嵌套)内部类     * a.成员内部类前加上了static修饰,它不能使用外部类的非static成员变量或者方法     * b.外部类调用该内部类的成员     *      调用静态成员:外部类名.内部类名.静态成员     *      调用非静态成员:new 外部类名.内部类名().非静态成员     *  int age = OutClass1.StaticInnerClass.b;//不需要创建外部类,也不需要创建内部类        int age1 = new OutClass1.StaticInnerClass().a;//调用静态内部类的非静态方法     *     */        static class InnerClass3{            static int i = 100;            String j = "你好";            public void print(){                System.out.println(sex);            }        }        public void method2(){            System.out.println(OuterClass.InnerClass3.i);            System.out.println(new OuterClass.InnerClass3().j);        }        public static void main(String[] args) {            OuterClass.InnerClass oi = new OuterClass().new InnerClass();            System.out.println(oi.sex);            oi.print();            //System.out.println(OuterClass.this.sex);            OuterClass out = new OuterClass();            out.method();            out.method2();        }    }
/** * 4. 匿名内部类 * 匿名内部类也就是没有名字的内部类正因为没有名字,所以匿名内部类只能使用一次, * 它通常用来简化代码编写,但使用匿名内部类还有个前提条件: * 必须继承一个父类或实现一个接口,但最多只能继承一个父类,或实现一个接口。 * 匿名内部类不能有构造方法。  * 匿名内部类不能定义任何静态成员、方法和类。  * 匿名内部类的本质:是继承了一个类或者实现接口的匿名子类对象    关于匿名内部类还有如下两条规则:    1)匿名内部类不能是抽象类,因为系统在创建匿名内部类的时候,会立即创建内部类的对象。            因此不允许将匿名内部类定义成抽象类。    2)匿名内部类不能定义构造器(构造方法),因为匿名内部类没有类名,所以无法定义构造器,            但匿名内部类可以定义实例初始化块,    匿名内部类的格式:        new 类名或者接口(){        重写或者实现的方法    }; */    public class NoNameClassDemo {        public static void main(String[] args) {            A a = new Aa();            a.testA();            new A(){                public void testA(){                    System.out.println("匿名内部类的aaa");                }            }.testA();            A a1 = new A(){                public void testA(){                    System.out.println("匿名内部类的aaa1111");                }            };            a1.testA();            B b= new B(){                public void testB(){                    System.out.println("BBBB");                }            };            b.testB();            new B(){                public void testB(){                    System.out.println("BBBB");                }            }.testB();            new C(){                public void testC(){                    System.out.println("匿名内部类的CCC");                }            }.testC();        }    }    interface A{        public void testA();    }    abstract class B{        abstract  void testB();    }    class C{        public void testC(){            System.out.println("父类的c");        }    }    class Aa implements A{        @Override        public void testA() {            System.out.println("AAA");        }    }
阅读全文
0 0
原创粉丝点击