Day10:蛋糕上的樱桃

今天来谈谈类别中的非主菜部分,没有它们类别同样可以运作,甚至可以说大部分的实务上不会用到这2个东西,但既然我们目标是要考证照,势必需要了解一下的,那就是内部类别以及区块。

  1. 内部类别(inner class)
    我们知道,在一个.java档案中,可以定义多个类别,但仅能有一个类别定义为public。而一个class中可能包含有field,可能包含有method,甚至有static block以及non-static block。但就这样而已吗?
    其实在一个class里面还可以定义class!这样的class就称为inner class。
class OuterClass{

    class InnerClass{
    
    }
    
}

而如果想要创建出inner class的实例,必须要先创建出外层class的实例後,才可创建inner class实例:

OuterClass outer = new OuterClass();
OuterClass.InnerClass inner = outer.new InnerClass();

以上的情况相当罕见,通常inner class会被定义为private,用来处理比较复杂的结构,不太会让外部直接取用。若真要被外部取用的话,比较常见的是定义为static inner class:

class OuterClass{

    static class InnerClass{
 
    }
    
}

要注意只有内部类别才可以定义为static,外部类别没办法定义为static。而被定义为static的内部类别,就可以直接利用外部类别的类别名称当作命名空间来创建实例:

OuterClass.InnerClass inner = new OuterClass.InnerClass();
  1. 区块(block)
    在一开始学Java的时候,我们会很自然觉得{}只有用在定义class和method时才出现,通常要到JDBC时才会看到static block这样的东西,然後就会看着它看很久,心想这鬼东西是合法的吗?毕竟走到JDBC,通常代表学到满後面了,我们会自以为对Java已经认识很多了XD
    这篇就来把这个腾空出现的{}来说明一下。
  • non-static block
    顾名思义就是非静态的{},看看以下范例:
class Player{
 
    String name;
    
    {
        this.name = "Jack";
    }
    
}

这样的block,代表在正要创建实例但尚未完成之前,就会先执行block里面的内容,所以这个范例中,如果我们直接使用预设建构子来创建一个Player时,name会被指派为"Jack"。

  • static block
    静态区块则是在JVM载入.class档时,就会先执行static block里面的内容了,常见的用法就是当JDBC载入驱动的时候:
static{
    try{
        Class.forName("oracle.jdbc.driver.OracleDriver");
    } catch (ClassNotFoundException ce){
        ce.printStackTrace();
    }
}

<<:  DAY23 MongoDB 免费监控工具

>>:  【Day 10】分类(Classification)(上)

资料分析成熟度模型(Data Analytics Maturity Model, DAMM)

资料平台的建构从基础设施建设开始,配合业务需求,以大数据技术作为战略的基石。 基础设施 包括硬体资源...

Day 5 - 透过 RKE 架设第一套 Rancher(下)

本文将於赛後同步刊登於笔者部落格 有兴趣学习更多 Kubernetes/DevOps/Linux 相...

[DAY 08] test test

写在前面 placeholder for test test placeholder for tes...

Rapid Prototyping for Product Development

Did you have a brilliant concept for a product but...

D3JsDay15 了解WEB地图学,先懂一点地理学—web地图的科学

GIS地理资讯系统(Geographic Information System) 地理资讯系统这个名...