美文网首页
java中的四种内部类

java中的四种内部类

作者: 刘岳森 | 来源:发表于2017-10-13 00:43 被阅读43次

    成员内部类

    • 成员内部类作为外部类的成员,能够无条件访问外部类的变量,即使是private的,但是外部类不能直接访问成员内部类中的变量,只能通过创建一个对象的方法去访问。
    • 成员内部类在构造之前会先构造外部类
    class Outter {
        private int age = 12;
          
        class Inner {
            private int age = 13;
            public void print() {
                int age = 14;
                System.out.println("局部变量:" + age);
                System.out.println("内部类变量:" + this.age);
                System.out.println("外部类变量:" + Outter.this.age);
            }
        }
    }
      
    public class test1 {
        public static void main(String[] args) {
            Outter out = new Outter();
            Outter.Inner in = out.new Inner();
            in.print();
        }
    }
    

    局部内部类

    • 定义在方法中或者一个作用域中的内部类,他的访问权限仅限于他的作用域。
    • 局部内部类所在的函数的参数类型只能是final类型的。
    class Outter {
     
        private int age = 12;
          
        public void Print(final int x) {    //这里局部变量x必须设置为final类型!
            class Inner {
                public void inPrint() {
                    System.out.println(x);
                    System.out.println(age);
                }
            }
            new Inner().inPrint();
        }
          
     
    }
      
    public class test1 {
        public static void main(String[] args) {
            Outter out = new Outter();
            out.Print(10);
        }
    }
    

    静态嵌套类

    • 在内部类的前面加上static
    • 这样的内部类相当于是和外部类没有什么关系的,
    
    class Outter {
        private static int age = 12;
        static class Inner {
            public void print() {
                System.out.println(age);
            }
        }
    }
      
    public class test1 {
        public static void main(String[] args) {
            Outter.Inner in = new Outter.Inner();
            in.print();
        }
    }
    

    匿名内部类

    public abstract class Bird {  
        private String name;  
      
        public String getName() {  
            return name;  
        }  
      
        public void setName(String name) {  
            this.name = name;  
        }  
          
        public abstract int fly();  
    }  
      
    public class Test {  
          
        public void test(Bird bird){  
            System.out.println(bird.getName() + "能够飞 " + bird.fly() + "米");  
        }  
          
        public static void main(String[] args) {  
            Test test = new Test();  
            test.test(new Bird() {  
                  
                public int fly() {  
                    return 10000;  
                }  
                  
                public String getName() {  
                    return "大雁";  
                }  
            });  
        }  
    }  
    

    如上图例子,匿名内部类的父类是一个抽象的类或者接口,而当子类去实现这个父类的时候,new的是这个父类的名字,这个子类的名字根本就没有出现,所以这也是匿名内部类的来由。
    在匿名内部类中必须实现抽象的函数,可以重写父类的函数。

    public class OutClass {  
        public InnerClass getInnerClass(final int age,final String name){  
            return new InnerClass() {  
                int age_ ;  
                String name_;  
                //构造代码块完成初始化工作  
                {  
                    if(0 < age && age < 200){  
                        age_ = age;  
                        name_ = name;  
                    }  
                }  
                public String getName() {  
                    return name_;  
                }  
                  
                public int getAge() {  
                    return age_;  
                }  
            };  
        }  
    

    在匿名内部类中虽然没有构造函数,但是可以通过构造代码块完成工作

    • 匿名内部类不能有访问修饰符以及static修饰
    • 匿名内部类是唯一一种没有构造函数的类,所以匿名内部类的使用范围非常有限,大部分匿名内部类用于接口回调。
    • 匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。
    • 匿名内部类为局部内部类,几步内部类的所有的约束都对匿名内部类生效。
    • 匿名内部类之所以叫匿名内部类是因为他是在你的类的函数中new了一个新的类。

    相关文章

      网友评论

          本文标题:java中的四种内部类

          本文链接:https://www.haomeiwen.com/subject/phwoyxtx.html