java 初探(四)

来源:互联网 发布:小七网络毛毯中学 编辑:程序博客网 时间:2024/06/09 02:58
java对应于C++也有析构函数的概念 finalize方法
一般这部分是由Object内部机制固定实现的方法,并不需要自定义
实现。这部分内容的实例将要在后面进行讨论。


当导入的包存在同名类时,可以将想要使用的类进行显示导入,
如果多个都想使用,只好明确地将多个全名进行使用。


导入包不仅可以对类导入,还可以导入类的静态方法,这是比较方便
的,与python也是类似的。


java的包规则基本上将一个变量环境进行了关于包的分解,
包作为基本单位具有比class更为明确的意义。
但由于default的存在使得对类属性不进行private修饰变得十分
危险,


java的继承机制相对于C++而言仅有公有继承,即派生类成员仅能访问
基类的public、protected成员,派生类的对象仅能访问基类的
public成员。


java super关键字进行基类构造函数的调用(与python相同,
python使用super(class_name, self).__init__
进行构造行为,更为一般地对基类方法进行调用,
但要注意的是在调用基类一般方法前,必须保证已经调用了基类
构造函数,trivial,在java中也是相同的)
在派生类中进行this 和super区分是很有意义的。


java如同C++实现了多态及运行时决定使用方法的动态绑定,
这使得对于一般对象的类型指定可以如同C++指针一样,实现
统一基类命名。
与动态绑定相对应的是关键字private static final
这些方法禁止了动态绑定的特性。
同时要看到java的多态特性与C++的不同,C++中要实现多态
必须借助指针或引用(还需要定义虚方法),但由于java本身类似
引用的特性导致使用多态非常简单,在java中储存变量的数组对于
自定义类实际储存的是地址,所以对于使用基类数组作为容器的情况
是可以直接实现动态绑定的,既好理解又好应用。


java的多态当对基类类型调用派生类方法时,仅能调用基类已经定义
的方法(与C++相同)。但使用cast进行强制类型转换后,也可以
使得指向派生类实例的基类变量调用派生类方法。


对于类继承而言,派生类相同参数的同名方法为重载,否则是都保持的。
在进行相同方法的派生类对基类的重载时,要注意修饰词的相同,
如:public对应public。


final class对于类成员与方法的作用是不同的,指定class 
final之后,class的成员并不是final 但方法是final.


java区别于脚本语言的地方在于,其类型对于变量的固定性,这个特性
在多态的情况下并没有被一致保留,故在与类继承有关的多态特性中,
有需要进行类似脚本语言类型判断的机制,java 使用
instance instanceof class_name
函数实现这个功能(这与python isinstance函数相对应)


对于抽象类及其方法,其基本描述是,一个类一旦定义了一个
abstract method后就必须被声明为abstract类,
这种抽象类不能被实例化,其方法仅有非抽象的可以给出定义,
对于有抽象方法的抽象类,其非抽象方法是为了在派生类中直接使用,
而其派生类如果想实例化,就需要给出所有基类抽象方法的定义(即,
将所有基类抽象方法重载掉)。


protected 区分于public在于对于其它包的可见性,protected
变量或方法在进行不同的包导入后不可见(不可用),但public是保持的。
当然,这无论是直接调用还是对含有protected的成员进行继承都是一致的,
即protected是public面向包间不可见的限制。


java中所有的类都是在Object的基础上继承而来的。(包括数组类型)
所以对于Object的了解就很重要,这些方法均能在派生类中使用,
一般的Object类型对于使用Object数组进行一致地批处理是有好处的。


Object equals实现对对象本身“引用”的直接比较,定义很简单:
    public boolean equals(Object obj) {
        return (this == obj);
    }
从定义可以看到,这个比较对于完全进行相同初始化的“拷贝”是失效的,
要实现基于state(内容)的equal比较仅能依靠自定义equals函数。


在equals的自定义内容中,有些将instanceof作为检验相等的条件
之一,这对于有继承的情况是不合适的,因为在等价关系中,应该保证
自反性,而基类与派生类调用instanceof显然是违背的。
( 如果细抠这些细节,什么矩阵的等价关系、马氏过程状态等一些王八犊子
就要作为例子被扯出来了)
对于不写库的情况,自定义equals是无用的。


当进行关于基类方法的重载时,可能出现因为函数类型定义不善,没有
实际进行重载的情况,这时可以通过在函数前加@Override

让编译器对行为进行检查。(有点类似于python的装饰器)


java 中有一些继承有关的接口 可以用来实现 强制性的继承要求如public TypedProps(java.lang.Class<? super T> interface_,                   java.lang.Class<T> implementation)<? super T> 修饰要求 其必须作为 T这一模板 的 “基类”(当然这个例子的应用环境是接口)这与<? extends T>是相对应的。
这个例子来源于java akka接口














































0 0
原创粉丝点击