面向对象第三篇

1.抽象类

1.1实例

描述:定义一个抽象类Shape,具有受保护类型的x和y属性,以及公有的抽象方法获得面积。
Rectangle类继承于Shape类,在构造方法中给父类属性x和y初始化,并重写父类中求面积的抽象方法。
Triangle类也继承于Shape类,在构造方法中给父类属性x和y初始化,并重写父类中求面积的抽象方法。
Cube类继承于Rectangle类,独有的属性是height,其构造方法需要调用父类的构造方法完成对x和y的初始化(立方体的底面长和宽),并对height初始化;独有的方法是求体积。
创建上转型对象,求矩形的面积和三角形面积。
创建对象,求立方体的体积。

代码:
Shape类

/**
 * 父类Shape,抽象类
 */
public abstract class Shape {
    //声明两个受保护类型的属性x、y
    protected  double x;
    protected  double y;

    //无参构造器
    public Shape() {
    }

    //全参构造器,只做声明, 具体属性初始化到子类中做
    public Shape(double x, double y) {
    }

    //声明了一个抽象方法,抽象方法不能带方法体
    public abstract double getArea();
}

Rectangle类

/**
 * 矩形子类,继承Shape类,Java是单一继承,只能有一个父类
 */
public class Rectangle extends Shape {
    public Rectangle() {
        super();
    }

    public Rectangle(double x, double y) {
        //在构造方法中给父类属性x和y初始化,通过super.x和super.y访问父类属性
       super.x = x;
       super.y = y;
    }

    //重写父类中的的抽象方法getArea(),求出具体形状的面积
    @Override
    public double getArea() {
        //this.x和 this.y是访问当前对象的x和y属性,此处用super.x*super.y也可以
        return this.x * this.y;
    }
}

Triangle类

/**
 * 三角形子类,继承Shape,实现方式同Rectangle
 */
public class Triangle extends Shape{

    public Triangle() {
        super();
    }

    public Triangle(double x, double y) {
        super.x = x;
        super.y = y;
    }


    @Override
    public double getArea() {
        return this.x * this.y * 0.5;
    }
}

Cube类

/**
 * 立方体子类,继承Rectangle类,为最终类,不再被继承
 */
public final class Cube extends Rectangle {
    //声明一个私有属性,为立方体的高
    private double height;

    public Cube() {
    }

    public Cube(double x, double y, double height) {
        //调用父类构造方法,完成对底面矩形的长、宽的初始化
        super(x, y);
        //通过this关键字,完成当前立方体对象的高的初始化
        this.height = height;
    }
    
    //本类独有的成员方法,求体积
    public double getVolumn(){
        //调用父类的求面积方法,求出底面矩形面积,使用this.height访问当前立方体的高,最终求出立方体的体积
        return  super.getArea() * this.height;
    }
}

主程序ShapeTest

/**
 * 主程序,用来测试各种子类及方法
 */
public class ShapeTest {
    public static void main(String[] args) {
        //通过上转型对象创建一个三角形的对象
        Shape shape = new Triangle(4.0, 3.0);
        System.out.println("三角形面积是:" + shape.getArea());

        //通过上转型对象创建一个矩形的对象
        Shape shape1 = new Rectangle(4.0, 3.0);
        System.out.println("矩形面积是:" + shape1.getArea());

        //通过最终类创建一个立方体对象
        Cube cube = new Cube(4.0, 3.0, 2.0);
        System.out.println("立方体体积是:" + cube.getVolumn());
    }
}

运行结果

运行结果

1.2 注意点

1.super关键字的三个作用

  • 访问父类属性
  • 调用父类构造方法
  • 调用父类成员方法

2. 抽象类的说明

  • 抽象类中可以有抽象方法和非抽象方法共存
  • 如果一个类中含有抽象方法,则该类一定是抽象类
  • 子类如果继承抽象类,必须强制重写父类中的抽象方法!

3.final关键字的说明

  • final修饰的变量就是常量
  • final修饰的类不能被继承
  • final修饰的方法不能被子类重写

2.接口

和抽象类相似,但是更严格
接口中只能有抽象方法
接口中不能声明属性
一个类可以实现多个接口

实例:Fly接口、FlyObject抽象类、Plane类、Bird类、FlyTest类
2.1 新建Fly接口,做法是新建一个class的时候,选择一下Kind类型为interface,如图:


新建接口

Fly接口代码:

/**
 * 飞行接口
 * 接口中所有的方法都是公有的,抽象的
 * 接口中不能定义属性
 */
public interface Fly {
    /**
     * 省略了public和abstract修饰符的fly方法,返回飞行信息字符串
     * @return String
     */
    String fly();
}

2.2 新建FlyObject抽象类,实现Fly接口

/**
 * 飞行物抽象类,实现了Fly接口
 *  抽象类中可以有属性变量
 */
public abstract class FlyObject implements Fly {
    //飞行物名称
    protected String name;
    //飞行时速
    protected double speed;

    //构造方法,给飞行物的两个属性初始化
    public FlyObject(String name, double speed) {
        this.name = name;
        this.speed = speed;
    }
}

2.3 新建Plane类,继承FlyObject抽象类,重写fly()方法

/**
 * 飞机类,继承FlyObject抽象类
 */
public class Plane extends FlyObject {

    public Plane(String name, double speed) {
        //通过super调用父类构造方法
        super(name, speed);
    }

    @Override
    public String fly() {
        //重写fly抽象方法,返回飞机的飞行信息
        return "飞机型号:" + this.name + ",飞行时速:" + this.speed + "km/h";
    }
}

2.4 新建Bird类,继承FlyObject抽象类,重写fly()方法

/**
 * 飞禽类,继承FlyObject抽象类
 */
public class Bird extends FlyObject {

    public Bird(String name, double speed) {
        //通过super调用父类构造方法
        super(name, speed);
    }

    @Override
    public String fly() {
        //重写fly抽象方法,返回飞禽的飞行信息
        return "飞禽名称:" + this.name + ",飞行时速:" + this.speed + "km/h";
    }
}

2.5 新建FlyTest测试主类,通过接口回调,创建具体实例并输出飞行结果

public class FlyTest {
    public static void main(String[] args) {
        //通过接口回调,创建一个Plane的实例给接口变量
        Fly fly1 = new Plane("波音747", 940.0);
        //调用fly()方法,输出飞机的飞行信息
        System.out.println(fly1.fly());

        //通过接口回调,创建一个Bird的实例给接口变量
        Fly fly2 = new Bird("老鹰", 80.8);
        //调用fly()方法,输出飞禽的飞行信息
        System.out.println(fly2.fly());
    }
}

2.6 运行结果


运行结果
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • 扩展 Kotlin 的扩展是一个很独特的功能, Java本身并不支持扩展, Kotlin 为了让扩展能在JVM平台...
    凌寒天下独自舞阅读 714评论 0 0
  • 1 面向对象No6 面向对象 OO Object Oriented 编程时以对象为单元,封装数据和逻辑,以此提...
    征程_Journey阅读 1,116评论 0 2
  • 2014年的苹果全球开发者大会(WWDC),当Craig Federighi向全世界宣布“We have new ...
    yeshenlong520阅读 2,244评论 0 9
  • 等待是一份静心的守望, 像沙滩守望海浪, 海浪留下吻痕而去。 像枯枝守望春风, 春风播出新绿而去。 就这样亘古不变...
    鞠一壶望月的秋水阅读 378评论 6 6
  • 2017年10月8日 感恩我的天使指导灵高级智慧,我又有了全新的一天! 1,感恩我早上起来睁开眼,看到大千世界。感...
    感恩一切的创造阅读 200评论 0 2