Java new 关键字调用默认构造器,在反编译后就看不懂了 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
amiwrong123
V2EX    程序员

Java new 关键字调用默认构造器,在反编译后就看不懂了

  •  
  •   amiwrong123 2019-10-20 21:10:47 +08:00 1778 次点击
    这是一个创建于 2187 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这个例子是 java 编程思想17.2.3 小节.使用 abstract 类。这个例子作者就是想,体现一下“享元”设计模式,大概意思就是容器的数据不一定非得存在容器内部。

    package net.mindview.util; import java.util.*;//删掉所有 import,改成* public class Countries { public static final String[][] DATA = new String[][]{{"ALGERIA", "Algiers"}, {"ANGOLA", "Luanda"}, {"BENIN", "Porto-Novo"}, {"BOTSWANA", "Gaberone"}, {"BURKINA FASO", "Ouagadougou"}, {"BURUNDI", "Bujumbura"}};//删掉了一些 static Map<String, String> map = new Countries.FlyweightMap((Countries.FlyweightMap)null);//这句不懂? static List<String> names; static { names = new ArrayList(map.keySet()); } public Countries() { } static Map<String, String> select(final int size) { return new Countries.FlyweightMap() { public Set<java.util.Map.Entry<String, String>> entrySet() { return new Countries.FlyweightMap.EntrySet(size); } }; } public static Map<String, String> capitals() { return map; } public static Map<String, String> capitals(int size) { return select(size); } public static List<String> names() { return names; } public static List<String> names(int size) { return new ArrayList(select(size).keySet()); } public static void main(String[] args) { Print.print(capitals(10)); Print.print(names(10)); Print.print(new HashMap(capitals(3))); Print.print(new LinkedHashMap(capitals(3))); Print.print(new TreeMap(capitals(3))); Print.print(new Hashtable(capitals(3))); Print.print(new HashSet(names(6))); Print.print(new LinkedHashSet(names(6))); Print.print(new TreeSet(names(6))); Print.print(new ArrayList(names(6))); Print.print(new LinkedList(names(6))); Print.print(capitals().get("BRAZIL")); } //就是个静态内部类 private static class FlyweightMap extends AbstractMap<String, String> { private static Set<java.util.Map.Entry<String, String>> entries; static { entries = new Countries.FlyweightMap.EntrySet(Countries.DATA.length); } private FlyweightMap() { } public Set<java.util.Map.Entry<String, String>> entrySet() { return entries; } //太长了,省略 

    但这是通过 IDEA 查看 jar 包里面的 class 文件的反编译视角看的源码(当初只找到 net.mindview.util 的 jar 包,没找到它的源码),然后发现有个地方不大懂:

    就是static Map<String, String> map = new Countries.FlyweightMap((Countries.FlyweightMap)null);这句,这句到原书里面是static Map<String, String> map = new FlyweightMap();

    原来只是调用默认构造器,现在是给默认构造器传一个强转后的null,这是什么操作啊?(恕我愚昧,这个问题我确实没百度到)

    5 条回复    2019-10-21 16:14:38 +08:00
    amiwrong123
        1
    amiwrong123  
    OP
       2019-10-21 13:04:47 +08:00
    是我提问姿势不对吗,怎么还没有大佬现身。。。你们要是不信,可以自己把 net.mindview.util 的 jar 包加入工程看看,找到 Countries 这个 class,再对比原书代码。

    下载地址: https://www.cnblogs.com/togeek/p/thiking_in_java_net_mindview_util_package.html
    jyounn
        2
    jyounn  
       2019-10-21 15:38:32 +08:00
    这个是编译后的文件,源文件是这样的吗?
    amiwrong123
        3
    amiwrong123  
    OP
       2019-10-21 15:51:32 +08:00
    @jyounn
    emmm, 源文件就是《 java 编程思想》17.2.3 小节.使用 abstract 类里面的 Countries 类啊。

    源文件确实不是这样的,好多代码顺序都变了。还有就是,有的语句声明和初始化本来是在一句里面,反编译后声明语句和初始化语句也分开了。 但这些变化都没有本质区别。

    除了我在帖子里的那个疑问==
    amiwrong123
        4
    amiwrong123  
    OP
       2019-10-21 15:53:00 +08:00
    @jyounn
    也许我应该,把书中的代码弄下来,自己编译出 class 再自己看看。。。
    jyounn
        5
    jyounn  
       2019-10-21 16:14:38 +08:00
    @amiwrong123 需要了解下编译器具体做了些啥
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4626 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 82ms UTC 09:59 PVG 17:59 LAX 02:59 JFK 05:59
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86