Java之详解内部类

内部类:
1. 内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号
2. 外部类不能直接访问内部类的的成员,但可以通过内部类对象来访问
3. 内部类如果定义成静态的,在内部类中就只能访问外部类的静态成员

  • 成员内部类(类中的类)
package com.cwt.成员内部类;

public class People {
    String name = "People";

    public void say() {
        System.out.println("我是" + name);
    }

    // 写一个Student内部类
    public class Student {
        String name = "Student";

        public void say() {
            System.out.println("我是" + name+"年龄:" + age);
        }
    }
}

//测试类
package com.cwt.成员内部类;

import com.cwt.成员内部类.People.Student;

public class Test {
    public static void main(String[] args) {
        People people = new People();
        people.say();

        // Student student = new Student();
        //上面一句经过测试报错了,因为Student也是People的成员必须要用People 的对象去引用
        Student student = people.new Student();
        student.say();
    }
}
     - 总结:
         - 成员内部类,从上面代码可以看出,Student虽然是一个类,但他也属于People的一个成员,这样也可以解释那一句为什么报错了,因为Student类也属于People的一个成员,所以要用People的对象去访问,即 Student student = people.new Student();
         -  内部类中可以访问外部类的属性,如果内部类是静态的,那只能 访问外部类的静态成员
  • 方法内部类
package com.cwt.方法内部类;

public class Outer {
    public String name = "方法内部类";

    public void test() {
        // 下面是方法中定义的一个类
        // 不能用public 修饰,只能用默认的访问权限
        class Inner {
            public void show() {
                System.out.println("我是:" + name);
            }
        }
        Inner inner = new Inner();
        inner.show();
    }
}

//测试类

package com.cwt.方法内部类;

public class Test {

    public static void main(String[] args) {
        // 问题:方法内部类怎么创建对象

        // 先创建一个外部类对象
        Outer outer = new Outer();
        // outer.show();外部类对象无法访问方法内部类的方法
        outer.test();// 访问方法内部类
    }

}
  • 匿名内部类:没有名字的内部类,可以简化代码,但是只能使用一次,下面我将对比一下,怎么简化代码的
//先写一个抽象People抽象类
package com.cwt.匿名内部类;

public abstract class People {
    String name = "People类";

    public abstract void say();
}

//实现Pelple类的方,第一种方式,继承People类
package com.cwt.匿名内部类;

public class Student extends People {
    public Student() {
        say();

    }

    @Override
    public void say() {
        // TODO Auto-generated method stub
        System.out.println("我是继承实现了People的抽象方法");
    }
}



//第二种方式,使用匿名内部类实现People

package com.cwt.匿名内部类;

public class Student {
    public Student() {

        new People() {
            // 在这儿使用匿名内部类
            @Override
            public void say() {
                System.out.println("我是匿名内部类");
            }
        };

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值