父类和子类

如果类C1扩展自另一个类C2,那么C1称为子类或派生类,C2称为父类或基类。派生类可以从它的基类中继承可访问的数据域和方法,还可添加新数据域和新方法

例如:实现一个几何图形基类;

class GeometricObject1 {
private String color = "white";
private boolean filled;
private java.util.Date dateCreated;
public GeometricObject1() {
dateCreated = new java.util.Date();
}
public GeometricObject1(String color, boolean filled) {
dateCreated = new java.util.Date();
this.color = color;
this.filled = filled;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public boolean isFilled() {
return filled;
}
public void setFilled(boolean filled) {
this.filled = filled;
}
public java.util.Date getDateCreated() {
return dateCreated;
}
public String toString() {
return "created on " + dateCreated + "\ncolor: " + color + " and filled: " + filled;
}
}

一个派生类Circle:

class Circle extends GeometricObject1 {
private double radius; public Circle(double radius) {
this.radius = radius;
}
public Circle(double radius, String color, boolean filled) {
this.radius = radius;
setColor(color);
setFilled(filled);
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
public double getArea() {
return radius * radius * Math.PI;
}
public double getDiameter() {
return 2 * radius;
}
public double getPerimeter() {
return 2 * Math.PI * radius;
}
public void printCircle() {
System.out.println("The circle is creatd " + getDateCreated() +
" and the radius is " + radius);
}
}

一个派生类Rectangle :

class Rectangle extends GeometricObject1 {
private double width;
private double height;
public Rectangle() { }
public Rectangle(double width, double height) {
this.height = height;
this.width = width;
}
public Rectangle(double width, double height, String color, boolean filled) {
this.width = width;
this.height = height;
setColor(color);
setFilled(filled);
}
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public double getArea() {
return width * height;
}
public double getPerimeter() {
return 2 * (width + height);
}
}

创建Circle与Rectangle对象:

public class Main
{
public static void main(String args[])
{
Circle circle = new Circle(1);
System.out.println("A circle " + circle.toString());
System.out.println("The radius is " + circle.getRadius());
System.out.println("The area is " + circle.getArea());
System.out.println("The diameter is " + circle.getDiameter()); Rectangle rectangle = new Rectangle(2, 4);
System.out.println("\nA rectangle " + rectangle.toString());
System.out.println("The area is " + rectangle.getArea());
System.out.println("The perimeter is " + rectangle.getPerimeter()); }
}

注意:

1、派生类并不是基类的一个子集,事实上比父类包含更多的信息和方法

2、父类中的私有数据域在该类之外是不可访问的,如果父类中定义了公共的访问器/修改器,那么可以通过这些公共的访问器/修改器来访问和修改它们

3、不是所有的“是”关系(is-a)都该用继承来建模。例如:一个正方形和矩形。如果要用类B去扩展类A,那么A应该要比B包含更多的信息

4、java中不允许多重继承

使用super关键字

关键字super的用途:

1、调用父类的构造方法

2、调用父类的方法

调用父类的构造方法的语法:super(), or super(parameters)

语句super(), or super(parameters)必须出现在子类构造方法的第一行,这是显式调用父类构造方法的唯一方式

上面代码Circle类中的构造方法可以使用下面的代码替换:

public Circle(double radius, String color, boolean filled) {
super(color, filled);
this.radius = radius;
}

super不仅可以引用父类的构造方法,也可以引用父类的方法:

super.方法名(参数)

改写Circle类中的printCircle()方法:

public void printCircle() {
System.out.println("The circle is creatd " + super.getDateCreated() +
" and the radius is " + radius);
}

覆盖方法

子类从父类继承方法,有时候需要修改父类中定义的方法的实现,称为方法覆盖

GeometricObject类中的toString方法返回表示几何对象的字符串。这个方法可以被覆盖,返回表示圆的字符串,下面是新的方法:

public String toString() {
return super.toString() + "\nradius is " + radius;
}

覆盖与重载

重载方法意味着可以定义多个同名的方法,但是这些方法具有不同的签名;覆盖方法以为着为子类中的方法提供一个全新的实现,该方法已经在父类中定义。

覆盖的例子:

public class Main
{
public static void main(String args[])
{
A a = new A();
a.p(10);
a.p(10.0);
}
} class B {
public void p(double i) {
System.out.println(i * 2);
}
} class A extends B {
public void p(double i) { //覆盖
System.out.println(i);
}
}

运行结果:

10.0
10.0

重载的例子:

public class Main
{
public static void main(String args[])
{
A a = new A();
a.p(10);
a.p(10.0);
}
} class B {
public void p(double i) {
System.out.println(i * 2);
}
} class A extends B {
public void p(int i) { //重载
System.out.println(i);
}
}

运行结果:

10
20.0

多态

可以将子类的实例传给需要父类类型的参数

public class Main
{
public static void main(String args[])
{
displayObject(new Circle(1, "red", false));
displayObject(new Rectangle(1, 1, "black", true));
}
} public static void displayObject(GeometricObject object) {
System.out.println("Created on " + object.getDateCreated() +
".Color is " + object.getColor());
}

java继承和多态的更多相关文章

  1. Java 继承和多态

                                                        Java  继承和多态 Java 继承 继承的概念 继承是java面向对象编程技术的一块基石,因 ...

  2. Java继承和多态实例

    我们知道面向对象的三大特性是封装.继承和多态.然而我们有时候总是搞不清楚这些概念.下面对这些概念进行整理, 为以后面向抽象的编程打下坚实的基础. 封装的概念还是很容易理解的.如果你会定义类,那么相信你 ...

  3. Java继承与多态

    感慨一下,到了现在感觉Java里面很多东西都是模模糊糊,不能这样了,一点点解决吧.今天看了继承与多态的一些内容,感觉看得很浅,先写下来,算是巩固,如果后面看到更好的内容,再慢慢加上去. 继承与多态,他 ...

  4. Java 继承、多态与类的复用

    摘要: 本文结合Java的类的复用对面向对象两大特征继承和多态进行了全面的介绍. 首先,我们介绍了继承的实质和意义,并探讨了继承,组合和代理在类的复用方面的异同.紧接着,我们依据继承引入了多态.介绍了 ...

  5. Java继承,多态,组合应用

    继承:  面向对象的三大特征之一:    是类和类之间的一种拓展关系,是一种从一般到特殊的关系;    格式: sub   extends Super,  我们把sub称为子类或者拓展类, 把supe ...

  6. 四. Java继承和多态8.Java final关键字:阻止继承和多态

    在 Java 中,声明类.变量和方法时,可使用关键字 final 来修饰.final 所修饰的数据具有“终态”的特征,表示“最终的”意思.具体规定如下: final 修饰的类不能被继承. final ...

  7. 四. Java继承和多态4. 多态和动态绑定

    在Java中,父类的变量可以引用父类的实例,也可以引用子类的实例. 请读者先看一段代码: public class Demo { public static void main(String[] ar ...

  8. java继承和多态举例

    public class Test1 { public static void main(String[] args) { System.out.println(new Dog().name);//狗 ...

  9. Java继承与多态浅析

    一.继承 1.通过extends继承的父类可以是不加abstract关键字的普通类,也可以是加了abstract关键字的抽象类.继承普通类时可以覆写父类的方法,或者创建自己独有的方法,或者这两     ...

随机推荐

  1. Android 环境搭建 版本问题

    jdk1.6 1.7  eclipse 3.7.2    SDK-r12 ADT 12 SDK和ADT必须配套 搭建环境需要四个软件: 1.JDK(这是最新版本jdk1.7官方下载地址:http:// ...

  2. docker 通过commit方法创建镜像(Tomcat+Java+Scala)

    前一阵试了试写Dockerfile创建docker image,但有时全靠Dockerfile写实在有些难度,退而求其次试一试使用commit来创建镜像: 想了想干脆创建一个Java+Scala+To ...

  3. Chp3: Stacks and Queue

    1. 说明如何用两个队列来实现一个栈,并分析有关栈操作的运行时间. 解法:1.有两个队列q1和q2,先往q1内插入a,b,c,这做的都是栈的push操作.2.现在要做pop操作,即要得到c,这时可以将 ...

  4. Android中如何取消调转界面后EditText默认获取聚焦问题

    最近在做一个项目,当我点击跳转至一个带有EditText的界面后,模拟器中的软键盘会自动弹出,严重影响了用户体验.在网上找了资料,现总结如下. 我们知道,EditText有一个 android:foc ...

  5. SQLite入门与分析(四)---Page Cache之事务处理(2)

    写在前面:个人认为pager层是SQLite实现最为核心的模块,它具有四大功能:I/O,页面缓存,并发控制和日志恢复.而这些功能不仅是上层Btree的基础,而且对系统的性能和健壮性有关至关重要的影响. ...

  6. log file sync

    Recently, our application system has updated one app. I receive a email of complain the db server ch ...

  7. UNIX 网络编程第五章读书笔记

    刚看完 UNIX 第五章内容,我想按照自己的方式将自己获得的知识梳理一遍,以便日后查看!先贴上一段简单的 TCP 服务器端代码: #include <sys/socket.h> #incl ...

  8. shape的属性

    <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http: ...

  9. 【jQuery】

    TryjQuery:jQuery官方推出的教学视频http://blog.jobbole.com/37699/ jQuery 1.11 / 2.1 beta 版发布,全面支持异步模块加载  √http ...

  10. 分布式存储Memcache替代Session方案

    PHP自带的Session实际是在服务器中为每个客户建立独立的文件存放各自的信息. 在不做处理的情况下,很容易被客户端伪造.并且由于采用文件形式,所以存在着IO 读写的瓶颈.一般当用户在线达到1000 ...