java继承和多态
父类和子类
如果类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继承和多态的更多相关文章
- Java 继承和多态
Java 继承和多态 Java 继承 继承的概念 继承是java面向对象编程技术的一块基石,因 ...
- Java继承和多态实例
我们知道面向对象的三大特性是封装.继承和多态.然而我们有时候总是搞不清楚这些概念.下面对这些概念进行整理, 为以后面向抽象的编程打下坚实的基础. 封装的概念还是很容易理解的.如果你会定义类,那么相信你 ...
- Java继承与多态
感慨一下,到了现在感觉Java里面很多东西都是模模糊糊,不能这样了,一点点解决吧.今天看了继承与多态的一些内容,感觉看得很浅,先写下来,算是巩固,如果后面看到更好的内容,再慢慢加上去. 继承与多态,他 ...
- Java 继承、多态与类的复用
摘要: 本文结合Java的类的复用对面向对象两大特征继承和多态进行了全面的介绍. 首先,我们介绍了继承的实质和意义,并探讨了继承,组合和代理在类的复用方面的异同.紧接着,我们依据继承引入了多态.介绍了 ...
- Java继承,多态,组合应用
继承: 面向对象的三大特征之一: 是类和类之间的一种拓展关系,是一种从一般到特殊的关系; 格式: sub extends Super, 我们把sub称为子类或者拓展类, 把supe ...
- 四. Java继承和多态8.Java final关键字:阻止继承和多态
在 Java 中,声明类.变量和方法时,可使用关键字 final 来修饰.final 所修饰的数据具有“终态”的特征,表示“最终的”意思.具体规定如下: final 修饰的类不能被继承. final ...
- 四. Java继承和多态4. 多态和动态绑定
在Java中,父类的变量可以引用父类的实例,也可以引用子类的实例. 请读者先看一段代码: public class Demo { public static void main(String[] ar ...
- java继承和多态举例
public class Test1 { public static void main(String[] args) { System.out.println(new Dog().name);//狗 ...
- Java继承与多态浅析
一.继承 1.通过extends继承的父类可以是不加abstract关键字的普通类,也可以是加了abstract关键字的抽象类.继承普通类时可以覆写父类的方法,或者创建自己独有的方法,或者这两 ...
随机推荐
- easyui源码翻译1.32+API翻译全篇导航 (提供下载源码)
前言 EasyUI每个组件都会有 属性.方法.事件 属性 所有的属性都定义在jQuery.fn.{plugin}.defaults里面.例如,对话框属性定义在jQuery.fn.dialog.defa ...
- uEditor独立图片上传
项目中.上传图片,非常希望有一款比较兼容的查件. 网上找了一些,图片上传立刻显示的js代码,还有uploadify.都会碰到这样那样的不兼容和其它头疼的问题. 后来想,干脆就用php的上传类最干脆.但 ...
- Android:时间控件
1.选择时间TimePicker 监听器:OnTimeChangedListener(obj,int hour,int minute); 常用: 获取时:getCurrentHour(). 获取 ...
- Maven中的一点疑惑的地方
我们建立一个Maven项目,其结构如下:
- Android EditText控件行尾为表情时的BUG
今天处理项目上的一个诡异BUG,贴吧Android客户端发贴框是支持表情文字混排的,但是当发贴框的行内容末尾为表情时,尝试在表情后插入文字,就悲剧了:文字其实写进去了,但是不会显示出来.研究了一下,发 ...
- Java读写Windows共享文件夹 .
版权声明:本文为博主原创文章,未经博主允许不得转载. 项目常常需要有访问共享文件夹的需求,例如共享文件夹存储照片.文件等.那么如何使用Java读写Windows共享文件夹呢? Java可以使用JCIF ...
- 跨域使用jsonp 获取天气预报
<html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> ...
- cmd启动tomcat
1.安装jdk 2.安装tomcat 3.需要配置两个用户环境变量,仅仅配置系统变量没用. a)JAVA_HOME:D:\programing~tools\java~tools\JDK(tm)\jdk ...
- VMWare-NAT模式实现局域网其他主机对虚拟机访问
WIN 2012在桥接模式下可以实现主机及主机所在局域网内其他主机对虚拟机的访问,但是在NAT模式下主机可以对虚拟机访问,但是主机所在的局域网内其他主机却无法对虚拟机访问,必须进行主机转发,从而实现局 ...
- linux 用grep匹配横线
file的内容如下: ADSFADSFSDFASDFJKJK----------------------------------------ADSFADSFSDFASDFJKJK----------- ...