Java编程思想之类(1)

本篇对Java编程思想中的多态、接口、内部类几章进行总结和个人理解。欢迎各位拍砖。

顶层类(top-level class)和内部类相对而言,即没有被enclosing的类。试问top-level类可以为static的吗?例如:

public static class TopLevelStaticClz{…}

1)首先我们回想下static关键字的作用。如果类的行为(对应类的方法)和状态(对应类的属性)不依赖于类的任何特定实例,我们可以把它定义为static的。

2)其次,JVM在加载class文件时,会为我们创建一个class-level的对象,对象的类型是java.lang.Class。这个class-level的对象维护着所有的static的数据,包括static方法和属性。例如:

Company company = new Company();

会创建两个对象,一个是company实例,一个是Company的class-level的对象,通过class-level对象访问class的所有static内容。

综上得知,

1)我们可以通过package.class直接访问到class,例如通过:

java.lang.String访问String类。

2)很显然,每一个class对它的所有object都是可见的,即每一个object都可以访问其归属的class中的数据。所以说一个顶层类天然具备了static的性质,无需再定义为static的。

什么是Inner class和nested class?Inner class内部类,nested class是静态的innserclass。Innerclass实例化时必须要传入一个外部类的引用,即必须先创建一个外部类实例,再创建内部类。Inner class的访问控制级别包括:public,private,protected,package;(普通类的访问级别只有public和package)。而nested class创建时不依赖外部类实例。创建nested class的过程和普通类的创建过程类似。

Java为什么使用内部类?

1)可以变相地实现多继承;Java是单继承,如果需要多继承怎么办呢?可以利用内部类继承其他的类,因为内部类可以访问外部类的任何内容,因此利用内部类达到了多继承的效果。

2)安全、方便地使用闭包和回调。可以把内部类看作一个安全的“指针”,该指针能够访问外部类的任何内容。有关闭包的问题后续会详细讲解,感兴趣的同学可持续关注。

Inner class是否允许嵌套?允许,且对层级未做限制。

一个类没有抽象方法能否定义为抽象类?允许,这是一种设计思想:即使没有抽象的方法,但如果一个类的设计目标是不允许实例化该类,只允许子类继承,那么同样允许定义为抽象类。

了解什么是动态绑定吗?先说下polymorphism:多态,在template method中,父类的模版方法根据运行时环境决定调用哪个子类的方法,也称dynamic binding或latebinding, run-time binding。我们把方法的调用与方法体关联起来的过程称为binding。除了static和final(private都暗含final)方法,java都是latebinding。Final、static方法关闭动态绑定,可以让编译器提前加载提高一些性能。但绝大部分情况下这种优化起不到显著效果,因此只考虑在一些需要的场景下使用final方法,例如使用一些设计模式。

调用构造函数遇到的一个坑:基类的构造函数中调用一个被子类Overwrite的方法,子类的属性未被初始化时,如果被调用的方法使用了子类属性,将会出现诡异的异常。建议:构造函数尽量简单,只调用基类的final方法。

附上本文实验的简单样例程序。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180821G1SVXA00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券