package com.felay.demos;
public class Demo5 {
public static void main(String[] args) {
/**
* 第七章 复用类
*/
Demo1 demo = new Demo1();
System.out.println(demo);
System.out.println(demo.toString());
System.out.println(demo.getClass().getName()+"@"+Integer.toHexString(demo.hashCode()));
/**
* 在说到java的复用,我明显感觉到自己力不从心了,因为感觉确实对JVM底层的实现不清楚,也只能用自己的理解
* 在写了上述几行代码后,我们开可以看到它们的输出结果会是一样的,为什么输出的对象不同,但是它们的结果会相
* 同呢?这就涉及到编译器了,因为编译器帮我们做了很多工作底层的工作(记住是自动帮我们完成,尤其是类型转换).
* 那么作者为什么给出这样一个例子呢?跟java的复用有什么关系呢?
* 因为这里涉及到了toString()这个方法,这个方法是Object类的方法,而所有的类都默认继承Object类,
* 因此都可以使用该类,但是每个人想想不一定想要相同的结果,各有各的需求,我们在众多培训教材上看到的都是
* 打印出本类的字段.比如下面:
*/
Demo0 demo1 = new Demo0();
System.out.println(demo1);
System.out.println(demo1.toString());
System.out.println(demo1.getClass().getName()+"@"+Integer.toHexString(demo1.hashCode()));
/**
* 我们看到的结果便不会相同了,因为们在Demo0类中复写了Object类的toString()方法,因此,我们再次调用
* toString()方法的时候就调用复写的方法,此时,我们就已经使用了java的复用.而在以后的学习中,我们会大量
* 的使用到类似的复用,当然这只是一种复用的效果,继承.继承是体现OOP语言复用性的最大特点.而作者在本章所有的
* 思想都是围绕继承来展开的.我们已经理解了现在所谓的复用只是在子类中去复写父类中的某些成员属性或者成员方法.
* 下面我们会去仔细看看在使用复用的使用我们容易出现的错误以及想要注意的事项.
* 我在下面新建了三个普通的java类
*/
Class1 c1 = new Class1();
Class2 c2 = new Class2();
Class3 c3 = new Class3();
c1.fun();
c2.fun();
c3.fun();
c1.func();
c2.func();
c3.func();
/**
* 当我们复写了父类中的方法的时候,子类中调用该方法的时候,会优先调用子类的复写好的方法,当子类中没有复写
* 父类的反复的时候,就调用了在父类中写好的方法.这样就有一个好处,我们可以根据自己的需要来编写我们需要复
* 写的方法或者属性,这里就有一个原则,越是在上的父类,其中的成员方法或者属性就会更加抽象,一直到抽象为接口
* 中的方法为止.
*/
}
}
class Class1{
Class1(){}
void fun(){
System.out.println("hello1");
}
void func(){
System.out.println("hello11111");
}
}
class Class2 extends Class1{
Class2(){}
void fun(){
System.out.println("hello2");
}
}
class Class3 extends Class2{
Class3(){}
void fun(){
System.out.println("hello3");
}
}