面向对象三大特征:继承 ;封装/隐藏 ;多态(为了适应需求的多种变化,使代码变得更加通用!)
继承(extends)
- 类是对对象的抽象,继承是对某一批类的抽象,从而实现对现实世界更好的建模。(从OOA、OOD即面向对象设计的角度考虑)
- 继承可以提高代码的复用性!(从OOP的角度考虑)
- extends的意思是“扩展”。子类是父类的扩展。
【例1】不采用继承,这里屡次使用Animal里面的东西,很麻烦。所以很自然产生继承的概念。
//一个源文件可以定义多个类//动物Animal类public class Animal { String eye; public void run(){ System.out.println("跑跑"); } public void eat(){ System.out.println("吃吃"); }}//哺乳动物Mammal类 class Mammal{ String eye; public void run(){ System.out.println("跑跑"); } public void eat(){ System.out.println("吃吃"); } public void taiSheng(){ System.out.println("我是胎生"); }} //爬行动物 class Paxing{ String eye; public void run(){ System.out.println("跑跑"); } public void eat(){ System.out.println("吃吃"); } public void eggSheng(){ System.out.println("我是卵生"); } }
采用继承后:
//一个源文件可以定义多个类//动物Animal类public class Animal { String eye; public void run(){ System.out.println("跑跑"); } public void eat(){ System.out.println("吃吃"); }}//哺乳动物Mammal类 class Mammal extends Animal{ //Mammal类扩展自Animal类,继承它的一切,Animal类里面有什么,Mammal类就有什么,再加上自己的 public void taiSheng(){ System.out.println("我是胎生"); }} //爬行动物 class Paxing extends Animal{ public void eggSheng(){ System.out.println("我是卵生"); } }
【小结】
- 子类继承父类,可以得到父类的全部属性和方法(除了父类的构造方法)。
- Java中类只有单继承,(一个类只有一个直接父类)没有像C++那样的多继承。多继承会引起混乱,使得继承链过于复杂,系统难以维护。就像我们现实中,如果你有多个父母亲,那么是一个多么混乱的世界啊。多继承,就是为了实现代码的复用性,却引入了复杂性,使得系统类之间的关系混乱。
- Java中的多继承,可以通过接口来实现。
- 如果定义一个类时,没有调用extends,则它的父类是java.lang.Object.
- 不同的叫法:超类、父类、基类、子类、派生类
|
方法的重写(覆盖,override)
如何定义重写:在Java程序中,类的继承关系可以产生一个子类,子类继承父类,它具备了父类所有的特征,继承了父类所有的方法和变量。子类可以定义新的特征,当子类需要修改父类的一些方法进行扩展,增大功能,程序设计者常常把这样的一种操作方法称为重写,也叫称为覆写或覆盖。
重写体现了Java优越性,重写是建立在继承关系上,它使语言结构更加丰富。在Java中的继承中,子类既可以隐藏和访问父类的方法,也可以覆盖继承父类的方法。在Java中覆盖继承父类的方法就是通过方法的重写来实现的。
所谓方法的重写是指子类中的方法与父类中继承的方法有完全相同的返回值类型、方法名、参数个数以及参数类型。这样,就可以实现对父类方法的覆盖。
- 在子类中可以根据需要对从基类中继承来的方法进行重写。
- 重写方法必须和被重写方法具有相同的方法名称、参数列表和返回类型。
- 重写方法不能使用比被重写方法更严格的访问权限(由于多态)
- 注:重载(overload)和重写没有任何关系。
【例子code】
父类Person类:
public class Person { private int age; private String name; public void setAge(int age){ this.age = age; } public void setName(String name){ this.name = name; } public int getAge(){ return age; } public String getName(){ return name; } public String getInfo(){ return "Name is:"+name+",Age is "+age; }}
子类Student类:
public class Student extends Person{ private String school; public String getSchool() { return school; } public void setSchool(String school) { this.school = school; } public String getInfo(){ return "Name is:"+getName()+",Age is "+getAge()+",School is:"+school; }}
测试代码:
public class TestOverRide { public static void main(String[] args) { Student student = new Student(); Person person = new Person(); person.setAge(1000); person.setName("lili"); student.setAge(23); student.setName("vic"); student.setSchool("shnu"); System.out.println(person.getInfo()); System.out.println(student.getInfo()); }}
运行结果:
Name is:lili,Age is 1000Name is:vic,Age is 23,School is:shnu
View Code
Object类
- Object类是所有Java类的根基类
- 如果在类的声明中未使用extends关键字指明其基类,则默认基类为Object类
查看Object源码,可以留意到一些方法:
equals()方法
toString()方法
- 重写:toString方法
- 默认返回:包名+类名+@+哈希码
- 哈希码是根据对象内存位置生成,唯一不重复
- toString方法可以被重写
【例子】Mobile类
public class Mobile {//如果在类的声明中未使用extends关键字指明其基类,则默认基类为Object类 //重写父类Object类的toString() public String toString() { return "我是一部移动电话"; }}
测试Object类:
public class TestObject { public static void main(String[] args) { Object obj=new Object(); Object obj1=new Object(); System.out.println(obj.toString());//java.lang.Object@c3c749:类名+@+哈希码 System.out.println(obj1.toString());//哈希码是根据地址来的。 System.out.println(obj == obj1);//false System.out.println(obj.equals(obj1));//false Mobile m=new Mobile(); System.out.println(m.toString()); }}
执行结果:
java.lang.Object@c3c749java.lang.Object@150bd4dfalsefalse我是一部移动电话
View Code
ps:
myeclipse/eclipse查看继承结构(类型层次结构):鼠标指针放在类名上,按住ctrl+t;或对类名点击鼠标右键,选择open Type Hierarchy(或者F4)
Mammal类继承了Animal,Animal继承了Object
原标题:面向对象编程(九)——继承、重写、Object类
关键词:面向对象