Java继承和多态实例
我们知道面向对象的三大特性是封装、继承和多态。然而我们有时候总是搞不清楚这些概念。下面对这些概念进行整理,
为以后面向抽象的编程打下坚实的基础。
封装的概念还是很容易理解的。如果你会定义类,那么相信你对封装的概念已经完全掌握了。下面定义的几个类,就是对数据的封装。
继承的好处是代码复用。继承的子类自动拥有父类中的所有属性和方法。所以继承已存在的类就是复用这些类的方法和域。
在此基础上,子类还可以添加一些新的方法和域,以满足新的需求。这是Java程序设计中的一项核心技术。
那么如何判断是否需要继承呢?"is-a"关系是继承的一个明显特征。这句话的意思可以解释为:Student之所以继承Person,
是因为Student 是Person。如果没有这个关系也就不需要这个继承了。这也是里氏替换原则的定义,子类型必须能够替换掉它们的父类型。
在通过扩展超类定义子类的时候,仅需指出子类与超类的不同之处。因此在设计类时,应该将通用的方法放到超类中,
而将具有特殊用途的方法放到子类中,这种将通用的功能放到超类的做法,在面向对象程序设计中十分普遍。
动态绑定有一个非常重要的特性:无需对现存的代码进行修改,就可以对程序进行扩展。所以多态是开放封闭原则的基础。
下面是一个继承和多态实现的具体例子:
abstract 是抽象的关键字。(最好从抽象类继承而不是从具体类继承)。
public abstract class Person { // 抽象类
private String name; // 私有变量 public String getName() { // Getter方法
return name;
}
public void setName(String name) { //Setter方法
this.name = name;
} public Person(String name) { // 构造函数,用于初始化name
super();
this.name = name;
}
public abstract String getDesc(); // 抽象类中的抽象方法。 只有声明,没有具体实现。
public String toString(){ // toString方法覆盖了Object类的toString方法
return name + getDesc();
}
}
extends 是继承的关键字。Student继承Person,所以Student拥有name属性。
public class Student extends Person { // 继承类
private String major; // 新增加的数据 public String getMajor() {
return major;
} public void setMajor(String major) {
this.major = major;
} public Student(String name,String major) { // 构造函数用于初始化
super(name); // 调用超类构造函数
this.major = major;
} @Override
public String getDesc() { // 必须实现超类中的抽象方法
// TODO Auto-generated method stub
return " : a student, major is " + major;
}
凡是继承超类的子类,必须实现(无论是哪种实现方式)超类中定义的抽象方法。
public class Employee extends Person{ private double salary; public double getSalary() {
return salary;
} public void setSalary(double salary) {
this.salary = salary;
} public Employee(String name, double salary) {
super(name);
this.salary = salary;
} @Override
public String getDesc() {
// TODO Auto-generated method stub
return " :a employee, salary is " + salary;
} }
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Person[] p=new Person[2];
p[0]=new Student("Mark", "IT");
p[1]=new Employee("Jerry", 2000);
for (Person person : p) {
System.out.println(person.getName()+person.getDesc());
}
} }
结果:
从这个例子也可以看出,没有封装就谈不上继承,而没有继承,就不可能有所谓的多态。
而理解封装、继承和多态(特别是多态)是理解设计模式的基础。
Java继承和多态实例的更多相关文章
- Java 继承和多态
Java 继承和多态 Java 继承 继承的概念 继承是java面向对象编程技术的一块基石,因 ...
- Java继承与多态
感慨一下,到了现在感觉Java里面很多东西都是模模糊糊,不能这样了,一点点解决吧.今天看了继承与多态的一些内容,感觉看得很浅,先写下来,算是巩固,如果后面看到更好的内容,再慢慢加上去. 继承与多态,他 ...
- Java 继承、多态与类的复用
摘要: 本文结合Java的类的复用对面向对象两大特征继承和多态进行了全面的介绍. 首先,我们介绍了继承的实质和意义,并探讨了继承,组合和代理在类的复用方面的异同.紧接着,我们依据继承引入了多态.介绍了 ...
- java继承和多态
父类和子类 如果类C1扩展自另一个类C2,那么C1称为子类或派生类,C2称为父类或基类.派生类可以从它的基类中继承可访问的数据域和方法,还可添加新数据域和新方法 例如:实现一个几何图形基类; clas ...
- 四. Java继承和多态4. 多态和动态绑定
在Java中,父类的变量可以引用父类的实例,也可以引用子类的实例. 请读者先看一段代码: public class Demo { public static void main(String[] ar ...
- Java继承,多态,组合应用
继承: 面向对象的三大特征之一: 是类和类之间的一种拓展关系,是一种从一般到特殊的关系; 格式: sub extends Super, 我们把sub称为子类或者拓展类, 把supe ...
- java继承-重写-super实例补充
方法重写: 是指子类根据需要父类继承来的方法进行改写,是多态机制的前奏. 重写注意点: 1.重写方法必须和被重写方法具有相同的方法名,参数列表和返回值. 2.重写方法方法不能使用比被重写方法更严格的访 ...
- 四. Java继承和多态10. Java Object类
Object 类位于 java.lang 包中,是所有 Java 类的祖先,Java 中的每个类都由它扩展而来. 定义Java类时如果没有显示的指明父类,那么就默认继承了 Object 类.例如: p ...
- 四. Java继承和多态8.Java final关键字:阻止继承和多态
在 Java 中,声明类.变量和方法时,可使用关键字 final 来修饰.final 所修饰的数据具有“终态”的特征,表示“最终的”意思.具体规定如下: final 修饰的类不能被继承. final ...
随机推荐
- java.io.IOException: Timed out waiting 20000ms for a quorum of nodes to respond
16-11-14 21:23:41,540 FATAL org.apache.hadoop.hdfs.server.namenode.FSEditLog: Error: starting log se ...
- 【bzoj1912】 Apio2010—patrol 巡逻
http://www.lydsy.com/JudgeOnline/problem.php?id=1912 (题目链接) 题意 给出一棵树,要求在树上添加K(1 or 2)条边,添加的边必须经过一次,使 ...
- osquery An Operating System Instrumentation Framewor
catalog . Getting Started . install guide for OS X and Linux . Features Overview . Logging . query e ...
- 64位CentOS源码编译方式安装wine
说明:本文仅作本人笔记的之用,仅供参考.可能因不同环境而不同. 1. 从官网下载最新版的wine-1.6.2.tar.gz 2. 安装相关的包(这里是我安装的,可能由于不同系统已经安装的包不同而不一样 ...
- hdu 2007 - 平方和与立方和
题目大意: 给定一段连续的整数,求出他们中所有偶数的平方和以及所有奇数的立方和. 解答: 坑你没商量!要考虑输入数a,b的大小.如果a>b,需要交换a,b的值. 1: #include<s ...
- 【项目】用CIFilter得到图片没办法保存到沙盒里面,显示是CGImage为空
错误代码: if (iOS9) { CGImageRef cgImage = [[CIContext new] createCGImage:outputImage fromRect:outputIma ...
- (翻译)如何对python dict 类型按键(keys)或值(values)排序
如何对dict类型按键(keys)排序(Python 2.4 或更高版本): mydict = {'carl':40, 'alan':2, 'bob':1, 'danny':3} for key in ...
- jquery 中的 return false 不起作用
jquery 中的 return false 不起作用 $(".lcId").each(function(e) { if ($(this).attr("checked& ...
- phpcms后台获取当前登录账号的数据
$amdinid=$_SESSION['userid'];$infoadmin=$this->admin->get_one(array('userid'=>$amdinid)); v ...
- phpcms v9 数据库操作函数
表明默认当前load_model('xxxx')模块所在表名xxxx 若要指定表名 则:操作在mysql.class.php中$this->db->select(...) 1.查询 $ ...