Java面向对象三大特征-继承
-
概念
继承是面向对象程序设计不可缺少的设计思想,是实现代码可重用的根基,是提高代码可扩展性的主要途径.
继承是从已有的类中派生出新的类,新的类能吸收已有类的属性和行为,并能扩展新的能力.
注意:
- 在Java中使用extends关键字来表示继承关系.
- Java不支持多继承,单继承是Java的继承关系很简单,一个类只能有一个直接父类.
- 继承之后子类可以调用父类的所有非私有属性和私有方法.
-
何时用
符合is-a关系的设计
例如:猫是动物 ,狗是动物.
猫和狗都拥有一些动物相同属性,比如吃,走等.
如果单独把猫狗分类会增加代码的重复,这时利用继承可以把一些非私有的相同属性定义,在动物这个基类/父类的基础上,派生出猫和狗新的类,这些新类可以拥有父类非私有属性和非私有方法,并且加以扩展出一些自己独有的属性方法.这样就提高了代码的可重用性和可扩展性.
-
语法
继承的形式:[访问权限修饰符] [修饰符] 子类名 extends 父类名{子类体}
例如:
public class Animal extends Object{//定义父类Animal,其实Animal也是默认继承object父类的,不显示 public void eat(){ System.out.println("动物吃"); } }
public class Dog extends Animal{//子类Dog继承父类Animal,拥有Animal非私有属性和非私有方法 } public static void main(String[] args){ Dog dog = new Dog();//创建dog对象 dog.eat();//dog子类调用父类Animal的eat()方法 }
专业术语
Dog类是 Animal类的子类, Animal类是Dog类的父类
Dog类是 Animal类的派生类, Animal类是Dog类的基类
-
继承的传递性
C类从B类继承,B类又从A类继承
那么C类就具有B类和A类的所有非私有属性和非私有方法
当一个没有继承任何一个类时,jvm会默认让类继承Object类
Object是 java为所有类提供的基类
-
继承中的构造方法
子类构造方法总是先调用父类构造方法,默认情况下,调用父类无参构造方法.
public class Animal extends Object{ public Animal(){ System.out.println("Animal无参构造方法"); } }
public class Dog extends Animal { public Dog(){ super();//默认在构造方法第一行使用super调用父类构造方法,没有显式的声明,默认在第一行,显示调用也必须在第一行 System.out.println("Dog无参构造方法"); } }
public class Test { public static void main(String[] args) { new Dog();//在创建子类对象时会默认调用父类的无参构造方法的创建父类对象,而且是先调用父类构造方法 } } /*结果: Animal无参构造方法 Dog无参构造方法 */
可以在子类构造方法的第一行,使用super关键字调用父类任意
一个构造方法.
例如:
public class Animal extends Object{ String name; int age; public Animal(){ System.out.println("Animal无参构造方法"); } public Animal(String name,int age){ System.out.println("Animal有参构造方法"); } }
public class Dog extends Animal { public Dog(){ super("哈哈",3);//显式的调用了父类中有参构造方法 System.out.println("Dog无参构造方法"); } }
public class Test { public static void main(String[] args) { Dog dog = new Dog(); } } /* 结果 Animal有参构造方法 Dog无参构造方法
如果用super,必须写在方法的第一句.
如果子类的构造方法中没有显式地调用基类构造方法,则系统默认调用基类无参数的构造方法.
原因:子类创建后需要调用父类的方法,所以在创建子类对象时父类也需要同时被创建.
-
super关键字用途
super关键字代表父类的引用,在程序中主要的用途
- 在子类构造方法中要调用父类的构造方法,需要注意:super语句只能出现在子类构造方法体的第一行.
- 用**“super.成员变量名”**来引用父类成员变量.
- 用**“super.方法名(参数列表)”**的方式访问父类的方法.
- 与this的区别,this通常指代当前对象,super通常指代父类.
-
方法的重写
在子类中可以根据需要对从父类中继承来的方法进行重写.
方法重写规则
-
方法名相同,参数列表相同
-
返回值类型相同
-
访问权限相同
-
即与父类方法结构完全相同
注意:构造方法不能重写
应用场景
当父类的方法实现不能满足子类需求时,可以对方法进行重写.
例如:
public class Animal extends Object{//Animal为父类 public void eat(){ System.out.println("吃"); } }
@Override//java注解,是java中事先定义好的注解标签 //@Override作用在类,属性,方法上,用于标记,运行时/编译时进行解析检测 /** * 重写:在子类中可以根据需求对从基类中继承来的方法进行重写 * 当父类的方法实现不能满足子类需求是,可以将父类中定义好的功能方法重写过来 */ public void eat() { System.out.println("狗"); super.eat();//重用父类方法,即System.out.println("吃"); }
public class Test { public static void main(String[] args) { Dog dog = new Dog(); dog.eat(); } } /* 结果 狗 吃 */
-