为什么要有继承
因为我们在开发过程中类与类之间的代码会出现代码冗余,这个时候就需要我们的继承了。
就是将重复的代码都提炼到第三个类中,然后通过后面的操作书写双方的继承关系
提示:以下是本篇文章正文内容,下面案例可供参考
一、继承的概念
继承就是将子类中的共性(就是重复 相似的内容)进行抽取,生成父类,建立在继承关系下,子类可以拥有父类所有的可被继承的类( private 私有类不能被子类继承)
语法
public class 子类类名 extends 父类类名{
}
二、使用
注意事项
- 必须建立在is a (既对象与对象之间的关系)关系之上
- 子类可以拥有独有内容
- 子类可以调取到所有的可以被调取到的内容(包括属性和方法 函数)
- 一个类在身为一个子类的同时仍然可以是其他类的父类
-
一个类在身为子类的同时仍可以是其他类的父类
-
子类可以继承拥有所有父类所有可被继承的内容
-
一个子类只能拥有一个直接父类
-
一个父类可以拥有多个直接子类
-
父类构造子类无法继承
-
父类的私有内容子类无法直接继承访问(需要 get set 方法)
代码如下(示例):
//动物类-父类
public class Animal {
//特征:名字、年龄、性别
public String name;
public int age;
public String sex;
//行为:吃饭、睡觉
public void eat(){
System.out.println("吃饭");
}
public void sleep(){
System.out.println("睡觉");
}
}
/**
* 狗
*/
public class Dog extends Animal{
//独有方法-看门
public void lookDoor(){
System.out.println("看门");
}
}
//金毛类
public class JinMao extends Dog{
}
/**
* 猫
*/
public class Cat extends Animal{
}
//测试类
public class Test {
public static void main(String[] args) {
//创建Dog对象
Dog dog = new Dog();
dog.name = "小黑";
dog.eat();
dog.sleep();
//创建Cat对象
Cat cat = new Cat();
cat.name = "小花";
cat.eat();
cat.sleep();
//创建一个Animal对象
Animal animal = new Animal();
//animal.lookDoor();错误
//创建一个金毛对象
JinMao jm = new JinMao();
jm.lookDoor();
jm.eat();
jm.sleep();
}
}
方法重写(覆盖)
在继承关系中,如果说子类不满足于父类提供的方法实现,那就可以选择对方法实现重写
概念
子类对父类中继承过来的方法进行方法体的重新书写,简称方法重写
使用
方法重写之后,子类对象会优先执行自身重写之后的代码
父类的作用
-
解决子类之间的代码冗余问题
-
强制子类拥有某些内容
子类的内存结构
子类的内存空间由父亲内容+独有的内容构成
父类封装
父类也是类,所以内部属性也应该进行系统性的封装
父类将属性封装之后,子类无法直接通过对象名.属性名
的方式直接访问父类声明属性,必须通过对象名.getter()|对象名.setter()
的形式对属性进行访问
Super 关键字
代表父类对象
Super()
作用为调用父类构造内容
使用
-
通过实参列表决定调用的是哪个父类构造
-
必须写在构造方法有效代码第一行
-
无法与this()共存
-
子类构造第一行默认存在无参的
super()
,当手动调用super方法之后或书写了this方法调用之后,该默认存在的super()
将会失效
语法
可以借助super()实现在子类有参构造中为父类中声明的属性赋值的操作
1. 父类中正常声明有参构造public class Animal {//特征:名字、年龄、性别private String name;private int age;private String sex;public Animal(){}public Animal(String name,int age,String sex){System.out.println("正在执行animal有参构造...");this.name = name;this.age = age;this.sex = sex;}//getter、setter方法...//行为:吃饭、睡觉...}2. 子类书写有参构造,将希望赋值的形参正常声明,内部调用super()利用对应的父类有参构造实现赋值public class Dog extends Animal{public Dog(){}public Dog(String name,int age,String sex){//调用父类中的有参构造方法为父类中声明的属性赋值super(name,age,sex);}}
super.
-
指明调用父类属性或方法
super.属性名 super.方法名(实参)
父类属性封装之后,无法通过super.属性名
访问父类属性
有继承关系的对象创建过程
-
给父|子类属性分配空间,赋默认值
-
给父类属性赋初始值
-
执行父类构造再次赋值
-
给子类属性赋初始值
-
执行子类构造再次赋值
总结
这就是今天学习的内容讲了对象的继承,使用规则,方法覆盖 和 他的规则,Siper()的使用、