第04周 预习、实验与作业:类的设计与继承
课前问题列表
一、为什么说Java中的所有类都is-a Object?
在java中所有的类都直接或者间接的继承Object类,所以可以说所有的类都is-aObject类。
二、在JDK文档中查找Object的toString方法。说一说,该方法有什么用?使用Eclipse查看Object的toString方法的代码,结合代码说说该代码的用途。
toString方法为Object中的一个方法,它的作用是返回一个表示该对象的的字符串,如果未重写该方法,返回的是该对象的类名 + "@" + 该对象的的hashCode()的16进制表示法的字符串。
如图所示,此为IDEA上Object中的toString方法。
从代码可以看出,Object的toString方法首先使用getClass().getName()获取当前对象的类名,并使用"@"符号连接该类名和接下来的哈希码。哈希码可以通过hashCode()方法获得,用来标识对象的唯一标识符。
通过调用对象的toString方法,可以将对象转换为字符串形式,便于打印输出、日志记录以及调试过程中观察对象的状态和属性。此外,toString方法也常用于在集合类中进行元素的字符串表示,方便理解和调试代码。
总结起来,Object的toString方法用于返回一个表示对象的字符串,提供对象的可读性和可识别性。
三、在Eclipse中查看Object的equals方法的代码,说说equals的用途。该方法被什么修饰符修饰,意味着什么?什么时候需要覆盖equals方法?结合String类的equals方法说说覆盖如何体现子类特有的特性?
如图为Object中的equals方法。
该代码使用 "==" 运算符来比较两个对象,比较两个对象的引用是否相同。
equals方法被public修饰符修饰,表示它可以在任何地方被访问和调用。
当我们需要根据对象内部的实际内容来比较,而不仅仅是比较两个对象的引用时就需要我们重写equals方法了。
如图为Object中的重写后的equals方法。
该方法先比较两个对象的引用是否相同,如果相同则直接返回true。如果不相同,但是anObject的运行类型为String的话则把它们中的value[]的长度继续比较,如果不同,则返回false。如果相同,则依次比较两个value[]中的字符,如果全部相同则返回true,否则返回false。如果运行类型不是String的话就直接返回fasle。
通过覆盖equals方法,String类实际上体现了其子类特有的特性,即比较字符串的内容而不仅仅是引用。这使得我们可以在使用String类时,通过equals方法来判断两个字符串是否相等。
四、如果在子类中想要复用父类的代码,要怎么办?
在子类中复用父类的代码,可以使用Java中的继承机制和关键字super来实现。
首先,在子类的定义中使用关键字extands来继承父类。这样子类就会继承父类的成员(字段和方法),包括父类的构造方法。
然后,可以在子类中使用关键字super来访问父类的成员。通过关键字super,可以调用父类的构造方法、访问父类的实例字段和调用父类的实例方法。
五、可选:继承是复用代码的唯一方式吗?
1、组合:组合是将多个类的实例嵌套在一起,形成新的类的实例。通过嵌套不同的类实例,可以实现不同层次的功能组合。例如,一个汽车对象可以由引擎、轮胎、座椅等组成,这些部件都是不同的类实例。组合可以实现代码的复用,而且比继承更加灵活。
如图所示:
2、委托:委托是将某个对象的功能委托给其他对象来实现。委托可以通过接口或抽象类来定义,让多个对象来实现。这样,一个对象可以将某些功能交由其他对象来完成,从而实现代码的复用。
3、模板方法:模板方法是将公共的算法流程封装在抽象类或接口中,然后由子类实现具体步骤的算法。在模板方法中,子类只需要实现特定的算法步骤即可。模板方法可以实现代码的复用,同时也符合面向对象编程的开闭原则(对扩展开放,对修改关闭)。