java内部类(成员、局部、静态、匿名)

1.内部类定义

在 Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。

2.成员内部类

定义在类中,充当类的一个成员。

访问权限:内部类可以访问外部类的属性和方法,外部类想要访问内部类的成员必须先创建内部类的对象来访问。 创建对象:new Demo01().new Demo02()

package case01;

public class Demo01 {//外部类
    int a=1;//成员属性
    public void show(){
        System.out.println("外部类的show方法");
    }

    public static void main(String[] args){
        System.out.println(new Demo01().new Demo02().a);//调用内部类的属性
        new Demo01().new Demo02().show();//调用内部类的方法
    }


    //成员内部类
    public class Demo02{//内部类中不能有主方法
        int a=2;
        public void show(){
            System.out.println("内部类的show方法");
            System.out.println(new Demo01().a);//调用外部类的成员属性
            new Demo01().show();//调用外部类的的方法
        }
    }


}

3.局部内部类

定义在方法中,充当方法的一个变量,注意: 局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private 以及 static 修饰符的。

package case01;

public class Demo05 {
        int a=3;
        static int b=99;

        public static void main(String[] args) {
            new Demo05().show();//调用拥有局部内部类的方法

        }

        public void show(){
            int a=5;

            class Inner1{//局部内部类
                int a=6;
                public void show1(){
                    //内 调  外
                    System.out.println(a);
                    System.out.println(new Demo05().a);
                    System.out.println(Demo05.b);
                    System.out.println("内部类的show");
                }
            }
            new Inner1().show1();//调用局部内部类
        }


}

4.匿名内部类

匿名内部类,通常作为方法传参时使用,用于继承抽象类或实现接口,代替子类或实现类,并不需要额外定义方法。Jdk8开始可以使用Lambda表达式进行简化。
例子: ()-> System.out.println(“拍照”)
要求:接口中只有一个方法,同时如果有多行返回值需要{}

案例:
需求说明:原始的手机,可以发短信,通电话。随着发展,手机增加了音频、视频播放、拍照、上网功能。按照下面的类图进行程序设计:首先,编写类及接口,参照以下类的结构图;其次,编写测试类,让普通手机播放音频、发信息和通电话,让智能手机上网、播放视频、照相、发彩信和视频通电话。

结构图
Handsets.java代码:

package take04;

public abstract class Handset {
    //功能接口作为属性
    private Play play;
    private Network network;
    private TakePicture takePicture;
    //普通属性
    private String brand;
    private String type;
    //抽象方法
    public abstract void sendInfo();
    public abstract void call();
    //实例info方法
    public void info(){
        System.out.println(brand+"-------"+type);
    }
    //封装get,set


    public Play getPlay() {
        return play;
    }

    public void setPlay(Play play) {
        this.play = play;
    }

    public Network getNetwork() {
        return network;
    }

    public void setNetwork(Network network) {
        this.network = network;
    }

    public TakePicture getTakePicture() {
        return takePicture;
    }

    public void setTakePicture(TakePicture takePicture) {
        this.takePicture = takePicture;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
}

接口Network.java代码:

package take04;

public interface Network {
    public abstract void netWort();
}

接口Play.java代码:

package take04;

public interface Play {
    public abstract void play(String content);
}

接口TakePicture.java代码:

package take04;

public interface TakePicture {
    public abstract void takePicture();
}

测试类TestHandset.java代码:

package take04;

public class TestHandset {
    public static void main(String [] args){
        //1.构造普通手机
        Handset h1=new Handset() {
            public void sendInfo() { System.out.println("文字信息"); }
            public void call() { System.out.println("语音电话"); }
        };
        //2.属性赋值
        h1.setPlay((String content)->System.out.println("播放音乐"+content));
        h1.setBrand("索尼");
        h1.setType("G502c");
        //3.测试输出
        h1.info();
        h1.getPlay().play("心墙");
        h1.sendInfo();
        h1.call();

        //1.智能手机
        h1=new Handset() {
            public void sendInfo() { System.out.println("图片和文字信息"); }
            public void call() { System.out.println("视频通话");  }
        };
        //2.属性赋值
        h1.setNetwork(()-> System.out.println("连上5G网络"));
        h1.setPlay((String content)-> System.out.println("正在播放视频"+content));
        h1.setTakePicture(()-> System.out.println("拍照"));
        h1.setBrand("I9100");
        h1.setType("HTC");
        //3.测试输出
        h1.info();
        h1.getNetwork().netWort();
        h1.getPlay().play("小时代");
        h1.getTakePicture().takePicture();
        h1.sendInfo();
        h1.call();
    }
}

5.静态内部类

静态内部类可以理解为类的一个静态成员。 静态内部类不需要依赖于外部类的对象,可以直接创建自己的对象。不能访问外部类的非static成员属性或方法,因为静态内部类不依赖外部对象,就可以自己创建对象,所以如果没有外部对象,就调用外部的实例成员,就产生了矛盾,因为外部的实例成员必须要有外部对象。

package case01;

public class Demo03 {
    int a=0;
    static int b=10;
    public void show1(){
        System.out.println("外部类实例方法");
    }
    static public void show2(){
        System.out.println("外部类静态方法");
    }
    public static void main(String [] args){
        System.out.println(new Demo04().a1);//调用内部类的实例属性
        System.out.println(Demo04.b1);//调用内部类的静态属性
        new Demo04().show3();//调用内部类的实例方法
        Demo04.show4();//调用内部类的静态方法
        System.out.println("-----------------------------------------------");
        System.out.println(new Demo03().a);//调用外部类的实例属性
        System.out.println(b);//调用外部类的静态属性
        new Demo03().show1();//调用外部类的实例方法
        show2();//调用外部类的静态方法

    }

    static public class Demo04{//静态内部类
        int a1=120;
        static int b1=56;
        public void show3(){
            System.out.println("内部类的实例方法");
        }
        static public void show4(){
            System.out.println("内部类的静态方法");
        }
        public static void main(String [] args){
            System.out.println(new Demo03().a);//调用外部类的实例属性
            System.out.println(Demo03.b);//调用外部类的静态属性
            new Demo03().show1();//调用外部类的实例方法
            Demo03.show2();//调用外部类的静态方法

            System.out.println(new Demo04().a1);//调用内部类实例属性
            System.out.println(Demo04.b1);//调用内部类静态属性
            new Demo04().show3();//调用内部类实例方法
            Demo04.show4();//调用内部类静态属性
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值