java 面向对象编程——继承

目录

第五章、继承

一、继承

1.继承的格式

2.继承中的构造方法

3.父类的引用指向子类对象

4.总结

二、重写

1.方法的重写

2.重写时的super

3.重写与重载的区别

4.练习


第五章、继承

一、继承

  • 通过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.重写与重载的区别

  • 重载

  1. 发生在编译期
  2. 方法名相同,但参数列表不同
  3. 调用时根据方法名和参数列表去判断
  • 重写

  1. 发生在运行期
  2. 前提是: 存在继承关系时,子类重写的方法与父类完全一致
  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);
    }

}

你可能感兴趣的:(java基础语法,java)