继承:
如果有一个类是动物类Animal,那么Animal类中的所有属性和方法在哺乳动物中也会有,那么哺乳动物就是动物的子类,动物是哺乳动物的父类。这种关系叫做继承。
- 继承的特点:子类继承父类的特征和行为,使得子类具有父类的各种属性和方法,或子类从父类继承方法,使得子类具有和父类相同的行为。
在继承关系中,父类更通用,子类更具体。父类具有更通用的特征和行为,而子类除了具有父类的特征和行为,还具有一些自己特殊的特征和行为。
- 继承的优点:继承可以有效的实现代码的复用,避免重复的代码的出现。当两个类具有相同的特征和行为的时候,可以将相同的部分抽取出来放到一个类中作为父类,让其他的两个类继承这个父类。
被继承的类叫做父类(基类,超类)。
继承的类叫做子类。
- 继承的语法:
[修饰符] class 类名 extends 父类名{ //类的结构体 } |
在java中用extends关键字来表示一个类继承了另一个类。在父类中定义一些通用的方法和属性,子类自动去继承父类的属性和方法(私有的除外)。
例如:动物类Animal
package com.bxit; /** * 动物的类 * @author zhy * */ public class Animal extends Animal1{ public static final double PI=3.14;//定义一个常量 private String name;//姓名 private double weight;//体重 private int age;//年龄 private double size;//大小 public double getWeight() { return weight; } public void setWeight(double weight) { this.weight = weight; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public double getSize() { return size; } public void setSize(double size) { this.size = size; } public String getName() { return name; } public void setName(String name) { this.name = name; } public void eat(String nameq){ System.out.println(name+"在吃东西"); } public Animal(String name) { System.out.println("父类的构造方法被执行了"); } public Animal(String name,int age) { System.out.println("父类的构造方法被执行了"); } public Animal() { // TODO Auto-generated constructor stub } } |
子类Cat:
package com.bxit1; import com.bxit.Animal; public class Cat extends Animal{ private String color; public String getColor() { return color; } public void setColor(String color) { this.color = color; } //抓老鼠 public void mouse(){ System.out.println(getName()+"在抓老鼠"); } public void test(){ eat("小黑"); } //方法的重写 @Override//用来检查方法是否重写正确 public void eat(String name){ System.out.println(getName()+"在吃老鼠"); } public Cat(){ //调用父类的两个参数的构造方法 super("cat"); System.out.println("子类的构造方法被执行了"); } } |
注意:
子类不可以继承父类的那些属性和方法?
构造方法可以被子类调用,但是不可以被子类继承。
在java中一个类只能有一个直接的父类(单继承),但是间接的可以继承多个父类。
一个父类可以有很多个子类。
- 父类的构造方法的调用:
在子类的构造方法中可以通关过super关键字来调用父类的构造方法
语法为:
super([参数列表]);
注意:使用super调用父类的构造方法的时候,必须将super语句放在构造方法的第一行。
使用super调用父类中的构造方法的时候,父类中必须存在相应的构造方法。
例如:
public Cat(){ //调用父类的一个参数的构造方法 super("cat"); System.out.println("子类的构造方法被执行了"); } |
- 继承的时候构造方法的调用顺序:
1.如果创建子类的时候,子类中没有去调用父类中的构造方法,默认的会调用父类的无参的 构造方法。(有几个父类就会调用几个构造方法)。
2.构造方法调用的顺序是从最上层的父类开始。
Object类:
在java中,java.lang.Object类是所有类的父类,当一个类没有使用extends关键字显式继承其他类的时候,该类默认继承了Object类,因此,所有的类都是Object类的子类,都具有Object类的方法和属性。能够被外界访问的Object类的主要成员方法有:
返回类型 | 方法名 | 方法说明 |
Object | clone() | 创建并返回此对象的一个副本 |
boolean | equals(Object obj) | 指示其他某个对象是否与此对象“相等” |
void | finalize() | 当垃圾回收器确定不存在对改对象的引用的时候,由对象的垃圾回收器调用此方法。 |
int | hashCode() | 返回该对象的哈希码值 |
String | toString() | 返回该对象的字符串表示 |
注意:所有的类都会直接或者间接的继承Object类。
方法的重写:
在子类中可以重新的定义父类中的属性,重写父类中的方法可以获得与父类不同的功能。
- 重写条件:
1.方法的名称必须相同
2.访问权限的修饰符范围在重写的时候不能被缩小,只能是相等或者扩大。
3.方法的返回类型必须一致。
4.方法的参数列表必须一样,包括数量和数据类型,参数名称没有要求。
5.用final修饰的方法不能够被重写(覆盖)
验证方法重写是否正确的时候在方法的上面添加注解@Override
例如:父类中的方法
public void eat(String nameq){ System.out.println(name+"在吃东西"); } |
子类中重写的方法
//方法的重写 @Override//用来检查方法是否重写正确 public void eat(String name){ System.out.println(getName()+"在吃老鼠"); } |
知识补充:
final修饰符:
final代表最终的,终止的。
使用final可以修饰类。方法 。属性、变量等。
- 被final修饰的类不可以被继承。例如String类就是被final修饰的类。
public final class String extends Object implements Serializable, Comparable<String>, CharSequence |
2.被final修饰的方法不可以被重写。
3.被final修饰的属性或者变量不可以被修改,一般final和static一起来修饰常量。
例如:
public static final double PI=3.14;//定义一个常量 |