上次我为大家写出啦“封装性”,封装性是面向对象三大特性之一是Java学习必备的知识,如没有了解透彻的话请打开下方文章在进行观看一下哦!!今天我们来说一下面向对象三大特性之“继承性”。
【Java入门姿势【面向对象6】三大特性之一封装性】
继承(Inheritance)是面向对象编程的三大特征之一,它让我们更加容易实现对于已有类的扩展、更加容易实现对于现实世界的建模。嘿~嘿~我们今天该来啃~啃它~
继承让我们更加容易实现类的扩展。 比如,我们定义了人类,再定义Boy类就只需要扩展人类即可。实现了代码的重用,不用再重新发明轮子(don’t reinvent wheels)。
从英文字面意思理解,extends的意思是“扩展”。子类是父类的扩展。现实世界中的继承无处不在。比如:
上图中,哺乳动物继承了动物。意味着,动物的特性,哺乳动物都有;
在我们编程中,如果新定义一个Student类,发现已经有Person类包含了我们需要的属性和方法,那么Student类只需要继承Person类即可拥有Person类的属性和方法。
public class Animal {//extends Object private String color;//颜色 private int age;//年龄 public Animal() { super(); } public Animal(String color, int age) { //alt+insert this.color = color; this.age = age; } public void eat(){ System.out.println("eating .........."); } public void sleep(){ System.out.println("sleeping............"); } public void introduce(){ System.out.println(color+" "+age); } } public class Dog extends Animal{ private String nickName;//昵称 public Dog() { } public Dog(String color,int age){ } public Dog(String color,int age,String nickName){ // this.color = color; // this.age = age; super(color,age); this.nickName = nickName; } public void guard(){ System.out.println("Dog guarding......"); } } public class Cat extends Animal { private int eysSight;//视力 public Cat() { super();//默认调用父类的无参数构造方法 } public Cat(String color, int age, int eysSight) { super(color,age); this.eysSight = eysSight; } public void grabMouse(){ System.out.println("Cat grab mouse.........."); } } public class Test { public static void main(String[] args) { Dog dog = new Dog("黑色",3,"旺财"); dog.eat();//从父类继承的方法 dog.sleep();//从父类继承的方法 dog.introduce();//从父类继承的方法 dog.guard();//子类特有的方法 Cat cat = new Cat("花色",3,5);//alt+enter cat.eat(); cat.sleep(); cat.introduce(); cat.grabMouse(); } }
1. 父类也称作超类、基类。子类:派生类等。
2. Java中只有单继承,没有像C++那样的多继承。多继承会引起混乱,使得继承链过于复杂,系统难于维护。
3. 子类继承父类,可以得到父类的全部属性和方法 (除了父类的构造方法),但不见得可以直接访问(比如,父类私有的属性和方法)。
4. 如果定义一个类时,没有调用extends,则它的父类是:java.lang.Object。
父类的方法introduce()已经无法满足子类的需求,怎么办?同理,Object类的toString()已经无法满足Animal类、Dog类的需求,怎么办??? 其实可通过方法重写(override)解决,或者称为方法覆盖
public class Animal {//extends Object protected String color;//颜色 private int age;//年龄 public Animal() { super(); } public Animal(String color, int age) { this.color = color; this.age = age; } public void introduce(){ System.out.println(color+" "+age); } @Override public String toString() { //return super.toString(); return "Animal[color="+color+",age="+age+"]"; } } public class Dog extends Animal{ private String nickName;//昵称 public Dog() { } public Dog(String color, int age){ } public Dog(String color, int age, String nickName){ // this.color = color; // this.age = age; super(color,age); this.nickName = nickName; } public void introduce(){ //this.introduce(); //super.introduce(); System.out.println(color+" "+this.getAge()+" "+nickName); } public void guard(){ //this.guard(); //super.guard(); System.out.println("Dog guarding......"); } @Override public String toString() { //return super.toString()+" "+nickName; return "Dog[name="+color+",age="+getAge()+ ",nickName="+this.nickName+"]"; } }
如果没有看懂的小伙伴:我再来总分总展示一下,去更清晰的了解
总:方法重载和方法重写(覆盖)是面向对象中两个重要概念,其实这两个概念之间没有什么关系,但是毕竟都是关于方法的,毕竟容易引起混淆。对此我也做了一些归纳,感觉能够把这两个概念很好的区分开。我打算从总体区别、细节区别两个方面来说明。
分:总体的区别:最主要的区别,是解决的问题不同,即作用不同。
重载:overload
同一个类中,在一个类里面为一种行为提供多种实现方式并提高可读性
重写:override
子类和父类间,父类方法无法满足子类的要求,子类通过方法重写满足要求
细节的区别:一个方法的声明自左向右包括权限修饰符、方法返回值、方法名、参数列表、抛出的异常类型等。下面从这几方面说明区别:
总:重载实例:构造方法重载、println()方法重载
重写实例:Object类的toString()、equals()、hashCode()等都可以被子类重写
不知道这样下来能够让你们看懂不