由于常常将Java和C++面向对象编程的原则搞乱,所以这次把相关要点分别总结一下,本文主要总结Java面向对象编程。

面向对象编程的三大特性是:继承性(inheritance), 多态性(polymorphism)和封装性(encapsulation)。

一. 继承性

[类修饰词列表] class 类名 [extends 父类名] [implements 借口列表名] { 类体 }

class Employee {
public int workYear;
public Employee() { workYear = 1; }
} class Teacher extends Employee {
public int classHour;
public Teacher() { classHour = 10; }
}
  1. 每一个类有且仅有一个直接父类,但能够实现多个接口
  2. 当前定义的类的构造方法必须在其第一句调用其直接父类的构造方法。格式为:

    super(參数列表);

    假设程序猿没有进行显式调用,则JVM会自己主动隐式调用不带不论什么參数的父类构造方法,即:super()
  3. 子类和父类之间能够进行类型转换

    (1) 将子类型数据转换为父类型数据能够直接採用隐式类型转换

    (2) 将父类型数据转换为子类型数据须要採用强制类型转换,且要保证执行时的正确性。

    // correct
    Teacher tom = new Teacher();
    Employee a = tom;
    Teacher b = (Teacher) a; // runtime error
    Employee a = new Employee();
    Teacher b = (Teacher) a;
  4. 能够用instanceof 来推断一个对象是不是某个类的实例对象。
    Teacher a = new Teacher();
    Employee b = new Employee();
    Employee c = a; System.out.println((b instanceof Teacher)); // false
    System.out.println((c instanceof Employee)); // true
    System.out.println((c instanceof Teacher)); // true

二. 多态性

静态多态性

静态多态性是指在同一个类中同名方法在功能上的重载(overload)。

动态多态性

动态多态性是指子类的成员方法对其父类同样声明的成员方法的覆盖(override)。这里的“同样声明”指的是除了方法修饰词外全然同样。利用动态多态性能够通过父类型的引用调用子类型的方法。

class Employee {
public int workYear;
public Employee() { workYear = 1; }
public printInfo() {
System.out.println("This employee has worked for " + workYear + " years.");
}
} class Teacher extends Employee {
public int classHour;
public Teacher() { classHour = 10; }
public printInfo() {
System.out.println("This employee has worked for " + workYear + " years.");
System.out.println("This teacher has worked for " + classHour + " hours.");
}
} public class Main {
public static void main(String[] args) {
Employee a = new Teacher();
a.printInfo();
}
}
  1. 在子类中定义与父类中同名的成员域不仅与多态性没有关系。并且不提倡
  2. 能够用superkeyword调用父类中被屏蔽的成员方法和成员域,即:super.xxx
  3. 动态多态性仅仅针对非静态的成员方法,即静态成员方法不具有动态多态性:当在子类和父类的类体中定义了具有全然同样声明的静态成员方法。且类型为父类的变量a指向子类的实例对象时,通过变量a调用该静态成员方法将调用在父类类体中定义的静态成员方法。

三. 封装性

这里主要须要搞清楚类成员的訪问控制模式及相应的訪问范围,例如以下表:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZmVpeGlhNTg2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

* 上述图片来自《Java程序设计教程》 第2版。雍俊海编著

至此,Java中面向对象的三大特性讨论完成,下一篇博客将会讨论抽象类、接口和内部类等内容。

Java面向对象编程(一)的更多相关文章

  1. Java面向对象编程基础

    一.Java面向对象编程基础 1.什么是对象?Object 什么都是对象! 只要是客观存在的具体事物,都是对象(汽车.小强.事件.任务.按钮.字体) 2.为什么需要面向对象? 面向对象能够像分析现实生 ...

  2. java 面向对象编程。。。。

    经过一周的学习(java),总结了许多,对java的理解,java的类型,运用,安装,基础语法,变量,常量,表达式,语句 java从C语言中继承了大量语言特性.java面向对象编程的基本特征,包括继承 ...

  3. 《Java面向对象编程》

    <Java面向对象编程> 第11章 对象的生命周期 11.1  创建对象的方式 用new语句创建对象 运用反射手段,调用java.lang.Class 或者 java.lang.Const ...

  4. JAVA面向对象编程课程设计——网络版单机斗地主

    一.团队介绍 成员姓名 任务分配 成员课程设计博客链接 兰泽祥(组长) 数据库,斗地主规则的实现,人机自动出牌的算法,实体类的设计 JAVA面向对象编程课程设计--web版斗地主 吴修恩 JSP界面的 ...

  5. JAVA面向对象编程课程设计——web版斗地主

    一.团队课程设计博客链接 JAVA面向对象编程课程设计--网络版单机斗地主 二.个人负责模块或任务说明 实体类的设计 斗地主规则的实现 人机自动出牌的算法 实现数据库的DAO模式 三.自己的代码提交记 ...

  6. java面向对象编程知识点总结

    一:今天完成 上午详细了解了java面向对象编程的一些细节,记录如下. 1)类 是一种引用类型,包含一个签名和一个主体,主体是放在花括号里面的成员,成员包括字段和方法,还有构造方法.初始化程序和嵌套类 ...

  7. JAVA学习(五):Java面向对象编程基础

    Java面向对象编程基础 面向对象(Object oriented programming,OOP)技术是一种强有力的软件开发方法,它採用数据抽象与信息隐藏技术,来使软件开发简单化,以达到代码重用的目 ...

  8. (一)如何理解java面向对象编程

    哲学中,事物总是螺旋式上升,波浪式前进.因而编程也逐渐向人类更容易理解的方向前进,多年来人们苦苦追求的编程境界 : 高扩展性(extensibility),高复用性(reuseable).java语言 ...

  9. java面向对象编程--第九章 多态和抽象

    9.1多态 在生物学中,是指一个生物或物种可以有多种不同的形式或阶段: 在OOP中,多态是指一个对象有多种形式的能力. 多态可以说是面向对象编程的精髓所在.java中之所以引入多态的概念,原因之一是它 ...

随机推荐

  1. 《Linux命令行与shell脚本编程大全 第3版》

    第一部分 Linux 命令行 第1章  初识Linux she1.1   什么是Linux 21.1.1 深入探究Linux 内核 31.1.2 GNU 工具 61.1.3 Linux 桌面环境 81 ...

  2. 21深入理解C指针之---通过指针传递数据

    一.在C程序设计中,主要活动就是操纵数据 1.数据传递:将数据作为参数传入参数和将数据作为数据返回两种 2.函数: 1).函数类型:主要是指函数返回数据的类型,可以是基本类型或复杂数据类型,即使函数无 ...

  3. phpcms V9 安装黄页模块后,注册为普通会员并登录,点立即免费入驻企业库出现白板

    解决步骤: 1. 将php.ini修改: display_errors = On 2. 再次尝试,显示出错误: Fatal error: require(): Failed opening requi ...

  4. Yii关联查询(转载)

    原文链接:http://keshion.iteye.com/blog/1607994 一.多表关联的配置 在我们使用 AR 执行关联查询之前,我们需要让 AR 知道一个 AR 类是怎样关联到另一个的. ...

  5. UVA - 10050 Hartals

    #include <cstdio> #include <cstring> ]; ]; int main() { int t; scanf("%d", &am ...

  6. hdu 1254(搜索题)

    推箱子 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  7. LeetCode OJ--Longest Consecutive Sequence ***

    http://oj.leetcode.com/problems/longest-consecutive-sequence/ 起初想的是排序,查了下O(n)的排序算法有计数排序.基数排序.桶排序.后来考 ...

  8. LeetCode OJ——Remove Duplicates from Sorted List

    http://oj.leetcode.com/problems/remove-duplicates-from-sorted-list/ 链表的去重,要考虑链表的本质. #include <ios ...

  9. Codeforces 895C Square Subsets(状压DP 或 异或线性基)

    题目链接  Square Subsets 这是白书原题啊 先考虑状压DP的做法 $2$到$70$总共$19$个质数,所以考虑状态压缩. 因为数据范围是$70$,那么我们统计出$2$到$70$的每个数的 ...

  10. Codeforces 696E ...Wait for it...(树链剖分)

    题目链接  ...Wait for it... 考虑树链剖分. 对于树上的每个点开一个set,记录当前该节点上所有的girls. 每个节点初始的权值为set中的最小值. 询问的时候每次在路径上寻找最小 ...