目录
第五章、继承
一、继承
- 通过extends关键字可以实现继承
- 子类可以通过继承获取父类的属性和方法,也可以定义自己独有的属性和方法。
- 继承单一性: 一个子类只能有一个父类(1个儿子只能有一个爸爸),但一个父类可以有多个子类。
- 继承: 子类继承父类--->代码的复用性
1.主要作用: 子类可以通过继承获取父类的属性和方法
2.特性:单一继承性,一个子类只能有一个父类
1.继承的格式
格式: class Son extents Father extends:关键字
/**
* 子类
* @author JeffLee
*
*/
public class SubClass extends SuperClass{
public static void main(String[] args) {
new SubClass().SuperInfo();
//子类对象调用了子类中继承的SuperInfo方法。
}
}
//父类
class SuperClass {
String name;
int age;
public void SuperInfo() {
System.out.println("SuperInfo....");
}
}
2.继承中的构造方法
-
1.当存在继承关系时,执行子类的任意构造方法时 要先去执行父类的无参构造方法,再执行子类的构造方法
-
2.当存在继承关系时,父类必须得有无参构造方法,否则会报错。
-
3.执行时先执行父类的无参构造,后执行子类
-
4.super关键字---->父类对象;结合this--->当前对象;
-
5.this();------>当前类的构造方法 super();----->表示父类的构造方法
-
对于执行子类构造方法时先去调用父类的构造方法,可以理解为,编译器给每一个子类的构造方法都都加了super()执行父类的无参构造方法,当我们显式的为子类构造方法提供了super()的结构.
package com.hqyj.oop.extend;
/*
父类:
*/
public class Father {
String name;
int age;
public Father() {
System.out.println("父类的无参构造方法....");
}
public Father(int x) {
System.out.println("父类的一个参数构造方法....");
}
public void showFather(){
System.out.println("showfather....");
}
}
/*
子类:
*/
public class Son extends Father{
public Son() {
super(1); //相当于加一个super();
System.out.println("执行了子类的无参构造方法");
}
public Son(int x) {
System.out.println("子类的一个参数的构造方法");
}
public void showson(){
System.out.println("sonshow");
}
}
/*
继承中的构造方法
*/
public class TestExtend2 {
public static void main(String[] args) {
Son son = new Son(); //实例化了son对象
//会执行父类的无参构造方法
}
}
3.父类的引用指向子类对象
-
父类的引用可以指向子类的对象,也叫做子类对象向上造型为父类类型。 当
-
父类的引用指向子类对象时,父类的引用只能访问父类的属性和方法。
public class TestExtend3 {
public static void main(String[] args) {
//new SubClass(1); //创建子类的对象
//子类的引用指向子类对象
SubClass sub = new SubClass();
sub.showsuper();
sub.showSub();
//多态:
SuperClass superClass1 = new SuperClass(); //父类的引用指向父类对象
//子类类型向上造型成为了父类类型,
superClass1.showsuper();
SuperClass superClass2 = new SubClass();
//父类的引用指向子类对象,父类的引用只能使用父类的属性和方法
superClass2.showsuper();
}
}
/*
子类(基类)
*/
public class SubClass extends SuperClass{
public SubClass() {
System.out.println("子类无参构造方法");
}
public SubClass(int x) {
System.out.println("子类一个参构造方法");
}
public void showSub(){
System.out.println("Subshow....");
}
}
/*
父类(超类)
*/
public class SuperClass {
String name;
public SuperClass() {
System.out.println("父类的无参构造方法");
}
public SuperClass(int x) {
System.out.println("父类的一个参构造方法");
}
public void showsuper() {
System.out.println("showsuper.......");
}
}
4.总结
继承:
-
1.通过extends关键字实现继承,子类继承父类,子类可以获取父类的属性和方法
-
2.子类可以定义自己的独有的方法,功能扩展
-
3.单一继承性,一个子类只有一个父类
-
4.可以多层继承,一个子类可以有一个父类,一个父类可以另一个父类
继承中的构造方法:
-
1.在继承关系中,执行子类的构造方法时,会先执行父类的无参构造方法, 如果父类没有无参构造方法就会出现编译错误
-
2.super关键字:指代父类对象 super();表示执行了父类的无参构造方法; super(参数):表示执行了父类的对应参数构造方法
-
3.在继承结构中,编译器会默认在子类的构造方法中第一行,加一个super(), 因此会在执行子类的构造方法时,先去执行父类的无参构造方法
-
4.当我们显式的写出了任意的super(),那么编译器不会再提供super()
-
5.super()必须放在构造方法的第一行
-
6.可以用super()调用父类的方法,表示父类引用
父类的引用指向子类对象:
-
1.父类的引用指向子类对象时,只能调用父类的属性和方法。
二、重写
1.方法的重写
-
子类可以重写(覆盖)父类中定义的方法,即方法名和参数列表与父类方法相同,但方法体不同
-
当子类对象重写的方法被调用时,无论引用是父类还是子类都执行重写后的方法。
2.重写时的super
@Override
public void show() {
super.show();//可以使用父类的关键字super调用父类的show方法
System.out.println("Subshow!");
}
3.重写与重载的区别
-
重载
- 发生在编译期
- 方法名相同,但参数列表不同
- 调用时根据方法名和参数列表去判断
-
重写
- 发生在运行期
- 前提是: 存在继承关系时,子类重写的方法与父类完全一致
- 调用时根据引用指向的对象类型去判断
4.练习
1.新建一个类Shape(图形类)。实现功能:
计算面积(area)的功能:输出字符串area.....
计算周长(perimeter)的功能:输出字符串perimeter.....
2.新建一个Circle(圆类)继承Shape类,重写他的Area方法和perimeter方法,实现计算圆的面积和周长的功能
3.新建一个Square(正方形类)继承Shape类,重写他的Area方法和perimeter方法,实现计算圆的面积和周长的功能。
4.新建测试类TestShape,测试正方形和圆的功能。
//Shaper.java
public class Shape {
public void area(double x){
System.out.println("area.....");
}
public void perimeter(double x){
System.out.println("perimeter.....");
}
}
//Circle.java
public class Circle extends Shape{
@Override
public void area(double x) {
System.out.println("圆的面积为:"+3.14*x*x);
}
@Override
public void perimeter(double x) {
System.out.println("圆的周长为:"+2*3.14*x);
}
}
//Square.java
public class Square extends Shape{
@Override
public void area(double x) {
System.out.println("正方形的面积为:"+x*x);
}
@Override
public void perimeter(double x) {
System.out.println("正方形的周长为:"+4*x);
}
}
//TestShape
public class TestShape {
public static void main(String[] args) {
Shape circle = new Circle();
circle.area(2);
circle.perimeter(2);
Shape square = new Square();
square.area(2);
square.perimeter(2);
}
}