• java之内部类


    在Java中,允许一个类的定义位于另一个类的内部,前者称为内部类,后者称为外部类。

    Inner class一般用在定义它的类或语句块之内,在外部引用它时必须给出完整的名称,Inner的名字不能与包含它的类名相同;

    Inner class可以使用外部类的私有数据,因为它是外部类成员,同一个类的成员之间可以相互访问,而外部类要访问内部类中的成员需要:内部类.成员或者内部类对象.成员。

    分类:成员内部类(static成员内部类和非static成员内部类)、局部内部类(不带修饰符)、匿名内部类

    Test.java

    package fac;
    
    public class Test {
        int i;
        public int j;
        private int k;
        class A{
            int i;
            public void setTestFields() {
                Test.this.i = 1;
                Test.this.j = 2;
                Test.this.k = 3;
            }
            public void set() {
                this.i = 4;
            }
            public void get() {
                System.out.println(this.i);
            }
        }
        public void seInfo() {
            new A().setTestFields();
        }
        public void showInfo() {
            System.out.println(this.i);
            System.out.println(this.j);
            System.out.println(this.k);
        }
        public static void main(String[] args) {
            Test t = new Test();
            t.seInfo();
            t.showInfo();
            Test.A a = t.new A();
            a.set();
            a.get();
        }
    }

    输出:

    1

    2

    3

    4

    内部类特性:

    • 可以声明为final;
    • 和外部类不同,Inner class可声明为private和protected;
    • inner class可以声明为static,但此时就不能再使用外层类的非static的成员变量;
    • 可以声明为abstract类,因此可以被其它内部类所继承;

    内部类的作用是什么?

    主要是解决Java不能多重继承。

    package fac;
    
    public class Test2 {
        
        public static void main(String[] args) {
            //现在类A可以获得类B和类C的方法
            A a = new A();
            a.testB();
            a.testC();
        }
    }
        
    class A{
        
        public void testB() {
            new InnerB().testB();
        }
        public void testC() {
            new InnerC().testC();
        }
        
        private class InnerB extends B{
            public void testB(){
                System.out.println("这是重写之后的B方法");
            }
        }
        private class InnerC extends C{
            public void testC(){
                System.out.println("这是重写之后的C方法");
            }
        }
        
    }
    class B{
        public void testB(){
        
    }}
    class C{
        public void testC(){
        
    }}

    输出:

    这是重写之后的B方法
    这是重写之后的C方法

  • 相关阅读:
    Android对包名和类名是否存在的判断
    Android权限表
    论艺术的背后还有纪律
    jeecgboot/IDEA中 debug不行,run可以
    java集合类
    HashMap、HashTable、LinkedHashMap和TreeMap用法和区别
    protobuf序列化算法原理
    谁能帮我看看着究竟是什么问题呀,我在本机运行都是好好的,但在别人的机子上运行就出这个呢?我快疯了!!!
    VS删除空白行
    POJ 2516 Minimum Cost
  • 原文地址:https://www.cnblogs.com/xiximayou/p/12056321.html
Copyright © 2020-2023  润新知