zoukankan      html  css  js  c++  java
  • 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);
            }
            
        }
    }
  • 相关阅读:
    js 日期2015/12/22/16/45替换2015-12-22 16:45格式
    正则匹配多行内容
    js fs read json 文件json字符串无法解析
    未能加载文件或程序集“Enyim.Caching”或它的某一个依赖项。未能验证强名称签名
    二叉树、多叉树子路径遍历
    p点到(a,b)点两所在直线的垂点坐标及p点是否在(a,b)两点所在直线上
    System.Net.Sockets.Socket SendAsync System.ObjectDisposedException: Cannot access a disposed object.
    一个误解: 单个服务器程序可承受最大连接数“理论”上是“65535”
    如何用 PyCharm 调试 scrapy 项目
    c或c++的网络库
  • 原文地址:https://www.cnblogs.com/51life/p/9295788.html
Copyright © 2011-2022 走看看