Java类再生

作者: 酥酥肉 | 来源:发表于2018-12-25 20:41 被阅读0次

Java类再生

1、在新类里简单地创建原有类的对象。我们把这种方法叫作“合成”

2、它创建一个新类,将其作为现有类的一个“类型”,我们可以原样采取现
有类的形式,并在其中加入新代码,同时不会对现有的类产生影响。这种魔术般的行为叫作“继承”

合成的语法

为进行合成,我们只需在新类里简单地置入对象句柄即可

class WaterSource {
    private String s;
    WaterSource() {
        System.out.println("WaterSource()");
        s = new String("Constructed");
    }
    public String toString() { return s; }
}

 class SprinklerSystem {
    WaterSource waterSource;
    WaterSource source = new WaterSource();
    void print() {
        System.out.println("waterSource = " + waterSource );
        System.out.println("source = " + source );
    }
}

public static void main(String[] args) {
        SprinklerSystem x = new SprinklerSystem();
        x.print();
}
WaterSource 内定义的一个方法是比较特别的: toString()
大家不久就会知道,每种非基本类型的对象都有一个 toString()方法

在类内作为字段使用的基本数据会初始化成零。但对象句柄会初始化成 null。
而且假若试图为它们中的任何一个调用方法,就会产生一次“违例”

继承的语法

在类主体的起始花括号之前,需要放置一个关键字 extends, 在后面跟随“基础类”的名字,
若采取这种做法,就可自动获得基础类的所有数据成员以及方法

初始化基础类

涉及到两个类—— 基础类及衍生类
在衍生类的构建器中, Java 会自动插入对基础类构建器的调用。

class Art {
    Art() {
        System.out.println("Art constructor");
    }
}
class Drawing extends Art {
    Drawing() {
        System.out.println("Drawing constructor");
    }
}
 class Cartoon extends Drawing {
    Cartoon() {
        System.out.println("Cartoon constructor");
    }

} ///:

public class Main {
    public static void main(String[] args) {
            Cartoon x = new Cartoon();
    }
}
结果:
      Art constructor
      Drawing constructor
      Cartoon constructor

基础类会在衍生类访问它之前得到正确的初始化。

到底选择合成还是继承

在面向对象的程序设计中,创建和使用代码最可能采取的一种做法是:将数据和方法统一封装到一个类里,并且使用那个类的对象。有些时候,需通过“合成”技术用现成的类来构造新类。而继承是最少见的一种做法。因此,尽管继承在学习 OOP 的过程中得到了大量的强调,但并不意味着应该尽可能地到处使用它相反

使用它时要特别慎重。只有在清楚知道继承在所有方法中最有效的前提下,才可考虑它。为判断自己到底应该选用合成还是继承,一个最简单的办法就是考虑是否需要从新类上溯造型回基础类。若必须上溯,就需要继承。但如果不需要上溯造型,就应提醒自己防止继承的滥用。在下一章里(多形性),会向大家介绍
必须进行上溯造型的一种场合。但只要记住经常问自己“我真的需要上溯造型吗”,对于合成还是继承的选
择就不应该是个太大的问题。

f i n a l 关键字

1、f i n a l 数据
(1) 编译期常数,它永远不会改变
(2) 在运行期初始化的一个值,我们不希望它发生变化

2、final 自变量
将自变量设成 final 属性,方法是在自变量列表中对它们进行适当的声明。这意味着在一
个方法的内部,我们不能改变自变量句柄指向的东西
int g(final int i)
个人建议:如果不是对象引用其实不用final修饰,值又不能传递回去
但是是对象的引用,就很有必要修饰了,无论谁一看就知道此引用不能修改对象的值

3、f i n a l 方法
1)第一个是为方法“上锁”,防止任何继承类改变它的本来含义。类内所有 private 方法都自动成为 final
2)编译器就可以把对那个方法的所有调用都置入“嵌入”调用里 感觉和c++ 的inline很像

4、f i n a l 类
表明自己不希望从这个类继承,或者不允许其他任何人采取这种操作

相关文章

网友评论

    本文标题:Java类再生

    本文链接:https://www.haomeiwen.com/subject/udeqlqtx.html