关闭

java中的继承

标签: java se
134人阅读 评论(0) 收藏 举报
分类:

1. 写在前面

对于程序而言,客观的事物可以分为两大类:变的和不变的;不变的,我们可以抽象为程序;而变动的,我们可以抽象为变量。当程序中有了变量之后,便可以去处理一些事情了。
继承,是将不变的,抽象为程序的,再一次的升华。

2. 继承的定义

在面向对象编程中,通过对一个已有的类进行扩展(新增)和改造(覆盖),从而构造出新的类,这样的编程方式称为继承。

3.继承的优点

  • 简化编程过程
  • 提高代码的复用率

4.继承的具体实现

在使用继承的时候,通常有两种方式来构建子类(导出类):覆盖和新增。
覆盖指的是子类(导出类)重写父类(基类)的方法,使之具有新的实现;新增指的是子类(导出类)新增新的方法。

5.代码示例

我现在构建几个图形对象:三角形,矩形,圆形,这些图形具有共同的属性(暂时不添加)和方法:draw( )–绘制,erase( )–擦除(我们可以把这共同的属性和方法抽象成父类shape);

  • 父类shape
package extendsAndPolymorphism;
/**
 * 父类对象--图形
 * @author lt
 * @date 2017年2月12日
 * @version V1.0
 */
public class Shape {

    /**
     * 绘制图形方法
     * @author lt
     * @Date 2017年2月12日
     */
    public void draw(){
        System.out.println("【图形】绘制...");
    };

    /**
     * 擦除图形方法
     * @author lt
     * @Date 2017年2月12日
     */
    public void erase(){
        System.out.println("【图形】擦除...");
    };
}
  • 子类-矩形
package extendsAndPolymorphism;
/**
 * 矩形
 * @author lt
 * @date 2017年2月12日
 * @version V1.0
 */
public class Rectangle extends Shape{

    @Override
    public void draw() {
        System.out.println("【矩形】绘制...");
    }

    @Override
    public void erase() {
        System.out.println("【矩形】擦除...");
    }

}
  • 三角形
package extendsAndPolymorphism;
/**
 * 三角形
 * @author lt
 * @date 2017年2月12日
 * @version V1.0
 */
public class Triangle extends Shape{

    @Override
    public void draw() {
        System.out.println("【三角形】绘制...");
    }

    @Override
    public void erase() {
        System.out.println("【三角形】擦除...");
    }

}
  • 圆形
package extendsAndPolymorphism;
/**
 * 圆形
 * @author lt
 * @date 2017年2月12日
 * @version V1.0
 */
public class Circle extends Shape{

    @Override
    public void draw() {
        System.out.println("【圆形】绘制...");
    }

    @Override
    public void erase() {
        System.out.println("【圆形】擦除...");
    }

}
  • 测试类
package extendsAndPolymorphism;
/**
 - 继承和多态
 - @author lt
 - @date 2017年2月12日
 - @version V1.0
 */
public class Test {

    public static void doSomething(Shape shape){
        shape.draw();
        shape.erase();
    }

    public static void main(String[] args) {
        Shape circle = new Circle();
        Shape square = new Square();
        Shape triangle = new Triangle();
        doSomething(circle);
        doSomething(square);
        doSomething(triangle);

    }
}
  • 输出结果
【圆形】绘制...
【圆形】擦除...
【正方形】绘制...
【正方形】擦除...
【三角形】绘制...
【三角形】擦除...

6.继承中常见问题

在继承的过程中,要注意一个问题,一旦继承了某个类,子类必将会调用父类的构造器,否则的话,就无法去调用父类中的一些方法。
如果子类没有调用父类构造器,那么就会报错。
在下面我举个例子:

  • 父类,没有无参构造器:
public class Father {

    public Father(String s){
        System.out.println("父类有参(一个)构造器:Father(String s)");
    }
    public Father(String s1, String s2){
        System.out.println("父类有参(两个)构造器:Father(String s1, String s2)");
    }
    public void print(){
        System.out.println("父类无参方法:print()");
    }
    public void print(String s){
        System.out.println("父类带参方法:print(String s)");
    }
}
  • 子类,创建无参构造器就会报错:
public class Child extends Father{

    public Child(){   //在此会报错

    }
    public Child(String s1, String s2) {
        super(s1, s2);
        // TODO Auto-generated constructor stub
    }
    public Child(String s1, String s2, String s3){
        super(s1, s2);
    }
    public void print(){
        System.out.println("子类无参方法:print()");
    }
    public static void main(String[] args) {
        Father c = new Child("1", "2");
        c.print();
    }
}
所报错为:Implicit super constructor Father() is undefined. Must explicitly invoke another constructor

意思是:隐式的父类构造器Father()没有定义,必须调用其它的构造器


未完成….

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2561次
    • 积分:194
    • 等级:
    • 排名:千里之外
    • 原创:14篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条