zoukankan      html  css  js  c++  java
  • 内部类总结

    内部类

    • 成员内部类
    • 局部内部类
    • 匿名内部类
    • 静态内部类

    成员内部类

    • 成员内部类可以无条件访问外部类的成员属性和成员方法(
      包括private和静态成员)
    • 成员内部类和外部类同名的成员变量或者方法时候,会发生隐藏现象,即默认访问的是成员内部类的成员,如果要访问外部类的成员需要按下面的形式进行访问:
    外部类.this.成员变量
    外部类.this.成员方法
    
    public class Circle {//外部类
        private double radius=0;
        public static int count=1;
        public Circle(double radius){
            this.radius=radius;
        }
        class Draw{//内部类
            public void drawShape(){
                System.out.println(radius);
                System.out.println(count);
            }
        }
    }
    
    

    外部类想访问成员内部类的成员,要先创建一个成员内部类的对象

    class Circle{
        private double radius=0;
        public Circle(double radius){
            this.radius=radius;
            getDrawInstance().drawShpae();//必须先创建成员内部类的对象,在访问
        }
        private Draw getDrawInstance(){
            return new Draw();
        }
        class Draw{
            public void drawShpae(){
                System.out.println(radius);//外部类的private成员
            }
        }
    }
    

    成员内部类是依附外部类而存在的,创建成员内部类的对象,前提是必须存在一个外部类的对象

    public class Test {
        public static void main(String[] args)  {
            Outter outter = new Outter();
            Outter.Inner inner = outter.new Inner();//1
            Outter.Inner inner1 = outter.getInnerInstance();//2
    
        }
    }
    
    class Outter {
        private Inner inner = null;
        public Outter() {
    
        }
    
        public Inner getInnerInstance() {
            if(inner == null)
                inner = new Inner();
            return inner;
        }
    
        class Inner {
            public Inner() {
    
            }
        }
    }
    

    内部类可以拥有private访问权限、protected访问权限、public访问权限及包访问权限。比如上面的例子,如果成员内部类Inner用private修饰,则只能在外部类的内部访问,如果用public修饰,则任何地方都能访问;如果用protected修饰,则只能在同一个包下或者继承外部类的情况下访问;如果是默认访问权限,则只能在同一个包下访问。这一点和外部类有一点不一样,外部类只能被public和包访问两种权限修饰。我个人是这么理解的,由于成员内部类看起来像是外部类的一个成员,所以可以像类的成员一样拥有多种权限修饰

    局部内部类

    局部内部类是顶一个方法或者一个作用域里面的类
    与成员内部类的区别:局部内部类的访问仅限于方法内或者该作用域内。

    class People{
        public People() {
             
        }
    }
     
    class Man{
        public Man(){
             
        }
         
        public People getWoman(){
            class Woman extends People{   //局部内部类
                int age =0;
            }
            return new Woman();
        }
    }
    

    局部内部类就像方法里面的一句不变量一样,是不能有public protected private 以及static修饰符的

    匿名内部类

    • 使用匿名内部类时候,必须继承一个类或者实现一个接口
    • 匿名内部类没有名字,所以不能定义构造函数
    • 匿名内部类不能含有静态成员变量和静态方法。
    • 匿名内部类也是不能有访问修饰符和static修饰符的。
    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() {
    
                @Override
                public int fly() {
                    return 10000;
                }
    
                @Override
                public String getName() {
                    return "大雁";
                }
            });
        }
    }
    

    静态内部类

    静态内部类也是定义在另一个类里面的类,只不过在类前面加了一个关键字static。静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法。

    public class Test {
        public static void main(String[] args)  {
            Outter.Inner inner = new Outter.Inner();
        }
    }
     
    class Outter {
        public Outter() {
             
        }
         
        static class Inner {
            public Inner() {
                 
            }
        }
    }
    
    class Outter{
        int a=10;
        static int b=5;
        static int b=5;
        public Outter(){
            
        }
        static class Inner{
            public Inner(){
                System.out.println(==a==);//报错 静态内部类不能引用非static成员对象
                System.out.println(b);
            }
        }
    }
    

    **参考资料:**https://www.cnblogs.com/dolphin0520/p/3811445.html

  • 相关阅读:
    第四章:Django模型——添加 Event发布会的表 报错
    第四章:Django模型——admin后台管理
    第四章:Django 模型 —— 设计系统表
    第三章:3.9 清除 Google 浏览器中的缓存
    第三章:3.9 关上窗户
    第三章:3.9 引用Django 认证登陆
    第三章:3.8 登陆 Django 默认后台
    降脂食物
    决定孩子人生高度的,不是知识而是这个!
    百万保险
  • 原文地址:https://www.cnblogs.com/narojay/p/10812630.html
Copyright © 2011-2022 走看看