Java--类和对象之组合和继承

上一篇:类和对象之初始化和清除

类的组合的实现很简单,只需要在新类中置入对象句柄即可:

class Door{
    //字段和方法
}
class Wheel{
    //字段和方法
}
public class Car{
    Door d = new Door();
    wheel w = new wheel();
    //其他字段和方法
}

类的继承需要使用关键字extends. 创建一个类时肯定会使用继承,因为每个类都是继承自根类Object. 

class animal{
    int year;
    void play(){
        System.out.println("play");
    }
}
class dog extends animal{
    void run{
        System.out.println("run");
    }
}

继承中衍生类的初始化问题

  1. 衍生类的构造器会自动调用基础类的无参构造器进行初始化;但如果你为基础类写了带参构造器而没有写无参构造器,又没有在衍生类的构造器中显式调用基础类的带参构造器,就会出错。
  2. 衍生类的构造器中要首先设置对基础类的构造器的调用,这意味着在它之前不能出现任何东西。这种设计能够保证基础类总是能在衍生类调用它之前得到正确的初始化。

继承中方法名的隐藏问题

有一个方法名被“过载”使用多次,在衍生类里对那个方法名的重新定义就不会隐藏任何基础类的版本。所以无论方法在这一级还是在一个基础类中定义,过载都会生效(和C++不同)。效果如下:

组合 or 继承?

其实这涉及到设计模式的问题----组合模式。如果一个问题可以描述成整体和部分的关系组合模式是最合适的,比如上面的汽车类和车门、轮子、发动机类之间的关系。而继承则适用于属于关系,如上面的动物类和狗类、猫类之间的关系。

因为组合有着极大的简洁性和灵活性,所以一般情况优先考虑利用组合。有一种情况必须使用继承--上溯造型

上溯造型:取得 一个对象句柄,并将其作为基础类型句柄使用。

继承的一个好处是它支持“累积开发”,允许我们引入新的代码,同时不会为现有代码造成错误。这样可将 新错误隔离到新代码里。

final关键字:

Java中用final关键字来声明某个东西不能被改变。对于基本数据类型,final 会将值变成一个常数;但对于对象句柄,final 会将句柄变成一个常数。进行声明时,必须将句柄初始化到一个具体的对象。而且永远不能将句柄变成指向另一个对象。然而,对象本身是可以修改的。

final参数:方法的参数可以设置为final,这意味着在这个个方法的内部,我们不能改变参数句柄。

final方法:第一是方法“上锁”,防止任何继承类改变它的本来含义。第二是程序执行的效率。

只要编译器发现一个final 方法调用,就会忽略为执行方法调用机制而采取的常规代码插入方法(将自变量压入堆栈;跳至方法代码并执行它;跳回来;清除堆栈自变量;最后对返回值进行处理)。相反,它会用方法主体内实际代码的一个副本来替换方法调用。这 样做可避免方法调用时的系统开销。当然,若方法体积太大,那么程序也会变得雍肿,可能受到到不到嵌入代码所带来的任何性能提升。Java 编译器能自动侦测这些情况,并颇为“明智”地决定是否嵌入一个 final 方法。然而,最好还是不要完全相信编译器能正确地作出所 有判断。通常,只有在方法的代码量非常少,或者想明确禁止方法被覆盖的时候,才应考虑将一个方法设为 final。 类内所有private 方法都自动成为final。

final类:将类定义成 final 后,结果只是禁止进行继承——没有更多的限制。然而,由于它禁止了继承,所以一个 final 类中的所有方法都默认为 final。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Google Dart

Dart语言指南(二) 顶

Dart是一种面向对象的语言 包含类和基于 mixin 的继承两部分。每个对象是一个类的实例, 并且 Object.是所有类的父类。 基于 mixin 的继承指...

2541
来自专栏Golang语言社区

Golang语言之异常处理

在编写Go语言代码的时候,我们应该习惯使用error类型值来表明非正常的状态。作为惯用法,在Go语言标准库代码包中的很多函数和方法也会以返回error类型值来表...

35513
来自专栏阿杜的世界

Java泛型的局限和使用经验泛型的局限泛型的常用经验参考资料

//使用泛型类 @Data @Builder @AllArgsConstructor @NoArgsConstructor public class Data...

812
来自专栏章鱼的慢慢技术路

牛客网_Go语言相关练习_判断&选择题(6)

反射最常见的使用场景是做对象的序列化(serialization,有时候也叫Marshal & Unmarshal)。

1161
来自专栏PHP实战技术

你应该这个姿势学习PHP(1)

  应用场景:能防止sql的注入(当然并不完全是可以,我们可以使用pdo进行预处理然后方式sql的注入,安全不能只靠一种方式防止事情的发生)

52717
来自专栏C/C++基础

C++inline函数简介

inline函数是由inline关键字来定义,引入inline函数的主要原因是用它替代C中复杂易错不易维护的宏函数。

2092
来自专栏用户2442861的专栏

const 详解

http://blog.csdn.net/hackbuteer1/article/details/7459212

1391
来自专栏向治洪

数据结构是哈希表(hashTable)

哈希表也称为散列表,是根据关键字值(key value)而直接进行访问的数据结构。也就是说,它通过把关键字值映射到一个位置来访问记录,以加快查找的速度。这个映...

22610
来自专栏JavaEdge

Java语法糖1 泛型与类型擦除

3817
来自专栏互联网杂技

前端--理解 Promise 的工作原理

Javascript 采用回调函数(callback)来处理异步编程。从同步编程到异步回调编程有一个适应的过程,但是如果出现多层回调嵌套,也就是我们常说的厄运的...

3726

扫码关注云+社区

领取腾讯云代金券