zoukankan      html  css  js  c++  java
  • java中几个特殊的类

    1 内部类-----是在其他类中的类

    1.1 内部类的定义

    • 将类定义为 class xxxx{... ...}置于某个类的内部即可‘
    • 内部类编译时生成 xxxx$xxxx的class文件
    • 内部类不能够与外部类同名

    1.2 内部类的使用

    • 在封装其类本省的类中使用该类,与普通类的使用方式相同
    • 在其他地方使用该类:a 类名前要冠以外部类的类名; b 在用new创建内部类对象时,外部类名.内部类名 内部类对象名=外部类对象名.new 内部类名(参数)

    1.3 在内部类中使用外部类的成员

    • 内部类可以直接使用外部类的所有字段和方法;private也可以
    • 如果内部类与外部类有同名的字段方法,则:外部类名.this.字段或方法

    代码示例:

    public class TestInnerClass {
        public static void main(String[] args){
            ExternalClass  extern = new ExternalClass();
            ExternalClass.InnerClass inner = extern.new InnerClass();
            inner.outPut("方法的字段");
        }
    }
    
    class ExternalClass{
        private String s = "外部类字段";
        
        class InnerClass{
            private String s = "内部类字段";
            public void outPut(String s){
                System.out.println("s的值为 " + s);
                System.out.println("this.s的值为 " + this.s);
                System.out.println("ExternalClass.s的值为 " + ExternalClass.this.s);
            }
        }
        
    }
    View Code

    输出结果:

    s的值为 方法的字段
    this.s的值为 内部类字段
    ExternalClass.s的值为 外部类字段
    View Code

    1.4 内部类的修饰符

    内部类与外部类的字段和方法一样,作为外部类的成员而存在,其前面可以有访问控制符与其他修饰符

    • 访问控制符public,protected,默认、private
    • final、abstract、static等

    1.5 static修饰的内部类也叫作嵌套类(nested class)

    static修饰的内部类,表面该内部类实际上是一种外部类,他与外部类的实例无关;

    static修饰的内部类在使用时:

    • 实例化static类时,在new前不需要增减外部类对象实例变量
    • static类中不能访问外部类中非static的字段及方法
    • static方法中不能访问非static的域及方法

    2 局部类---在一个方法中定义的类

    • 同局部变量一样,方法中的内部类,不能够被访private、protected、public、static等修饰,但能够被final、abstract修饰
    • 可以访问其外部类的成员
    • 不能访问该方法中的非final的局部变量(注意:java8中使用lambda表达式来实现局部类时,可以访问方法的普通局部变量
    class TestInnerInMethod 
    {
        public static void main(String[] args) 
        {
            Object obj = new Outer().makeTheInner(47);
            System.out.println("Hello World!" + obj.toString() );
        }
    }
    
    class Outer
    {
        private int size = 5;
        public Object makeTheInner( int localVar )
        {
            final int finalLocalVar = 99;
            class Inner  {
                public String toString() {
                    return ( " InnerSize: " + size + 
                        // " localVar: " + localVar +   // Error! 
                        " finalLocalVar: " + finalLocalVar
                    );
                }
            }
            return new Inner();
        }
    }
    View Code

    3 匿名类----一种特殊的)是一种特殊的内部类 ,它没有类名,在定义类的同时就生成该对象的一个实例;“一次性使用”的类

    • 不取名字,直接用其父类或接口的名字,编译器生成 xxxxx$1之类的名字
    • 类的定义的同时就创建实例,即类的定义前面有一个new,即new 类名或接口名(){……}
    • 不定义构造方法,在构造对象时使用父类构造方法
    class TestInnerAnonymous 
    {
        public static void main(String[] args) 
        {
            Object obj = new Outer().makeTheInner(47);
            System.out.println("Hello World!" + obj.toString() );
        }
    }
    
    class Outer
    {
        private int size = 5;
        public Object makeTheInner( int localVar )
        {
            final int finalLocalVar = 99;
            return new Object()  {
                public String toString() {
                    return ( " InnerSize: " + size + 
                        " finalLocalVar: " + finalLocalVar
                    );
                }
            };
        }
    }
    View Code
  • 相关阅读:
    ABAP-年月期间搜索帮助
    Others-Goldengate 数据同步
    ABAP-语音输出
    ABAP-ALV报表导出格式恢复初始画面
    ABAP-动态创建DATABASE/FUNCTION(风险)
    JDK 12 安装
    级数判敛--转自高教
    一文搞懂 JavaScript 中 DOM 相关的距离
    你应该知道的前端编程利器 VS Code
    js变量提升与函数提升的详细过程
  • 原文地址:https://www.cnblogs.com/penghuster/p/4840482.html
Copyright © 2011-2022 走看看