• Java内部类详解


    一:为什么使用内部类?

    1.每个内部类都能够独立的继承自一个(接口的)实现,所以无论外部类是否继承了一个(接口的)实现,对这个内部类都没有影响。

    2.内部类提供了更好的封装,只有外部类能访问内部类。

    二:内部类的使用

    1.成员内部类:

    如果一个类定义在了另一个类的内部,那么这个类就是成员内部类。成员内部类可以直接访问外部类的所有方法和属性。

    public class Outter {
        private int x = 1;
        private static int y = 2;
        
        private void outterMethod(){
            System.out.println("outterMethod");
        }public class Inner{
            public void innerMethod(){
                System.out.println(x); //访问外部类的属性
                System.out.println(y);
                outterMethod(); //访问外部类的方法
            }
                   
        }
        
    }
    public class JavaSeTest {    
        @Test
        public void innerTest(){
    //成员内部类的创建方式:先创建一个外部类,然后再创建成员内部类 Outter outter
    = new Outter(); Outter.Inner inner = outter.new Inner(); inner.innerMethod(); } }

    外部类不能直接访问内部类的方法和属性,需要通过内部类来访问

    public class Outter {
        private int x = 1;
        private static int y = 2;
        
        public void callInnerMehtod(){
            new Inner().innerMethod(); //先创建内部类,然后通过这个内部类对象来访问内部类的方法
        }
        
        public class Inner{
            public void innerMethod(){
                System.out.println("innerMethod");
            } 
            
        }
        
    }

    2.局部内部类

    如果一个类定义在了方法或者作用域内,那么这个类称之为局部内部类;局部内部类不能用private,protected,public,static修饰,仅能用abstract,final来修饰。它的访问权限在这个方法或者作用域内。注意,成员内部类的访问权限是在外部类。

     定义在方法内:

    //Outter是外部类,Inner是局部内部类,定义在了getInnerClass方法中
    public
    class Outter { public InnerInterface getInnerClass(String str){ class Inner implements InnerInterface{ private String name; public String getName(){ return this.name; } public Inner(String str){ this.name = str; } } return new Inner(str); }

    3.匿名内部类

    匿名内部类注意:

    3.1 匿名内部类必须实现一个接口或者继承一个抽象类,同时要实现这个抽象类或者接口中的所有方法;

    3.2 匿名内部类不能定义构造函数,匿名内部类也是一个局部内部类,匿名内部类不能存在静态方法或静态成员变量。

    public class Person {
        private String name;
        
        public Person(String name){
            this.name = name;
        }
        
        public void driveCar(Car car){
            System.out.println(name+"驾驶"+car.run());
        }
        
    }
    
    public interface Car {
        public String run();
    }
    
        @Test
        public void innerTest(){
            Person person = new Person("梁朝伟");
    //以下蓝色代码块就是匿名内部类 person.driveCar(
    new Car(){ public String run() { return "保时捷跑1000公里"; } }); } }

    4.静态内部类

    静态内部类只能访问外部类的静态方法和静态成员变量,不能访问外部类的非静态方法和非静态成员变量

    public class Outter {
    
        private static int age;
        
        private String name;
        
        static class Inner{
            public void innerMethod(){
                System.out.println(age);
            }
            
        }
    }
  • 相关阅读:
    【转】Unity中的协同程序-使用Promise进行封装(二)
    结合索引优化SQL语句提高数据库查询效率
    结合索引优化SQL语句提高数据库查询效率
    数据库SQL优化大总结之百万级数据库优化方案
    Oracle回收站功能,彻底删除表(purge recyclebin)
    Oracle回收站功能,彻底删除表(purge recyclebin)
    分布式环境中三种Session管理方法的使用场景及优缺点
    分布式环境中三种Session管理方法的使用场景及优缺点
    [转载]“对不起,我家里不同意”多少爱情败给了它?
    [转载]“对不起,我家里不同意”多少爱情败给了它?
  • 原文地址:https://www.cnblogs.com/51life/p/9295788.html
Copyright © 2020-2023  润新知