该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架。
概述:
Java是面向对象的程序设计语言,Java语言提供了定义类、成员变量、方法等最基本的功能。类可被认为是一种自定义的数据类型,可以使用类来定义变量,所有使用类定义的变量都是引用变量,它们将会引用到类的对象。类用于描述客观世界里某一类对象的共同特征,而对象则是类的具体存在,Java程序使用类的构造器来创建该类的对象。
对象和类:
Java是面向对象的程序设计语言,类是面向对象的重要内容,可以把类当成一种自定义类型,可以使用类来定义变量,这种类型的变量统称为引用变量。也就是说,所有类是引用类型。对象是由类创建出来的,可以说类时对象的抽象,对象是类的实例。
对象的概念:
Java 是面向对象的编程语言,对象就是面向对象程序设计的核心。所谓对象就是真实世界中的实体,对象与实体是一一对应的,也就是说现实世界中每一个实体都是一个对象,它是一种具体的概念。对象有以下特点:
- 对象具有属性和行为。
- 对象具有变化的状态。
- 对象具有唯一性。
- 对象都是某个类别的实例。
- 一切皆为对象,真实世界中的所有事物都可以视为对象。
面向对象与面向过程:
1、面向过程:
面向过程是一种以事件为中心的编程思想,编程的时候把解决问题的步骤分析出来,然后用函数把这些步骤实现,在一步一步的具体步骤中再按顺序调用函数。
我们以五子棋为例来解释一下面向过程是如何解决问题的:
下过五子棋的同学都知道,首先要找两个人,然后把棋谱摆放好,其中一方手持黑棋,另一方手持白旗,一般约定白棋先动,然后黑棋在动,这样每人一步,直到某一方先凑成五子一条线便为赢。这是我们平常下五子棋的过程,那么用面向过程该如何表示呢?
我们可以将下五子棋的过程抽象成如下步骤:
(1)开始游戏(2)黑子先走(3)绘制画面(4)判断输赢(5)轮到白子(6)绘制画面(7)判断输赢(8)返回步骤(2) (9)输出最后结果。
接着我们用面向过程来实现五子棋这一程序:
下五子棋{ 开始游戏(); 黑子先走(); 绘制画面(); 判断输赢(); 轮到白子(); 绘制画面(); 判断输赢(); 返回到 黑子先走(); 输出最后结果; }
可见,面向过程始终关注的是怎么一步一步地判断棋局输赢的,通过控制代码,从而实现函数的顺序执行。
2、面向对象:
一种基于面向过程的新编程思想,顾名思义就是该思想是站在对象的角度思考问题,我们把多个功能合理放到不同对象里,强调的是具备某些功能的对象。
具备某种功能的实体,称为对象。面向对象最小的程序单元是:类。面向对象更加符合常规的思维方式,稳定性好,可重用性强,易于开发大型软件产品,有良好的可维护性。
Java编程思想一书中有一段对面向对象的总结非常清晰到位,可谓是面向对象的精华所在:
3、两者优缺点比较:
(1)、面向过程:
优点:
流程化使得编程任务明确,在开发之前基本考虑了实现方式和最终结果,具体步骤清楚,便于节点分析。
效率高,面向过程强调代码的短小精悍,善于结合数据结构来开发高效率的程序。
缺点:
需要深入的思考,耗费精力,代码重用性低,扩展能力差,后期维护难度比较大。
(2)、面向对象:
优点:
结构清晰,程序是模块化和结构化,更加符合人类的思维方式;
易扩展,代码重用率高,可继承,可覆盖,可以设计出低耦合的系统;
易维护,系统低耦合的特点有利于减少程序的后期维护工作量。
缺点:
开销大,当要修改对象内部时,对象的属性不允许外部直接存取,所以要增加许多没有其他意义、只负责读或写的行为。这会为编程工作增加负担,增加运行开销,并且使程序显得臃肿。
性能低,由于面向更高的逻辑抽象层,使得面向对象在实现的时候,不得不做出性能上面的牺牲,计算时间和空间存储大小都开销很大。
面向对象的三大特性:
概述:
1、继承:
继承是面向对象的三大特征之一,也是实现软件复用的重要手段。Java的继承具有单继承的特点,每个子类只有一个直接父类。
2、封装:
封装(Encapsulation)是面向对象的三大特征之一,它指的是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。
封装是面向对象编程语言对客观世界的模拟,在客观世界里,对象的状态信息都被隐藏在对象内部,外界无法直接操作和修改。比如说一个人的年龄,年龄只会随着时间的流逝而逐渐增长,不能随意修改人的年龄。对一个类或对象实现良好的封装,可以实现以下目的。
3、多态:
Java引用变量有两个类型:一个是编译时类型,一个是运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致,就可能出现所谓的多态(Polymorphism)。
多态的作用是消除类型之间的耦合关系。
详解:
一、继承:
1、继承的概念:
程序来源于生活,也为生活所用。我们先从生活中的例子来看一下什么是继承:
现在有一个农场主,家有良田万顷,每年收入很多,他有一个儿子,就是我们口中的富二代。有一天农场主不幸去世了,那么他手下的农田和财产都是谁的了,毫无疑问,当然是他儿子的了(如果你好好努力,将来你儿子有很大机会是富二代哦)。那么他儿子本来一无所有,现在顷刻间多了需要Money,农田,房子等等,也就是拥有了他父亲的所有物资财富,这个我们就称之为继承。
Java的继承通过extends关键字来实现,实现继承的类被称为子类,被继承的类被称为父类,有的也称其为基类、超类。父类和子类的关系,是一种一般和特殊的关系。例如水果和苹果的关系,苹果继承了水果,苹果是水果的子类,则苹果是一种特殊的水果。
class Fruit{ public double weight; public void info() { System.out.println("我是一个水果,重"+weight+"g"); } } public class Apple extends Fruit{ public static void main(String[] args) { //创建Apple对象 Apple apple=new Apple(); //Apple对象本身并没有weight成员变量 //但是Apple的父类用于weight变量,所以Apple也可以方位 apple.weight=88; apple.info(); } }
结果:我是一个水果,重88.0g
2、重写父类的方法:
子类扩展了父类,子类是一个特殊的父类。大部分时候,子类总是以父类为基础,额外增加新的成员变量和方法。但有一种情况例外:子类需要重写父类的方法。例如鸟类都包含了飞翔方法,其中鸵鸟是一种特殊的鸟类,因此鸵鸟应该是鸟的子类,因此它也将从鸟类获得飞翔方法,但这个飞翔方法明显不适合鸵鸟,为此,鸵鸟需要重写鸟类的方法。
//父类 class Bird{ public void fly() { System.out.println("我在天空自由的飞翔"); } } public class Ostrich extends Bird { //重写Bird的fly方法 public void fly() { System.out.println("我只能在地上奔跑"); } public static void main(String[] args) { //创建Ostrich对象 Ostrich ostrich=new Ostrich(); ostrich.fly(); } } 结果:我只能在地上奔跑