第2课第7节_Java面向对象编程_内部类_P

本文详细介绍了Java内部类的概念,包括其分类、特点和使用场景。内部类可以直接访问外部类的成员,即使它们是私有的。静态内部类可以独立于外部类实例存在,但仅能访问外部类的静态成员。通过示例代码展示了内部类的实例化过程,并讨论了匿名内部类的使用,简化了一次性使用的类的创建。内部类的应用在于它提供了一种灵活的访问和封装机制,尤其在实现回调和事件处理中具有优势。
摘要由CSDN通过智能技术生成

在一个类的内部定义一个类即为内部类

(1)、内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号 。
(2)、内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的 。
(3)、内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量 。

内部类最大的好处就是他可以自由的访问外部类的成员变量,无论是否是private的 ,下面以程序例子来进行说明它的好处。

class Outer {
    private int a = 10;

    /* 为什么要使用内部类,它可以访问外部类的私有属性 */
    class Inner {
        public void printInfo(){
            System.out.println("a = "+a);/* 直接访问a这个私有成员 */
        }
    }
}

public class InnerDemo {
    public static void main(String args[]) {
        /* 内部类定义 */
        Outer o = new Outer();//先实例化一个外部类对象,不先实例外部类,内部类就使用不了其中的成员变量
        Outer.Inner i = o.new Inner();//再实例化一个内部类对象

        i.printInfo();//然后调用
    }
}

那么这里可能会觉得麻烦,需要先实例一个外部类,再去实例化一个内部类,能不能直接实例化内部类呢,可以的,在内部类前加上关键字 static 即可,但它有限制,就是只能访问外部类的 static 属性了。如下程序:

class Outer {
    /* 加上static才能被内部类访问 */
    private static int a = 10;

    /* 加了static之后就只能访问外部的 static 属性了 */
    static class Inner {
        public void printInfo(){
            System.out.println("a = "+a);
        }
    }
}

public class InnerDemo2 {
    public static void main(String args[]) {
        /* 直接实例化内部类方式 */
        Outer.Inner i = new Outer.Inner();
        i.printInfo();
    }
}

还有一个内部类这里需要简单讲解下,就是 匿名内部类,什么意思呢,先看一个不使用匿名类的代码:

/* 定义个接口 */
interface A {
    public void printInfo();
}
/* 继承接口 */
class B implements A {
        public void printInfo() {
            System.out.println("Hello World!");
        }
}
public class Anony {
    public static void main(String args[]) {
        B b = new B();
        testFunc(b);//b向上转换到A
        /* 或化简为以下定义方式 */
        //testFunc(new B());
    }

    public static void testFunc(A a) {
        a.printInfo();/* 向上转换所以会调用到子类的方法 */
    }
}

上面的代码我们只使用了一次 B 这个类,却需要辛苦的构造它,那可不可以不构造它呢,可以的,使用匿名内部类,实现如下:

interface A {
    public void printInfo();
}
public class Anony {
    public static void main(String args[]) {
        /* 匿名内部类定义方式 */
        testFunc(new A(){
            /* 直接在这里实现接口 */
            public void printInfo() {
                System.out.println("Hello World2!");
            }
        });
    }

    public static void testFunc(A a) {
        a.printInfo();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值