javaOO——继承
Posted libobo22
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javaOO——继承相关的知识,希望对你有一定的参考价值。
继承
子类:
1.通过extends关键字,可以直接拥有来自父类的属性和行为。(但是能不能访问要收到访问修饰符的限制 --分清楚:拥有和能不能直接操作到时两个不同概念)
子类:
1.通过extends关键字,可以直接拥有来自父类的属性和行为。(但是能不能访问要收到访问修饰符的限制 --分清楚:拥有和能不能直接操作到时两个不同概念)
2、父类的属性和行为子类自动继承,但子类不能继承父类的构造方法
原因1:构造方法的语法要求时方法名必须与类名保持一致。如果子类继承了父类的构造,那么子类就会有一个叫父类名的构造函数。这一点与构造方法的语法冲突。
原因2:构造方法的作用时产生对象的。父类的构造方法产生父类对象。子类的构造方法产生子类对象。
原因1:构造方法的语法要求时方法名必须与类名保持一致。如果子类继承了父类的构造,那么子类就会有一个叫父类名的构造函数。这一点与构造方法的语法冲突。
原因2:构造方法的作用时产生对象的。父类的构造方法产生父类对象。子类的构造方法产生子类对象。
3、虽然父类的构造方法没有被子类继承,但是在构建子类对象的过程中,会先在内存中产生父类对象部分,再叠加子类特有部分,从而构造一个完整的子类对象。
---也就是说new一个子类对象时,会先调用父类构造,再调用子类构造。
---“内存叠加”的方式
super()--调用父类的构造方法
---也就是说new一个子类对象时,会先调用父类构造,再调用子类构造。
---“内存叠加”的方式
super()--调用父类的构造方法
4、如果子类定义了和父类一摸一样的属性,那么子类对象身上会由两个该属性,一个在父类对象部分,一个在子类特有部分。
(1)该不该这么设计?
--不该,因为在设计子类的时候已经考虑了共有,设计子类的时候考虑特有。
那么每个属性只应该考虑一次,不属于父类就属于子类。所以这样设计是不合理的。
(在抽取共有属性和特有属性的时候出现问题。)基本上不会出现,但是面试常被问道。
(2)那如何区分呢?
用super.属性名 代表的是定义在父类部分的同名属性
用this.属性名 代表的是定义在子类部分的同名属性
(1)该不该这么设计?
--不该,因为在设计子类的时候已经考虑了共有,设计子类的时候考虑特有。
那么每个属性只应该考虑一次,不属于父类就属于子类。所以这样设计是不合理的。
(在抽取共有属性和特有属性的时候出现问题。)基本上不会出现,但是面试常被问道。
(2)那如何区分呢?
用super.属性名 代表的是定义在父类部分的同名属性
用this.属性名 代表的是定义在子类部分的同名属性
5、如果子类定义了和父类一模一样的方法呢? ---这叫做方法的“重写”
它指的是所有类都有的共同行为,所有我们要定义在父类中。
但是,不同的子类又有不同的实现,所以需要在子类中重新书写一次。
它指的是所有类都有的共同行为,所有我们要定义在父类中。
但是,不同的子类又有不同的实现,所以需要在子类中重新书写一次。
重写要求:
方法名必须一致
参数列表必须一致
返回类型相同或者是其子类
不能缩小被重写的访问权限:权限可以大于等于
不能缩小异常类型(也多余父类的异常类型)
方法名必须一致
参数列表必须一致
返回类型相同或者是其子类
不能缩小被重写的访问权限:权限可以大于等于
不能缩小异常类型(也多余父类的异常类型)
Java体系中实行的时单继承
Java体系中继承具有传递性
Java体系中继承具有传递性
继承的优点:
代码复用、父类的属性和方法可用于子类、设计应用程序变得更加简单、子类可以扩展父类的属性和方法、提高开发效率降低开发成本。
代码复用、父类的属性和方法可用于子类、设计应用程序变得更加简单、子类可以扩展父类的属性和方法、提高开发效率降低开发成本。
方法的重写:子类中的方法与父类中的方法相同(方法名称、参数列表、返回类型)
方法重载:一个类的方法与另一个方法相同,参数列表不同。
重写体现的是父类与子类方法之间的关系;重载体现的是一个类的内部方法之间的关系。
方法重载:一个类的方法与另一个方法相同,参数列表不同。
重写体现的是父类与子类方法之间的关系;重载体现的是一个类的内部方法之间的关系。
比较两个对象是否相等
1、==在比较的时候,始终比较的是左右两端数据的值是否相等。--假如左右两端都是引用数据类型,那么其值是引用变量所指向的对象的地址。所以用==做比较,引用数据类型比较的是两个变量是否指向同一个对象。
2、使用equals方法在比较的时候,比较的是着两个对象在业务在内容上是否相等,而不是物理存放位置(引用值)
equals方法是在Object这个类里面预先定义,既认为所有的类都应该又内容比较的方法。
但是在Object中的实现只能是Object自身,无法考虑每个具体子类特有的实现。
---所以这个方法要由具体子类的编写者根据业务情况,完成重写。
1、==在比较的时候,始终比较的是左右两端数据的值是否相等。--假如左右两端都是引用数据类型,那么其值是引用变量所指向的对象的地址。所以用==做比较,引用数据类型比较的是两个变量是否指向同一个对象。
2、使用equals方法在比较的时候,比较的是着两个对象在业务在内容上是否相等,而不是物理存放位置(引用值)
equals方法是在Object这个类里面预先定义,既认为所有的类都应该又内容比较的方法。
但是在Object中的实现只能是Object自身,无法考虑每个具体子类特有的实现。
---所以这个方法要由具体子类的编写者根据业务情况,完成重写。
toString()返回对一个对象的字符串描述
在对对象直接进行字符串操作的时候,会被直接调用
比如:直接打印一个对象
同String()同样是Object中实现,所以并不能确定每个子类应该用什么字符串描述,
只能统一返回“全类名@十六进制引用”的形式。
如果子类想要有自己的实现,就需要有重写
在对对象直接进行字符串操作的时候,会被直接调用
比如:直接打印一个对象
同String()同样是Object中实现,所以并不能确定每个子类应该用什么字符串描述,
只能统一返回“全类名@十六进制引用”的形式。
如果子类想要有自己的实现,就需要有重写
finalize()的实现是Object中实现,调用又是由GC调用。所以这个方法的设计初衷不是交给我们重写的,就是为了让后面工作。
考题:
1、finalize的作用
2、final finally finalize 的区别?
(1)final,finally,是关键字。finalize是方法
(2)final --含义就是“最终的,不可变的”
final修饰变量,变量变为常量
final修饰方法:不能被重写,称之为“最终方法”
final修饰类:不能被继承,也就是不能产生子类,称之为“最终类”,“终态类”
以上是关于javaOO——继承的主要内容,如果未能解决你的问题,请参考以下文章