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关键字的抽象类.继承普通类时可以覆写父类的方法,或者创建自己独有的方法,或者这两 ...
随机推荐
- uva 10827
与108类似 多加了两层循环 水过 #include <iostream> #include <cstring> #include <cstdio> #includ ...
- CF339
C. Xenia and Weights 有1...10k的砝码,在天枰上,左右轮流放置砝码,要求之后左右轮流比另一侧重量要大,要求相邻两次砝码不能相同. 解题报告给出(i,j,k)表示balance ...
- Android-xUtils框架介绍(三)
继续介绍xUtils的最后两个模块:DbUtils和HttpUtils.首先先介绍第一个SQLite数据库操纵的简单ORM框架,只要能理解xUtils为我们提供的api,相信你也能熟练的把DbUtil ...
- Python各种模块下载及安装配置
方式1 在Python官网https://www.python.org/或者是github搜索进行下载 ,解压缩之后通过命令提示符进入已经解压缩文件夹根目录,输入下面的命令: python setup ...
- POJ3691DNA repair
题解: 构建出trie图,令f[i][j]表示到第i个字符走到j号节点最少需要修改的字符数,然后枚举后继节点转移即可. 代码:没写caseWA了n发... #include<cstdio> ...
- [转] Splay Tree(伸展树)
好久没写过了,比赛的时候就调了一个小时,差点悲剧,重新复习一下,觉得这个写的很不错.转自:here Splay Tree(伸展树) 二叉查找树(Binary Search Tree)能够支持多种动态集 ...
- [CF 471C] MUH and House of Cards
C. MUH and House of Cards Polar bears Menshykov and Uslada from the zoo of St. Petersburg and elep ...
- LeetCode Implement Trie (Prefix Tree) (实现trie树3个函数:插入,查找,前缀)
题意:实现trie树的3个功能,只含小写字母的串. 思路:老实做即可! class TrieNode { public: TrieNode* chd[]; bool flag; // Initiali ...
- 【转】Windows环境下Android NDK环境搭建
原文网址:http://www.metsky.com/archives/525.html 前面介绍Windows下Android 开发环境配置,主要是面向JAVA开发环境,对只做APK上层应用开发人员 ...
- (四)学习CSS之position、bottom、left、right和top属性
参考:http://www.w3school.com.cn/cssref/pr_class_position.asp position 属性规定元素的定位类型. 这个属性定义建立元素布局所用的定位机制 ...