我们知道面向对象的三大特性是封装、继承和多态。然而我们有时候总是搞不清楚这些概念。下面对这些概念进行整理,

为以后面向抽象的编程打下坚实的基础。

  封装的概念还是很容易理解的。如果你会定义类,那么相信你对封装的概念已经完全掌握了。下面定义的几个类,就是对数据的封装。

  继承的好处是代码复用。继承的子类自动拥有父类中的所有属性和方法。所以继承已存在的类就是复用这些类的方法和域。

在此基础上,子类还可以添加一些新的方法和域,以满足新的需求。这是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继承和多态实例的更多相关文章

  1. Java 继承和多态

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

  2. Java继承与多态

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

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

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

  4. java继承和多态

    父类和子类 如果类C1扩展自另一个类C2,那么C1称为子类或派生类,C2称为父类或基类.派生类可以从它的基类中继承可访问的数据域和方法,还可添加新数据域和新方法 例如:实现一个几何图形基类; clas ...

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

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

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

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

  7. java继承-重写-super实例补充

    方法重写: 是指子类根据需要父类继承来的方法进行改写,是多态机制的前奏. 重写注意点: 1.重写方法必须和被重写方法具有相同的方法名,参数列表和返回值. 2.重写方法方法不能使用比被重写方法更严格的访 ...

  8. 四. Java继承和多态10. Java Object类

    Object 类位于 java.lang 包中,是所有 Java 类的祖先,Java 中的每个类都由它扩展而来. 定义Java类时如果没有显示的指明父类,那么就默认继承了 Object 类.例如: p ...

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

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

随机推荐

  1. 转发;Dota英文名

    http://esports.17173.com/content/2011-02-17/20110217163225753.shtml 有的英雄的名字真的很漂亮,也给那些学校里英文各种悲剧的同鞋增加点 ...

  2. 【BZOJ-2460&3105】元素&新Nim游戏 动态维护线性基 + 贪心

    3105: [cqoi2013]新Nim游戏 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 839  Solved: 490[Submit][Stat ...

  3. 【poj1085】 Triangle War

    http://poj.org/problem?id=1085 (题目链接) 题意 A,B两人玩游戏,在一个大三角形上放火柴,若A放上一根火柴后成功组成一个三角形,那么这个三角形就归属于A,并且A被奖励 ...

  4. clickheat简介

    装了个wappalyzer,各种感兴趣的去翻各种网站都用了什么框架啊啊啊...然后在qunar.com遇到了clickheat.之前只是听过这类插件,没想到真的在用唉. ClickHeat is a ...

  5. dbm速算

    经常用到,但是经常搞忘记.在这里记录一下换算的一些技巧. 为什么要用dB 在最前面,需要解释一下dB的由来,这样会让理解变得简单一点.事实上,dB(分贝)是一个纯计数单位.使用dB的目的呢,其实就是用 ...

  6. Hong Kong Regional Online Preliminary 2016 C. Classrooms

    Classrooms 传送门 The new semester is about to begin, and finding classrooms for orientation activities ...

  7. codevs 1013 求先序排列(二叉树遍历)

    传送门 Description 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度<=8). Input 两个字符串,分别是中序和后序(每行一个) Outp ...

  8. POJ 3617 Best Cow Line (贪心)

    Best Cow Line   Time Limit: 1000MS      Memory Limit: 65536K Total Submissions: 16104    Accepted: 4 ...

  9. java语言:Linux与JVM的内存关系分

    在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约 600m,Linux自身使用大约800m.从表面上,物理内存应该 ...

  10. jQuery知识点总结(第六天)

    今天工作繁忙,晚上又和所谓的'朋友',吃了自助烧烤. 但我内心是很抗拒的,不知为了什么,竟然稀奇古怪的答应了下来,竟要去吃饭.我向来不喜欢去凑热闹,特别是和志趣不投的人在一起吃,对方所说的话,自己根本 ...