玩命加载中 . . .

进一步讨论对象和类(2)


再介绍几个类的特殊用法。

内部类/接口

也称嵌套类/接口,是在一个类或接口内部声明的类/接口。
内部类包括成员类,局部类,匿名类;而内部接口都是成员接口。

成员类

成员类分为静态成员类和非静态成员类。
在非静态成员类中,有如下特征需要注意:

  • 不能定义静态变量和方法
  • 可以访问封装类的所有成员
  • 访问与该成员类重名的封装类实例成员语法为:封装类类名.this.封装类实例成员名

另外,在封装类之外创建非静态成员类实例时,需要先创建封装类的实例,然后使用如下语法:
封装类类名.非静态成员类类名 实例变量名 = 封装类实例成员名.new 非静态成员类类名

public class MemberClass {
    int id;
    String name;
    static int counter = 0;
    public MemberClass(int id, String name) {
        this.id = id;
        this.name = name;
        counter++;  // 计数变量加一
    }

    public void print() {
        InterClass mc = new InterClass();
        mc.print();
    }

//    非静态成员类
    class InterClass {
        String name;
        public void print() {
//            访问重名属性,需要特定的语法格式
            System.out.println("id="+id+", name="+MemberClass.this.name);
            System.out.println("counter="+counter);
        }
}

//    静态成员类
    static class NewInterClass {
        String name;
        public void print() {
            // 访问封装类的静态成员变量
            System.out.println("counter="+counter);
        }
    }

    public static void main(String[] args) {
        MemberClass ec1 = new MemberClass(1, "Tom");
        ec1.print();
        MemberClass ec2 = new MemberClass(2, "John");
        ec2.print();
        MemberClass ec3 = new MemberClass(3, "Dora");
//        在封装类外部创建非静态成员类,需要创建实例对象
        MemberClass.InterClass mc = ec3.new InterClass();
        mc.print();
//        在封装类外部创建静态成员类实例,只需通过类名调用
        MemberClass.NewInterClass newMc = new MemberClass.NewInterClass();
        newMc.print();
    }
}

局部类

局部内部类是在封装类的方法中定义的内部类,典型用法是用局部类来实现接口,并在方法中返回接口类型。

匿名类

指没有名称的类,一般当某个类仅在程序中使用一次,且功能简单时,就可以用匿名类的方式来创建这个类的实例。
new 匿名类类名() {
类体;
}
匿名类必须是一个具体的对象,不能是抽象类(abstract)。

public class MemberInterface {
    public void innerMethod() {
        System.out.println("从外部实现了公有内部接口");
    }

    public static void main(String[] args) {
        OuterClassA o = new OuterClassA();
//        obj是InnerInterface内部接口的内部实现类的实例对象,具有innerMethod方法
        OuterClassA.InnerClass obj = o.outerMethod();
        obj.innerMethod();
        MemberInterface m = new MemberInterface();
        m.innerMethod();
    }
}

class OuterClassA {
//    定义一个内部接口
    public interface InnerInterface {
        void innerMethod();
    }
//    定义内部类实现内部接口
    public class InnerClass implements InnerInterface {
        public void innerMethod() {
            System.out.println("在内部实现了公有内部接口");
        }
}
//    创建一个内部类实例对象
    public InnerClass outerMethod() {
        return new InnerClass();
    }
}

范型

范型是对Java语言类型系统的一种扩展,支持创建可以按类型进行参数化的类、接口或方法。
将所操作的数据类型参数化,即该数据类型被声明为一个参数,声明的类型参数在使用时用具体地类型来替换。


文章作者: 鹿卿
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 鹿卿 !
评论
  目录