上次我总结到了封装,今天来总结下继承
继承顾名思义就是儿子继承老爸的东西,在java中我们为了减少代码的重复性、复杂度,减少系统冗余等等(其实也就是偷个懒,省时省力)
换而言之什么时候用呢,就是存在多个类中存在相同属性和行为时,将这些内容抽取到单独A类中,那么多个类无需再定义这些属性和行为,只要继承A类即可。
A类即为父类,其他继承A类的类就是子类,子类可以继承父类中非私有的属性和方法
这之前我们先来认识下类的大致组成:属性、构造函数、方法
int height;//属性
public animal() {//构造函数
super();
// TODO Auto-generated constructor stub
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public void eat() {//方法
System.out.println("吃东西");
}
一、实现继承方式
:class 子类名 extends 父类{}
打个比方猫、狗、猪共同有身高、体重的属性和吃饭、睡觉的行为,那么我们可以将共有属性都封装在一个类中。代码实现如下
1.先写一个动物的类(和上一节一样)
public class animal {
int height;//身高属性
int weight;//体重属性
String color;//颜色属性
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public void eat() {//吃东西的行为
System.out.println(“吃东西”);
}
public void sleep() {//睡觉行为
System.out.println(“睡觉”);
}
}
2.在写一个猫的子类来继承
public class cat extends animal{//实现继承
}
3.写一个测试类
@Test
public void test1() {
cat c = new cat();//实例化对象
c.setColor("blue");
c.setHeight(13);
c.setWeight(15);
System.out.println("颜色:" + c.getColor());
System.out.println("高度:" + c.getHeight());
System.out.println("重量:" + c.getWeight());
}
输出为:
颜色:blue
高度:13
重量:15
注意事项
1.子类只能继承父类中非私有化的属性和方法,也就是权限修饰符为public或默认,而不是private
private String color;//颜色属性
private int getHeight() {
return height;
}
如果是这样,那么调用方法或者属性时会报错 c.getHeight();
2…Java只支持单继承,不支持多继承
一个类只能有一个父类,不可以有多个父类
//一个类只能有一个父类,不可以有多个父类。
class SubDemo extends Demo{} //ok
class SubDemo extends Demo1,Demo2…//error
3.子类只是继承父类中的方法或者属性,并不是连同值一起继承如代码所示
animal a = new animal();
a.setColor("blue"); a.setHeight(13); a.setWeight(15);
cat c = new cat();
System.out.println("颜色:" + c.getColor());
System.out.println("高度:" + c.getHeight());
System.out.println("重量:" + c.getWeight());
这样输出全部为初始值
颜色:null
高度:0
重量:0
二、实现继承的内容
super和this有什么区别?
super是一个关键字,代表父类的存储空间标识。(可以理解为父亲的引用)
super和this的用法相似。
this代表对象的引用(谁调用就代表谁);
super代表当前子类对父类的引用。
使用场景
当子父类出现同名成员时,可以用super进行区分;
子类要调用父类构造函数时,可以使用super语句。
super();和this();都是在构造函数的第一行,不能同时出现。
方法重写和重载有什么区别?
方法的重写
用在子类方法与父类方法一模一样时,除权限修饰符,返回值类型,方法名和参数列表都是相同的。
比如说在animal类和cat类中都有一个一样的方法
public void eat() {//吃东西的行为
System.out.println("吃东西");
}
重载
用在同一个类中各方法方法名相同,参数列表不同(与返回值类型没有关系)的情况
比如在animal中有这样的方法。
public void eat() {//吃东西的行为
System.out.println("吃东西");
}
那么我还可以新建一个方法
public void eat(String name,int speed){
System.out.println("吃" + name);
System.out.println("吃的速度" + speed);
}
final关键字
final是一个关键字,可以用于修饰类,成员变量,成员方法。
特点:
它修饰的类不能被继承。
它修饰的成员变量是一个常量。
它修饰的成员方法是不能被子类重写的。
final修饰的常量定义一般都有书写规范,被final修饰的常量名称,所有字母都大写。
final修饰成员变量,必须初始化,初始化有两种
显示初始化;
构造方法初始化。
但是不能两个一起初始化
final和private的区别:
final修饰的类可以访问;
private不可以修饰外部类,但可以修饰内部类(其实把外部类私有化是没有意义的)。
final修饰的方法不可以被子类重写;
private修饰的方法表面上看是可以被子类重写的,其实不可以,子类是看不到父类的私有方法的。
final修饰的变量只能在显示初始化或者构造函数初始化的时候赋值一次,以后不允许更改;
private修饰的变量,也不允许直接被子类或一个包中的其它类访问或修改,但是他可以通过set和get方法对其改值和取值。