JAVA-代码块和内部类

作者简介:我是最爱吃兽奶,大家好啊! 又见面了

内容简介: 今天给大家聊一下什么是内部类,什么又是代码块

那么,跟着我的脚步来一起看看吧


1.代码块

1.1什么是代码块?

代码块也叫初始化块 属于类中的成员,类似于方法,将逻辑语句封装在方法体中,通过{    }连接起来。

 简而言之,就是代码被放在一对大括号中

1.2代码块的分类及作用:

代码块可以分为三类

1.静态代码块

在下面我会创建Person两个对象,大家可以猜猜控制台打印了什么?

实例化了两个对象,打印了一句静态代码快!

(上面关于类的加载相关的知识可以敬请期待博主的后续创作)


2.成员代码块(又叫做构造代码块)

成员代码块其实和普通的成员差不多

 

 下面是改进后的代码

 清爽多了没?


3.局部代码块

局部局部,真应景啊! 这个代码块非常局限

背景:早期计算机刚推出的时候,内存空间非常小,这个时候人们就发明了局部代码块,在一个方法中如果定义的变量不是从头用到尾的话,那么可以用局部代码块把开头和结尾的代码包起来,这样一来,这些变量就会节省内存,现在来看局部代码块好像一点用都没了,因为我们现在计算机的内存和磁盘空间已经不可同日而语

还是带着大家简单看下吧

public int sum(){
    int sum = 0;
    {
        int a = 10;
        int b = 20;
        sum = a+b;
    }
    return sum;
}

求和,返回a+b的值,大家凑活着看,这东西几乎没用


2.内部类

2.1 什么是内部类?


大家先来看看下面的例子 

 


汽车的发动机和汽车都可以看做是类,但是汽车的发动机类单独存在没什么意义,所以我们可以直接将其定义为内部类

2.2 内部类的分类


1.成员内部类

定义在成员位置的类叫做成员内部类

/*
 * 成员内部类,属于外部类的成员
 * 获取成员内部类的两种方式
 * 方式一:
 *    当成员内部类被private修饰时,外部类编写方法,对外提供内部类对象
 * 方式二:
 *    当成员内部类没有被private修饰时,直接创建对象
 * 格式: outer.inner 对象名 = new outer(). new inner();
 * */

 方式一

public class OuterClass {
    String name;
    public innerClass getInnerClass(){
        return new innerClass();
    }

    private class innerClass{
        public String name = "内部类";
    }
}

class TestDemo{
    public static void main(String[] args) {
        OuterClass oc = new OuterClass();
        oc.getInnerClass();
    }
}

方式二

public class OuterClass {

    class innerClass{
        public String name = "内部类";

    }

}


class TestDemo{
    public static void main(String[] args) {
        OuterClass.innerClass oi = new OuterClass().new innerClass();
        System.out.println(oi.name);
    }
}

2.静态内部类

静态静态,表名是由static修饰的,不依赖于对象

调用直接用类名调用即可

 代码如下

public class outer {

    static class inner{
        String name = "静态内部类";
    }

}

class Test{
    public static void main(String[] args) {
        outer.inner oi = new outer.inner();
        System.out.println(oi.name);
    }
}

3.匿名内部类

匿名匿名,它难道是没有名字吗?

其实不然,它其实是有名字的,内存会为其分配一个特定的编号,想要了解吗? 往下看!

接下来我们来看匿名内部类的使用

下面可能会有点抽象,但是我相信你这么聪明一定能听懂!

//上面eat方法定义不太好,已更改为eatMilk
interface eat{
   public abstract void eatMilk();

}
class B implements eat{
    @Override
    public void eatMilk() {
        System.out.println("兽宝乖,开饭了");
    }
}

class Test{
    public static void main(String[] args) {
        B b = new B();
        b.eatMilk();
    }
}

 如果每次需要使用接口中抽象方法时就实现一个B这样的类显然不现实

这里就引出了匿名内部!

格式

new 接口/类名(参数1, 参数2...)

{

           实现方法1(){ } 

           实现方法2(){ }

            ...... 

};

 System.out.println(eat.getClass()); //获取类名

大家有兴趣自行尝试

4.局部内部类

局部内部类就是定义在方法中的类

大家自行尝试,用处不大


总结


以上就是我们这篇博客讲的主要内容,大家需要重点掌握静态代码块,构造代码块,匿名内部类,成员内部类,这些在以后的学习中会被频繁的用到。

猜你喜欢

转载自blog.csdn.net/weixin_73869209/article/details/130598540