JAVA 基础 /第六课: 面向对象 / JAVA中的类和对象,面向对象java

JAVA 基础 /第六课: 面向对象 / JAVA中的类和对象,面向对象java

JAVA 基础 /第六课: 面向对象 / JAVA中的类和对象,面向对象java

2018-03-06

一、面向过程与面向对象

1.面向过程编程:
从解决问题的每一个步骤入手,适合于解决比较小的简单问题。 程序 =
算法+数据。

2.面向对象编程:按照现实世界的特点来管理复杂的事物,把它们抽象为一个对象,具有自己的状态和行为,通过消息的反应来完成一定的任务。

程序 = 对象+消息。

 

二、面向对象三大特性:

1.封装 :
将其信息属性和方法具体实现隐藏起来,只提供调用方法的接口,既封装。

2.继承:
将一个已有类中的属性和方法保留,可再加上自己特有的属性和方法形成一个新类,既继承。

3.多态:
指同名但有不同的具体实现的多个方法同时存在一个程序中。有两种是方法:重载和覆盖。

类(Class)是对一组具有相同属性、操作和关系的同类事物的描述,是抽象的、概念上的定义。

对象(Object)是实际存在的该类事物的每个个体,因而也称实例(instance)。

 

三、类的定义:

类主要定义类的属性(变量)、方法和关系。

类由类声明和类体构成;格式:

//类声明
public class Hero {
  //类体   
    String name; //姓名    
    float hp; //血量     
    float armor; //护甲    
    int moveSpeed; //移动速度
 public static void main(String[] args) {
        Hero garen =  new Hero();
        garen.name = "盖伦";
        garen.hp = 616.28f;
        garen.armor = 27.536f;
        garen.moveSpeed = 350;

        Hero teemo =  new Hero();
        teemo.name = "提莫";
        teemo.hp = 383f;
        teemo.armor = 14f;
        teemo.moveSpeed = 330;
    }  
}

 

类就像一个模板,根据这样一个模板,可以创建一个个的具体的英雄 
一个个具体的英雄,就叫一个个的对象 
new
Hero() 就是java中创建一个英雄对象的意思

 

四、对象的声明:

对象的实例化和初始化

Person p1 = new Person(“Tom”,0);

类的名字:Person

对象的名字: p1

new关键字实例化已经声明的对象,并在堆中分配内存空间;

美高梅59599 1

 

当一个对象被创建时,会对其中各种类型的成员变量自动进行初始化赋值。

除了基本数据类型之外的变量类型都是引用类型,如上面的Person及前面讲过的数组。

美高梅59599 2

 

http://www.bkjia.com/Javabc/1309073.htmlwww.bkjia.comtruehttp://www.bkjia.com/Javabc/1309073.htmlTechArticleJAVA 基础 /第六课: 面向对象 /
JAVA中的类和对象,面向对象java 2018-03-06 一、面向过程与面向对象
1.面向过程编程: 从解决问题的每一个步…

美高梅59599 3

文章最初发表于我的个人博客非典型性程序猿

对于刚接触JAVA或者其他面向对象编程语言的朋友们来说,可能一开始都很难理解面向对象的概念以及类和对象的关系。笔者曾经带过一个短期培训班教授java入门基础,在最后结束课程的时候,还有很多同学不太理解面向对象的思维以及类与对象的意义。这几天有空,就想着整理整理自己的思路,谈谈自己对面向对象以及类与对象的理解。

面向对象

首先,一言不和先百度,得到如下定义:

一切事物皆对象,通过面向对象的方式,将现实世界的事物抽象成对象,现实世界中的关系抽象成类、继承,帮助人们实现对现实世界的抽象与数字建模。

我们知道,编写程序的目的是为了解决现实生活中的问题,编程的思维方式也应该贴近现实生活的思维方式。面向对象的编程方式就是为了实现上述目的二出现的。它使得编程工作更直观,更易理解。需要注意的是这里说的编程不光是coding还包括了设计的过程也是面向对象的

为什么说面向对象更贴近实际生活

想象一下,当我们向别人描述一样事物时,我们都是怎么说的?”它有像鸭子一样的嘴巴”,”它有4条退”,”爪子里还有蹼”,”它是哺乳动物但却是卵生”。

这种HAS A 和 IS A的表达方式往往可以简单而高效的描述一样事物。HAS
A描述事物的属性或行为,IS A 则说明了事物的类属。

当我们把这一系列的属性组合起来便得到的鸭嘴兽这一类,同时哺乳动物一词简单精炼的表面了所有哺乳动物的特性而不用一一列出,这是继承特性的体现,同时卵生又是多态的体现。

这就是面向对象的思维特点,抽取(抽象)有用的属性和行为(抛弃哪些无需关系的)组织(封装)成一个类。这个过程中你也许会发现很多属性或方法是和另一个类相同的,那么你就可以采用继承的方式避免重复(当然这个过程也有可能是,当你设计完一个个类后,才发现他们有共同点,然后再抽取出基类)。更重要的是,继承是可以不原样照搬的,我们可以通过重载实现相同行为或属性的特有实现方式,这种特点称之为多态,例如同样的生产行为,实现方式由胎生变为卵生。请大声念出,并牢牢记住面向对象的四个特征:

  • 抽象
  • 封装
  • 继承
  • 多态

与早期结构化编程相比

早期结构化编程是面向过程的(功能),换句话说程序是由功能的集合组成,而调用者是作为功能的参数传入的。而在面向对象的程序中,对象是主体,程序是由对象的集合组成。一个对象中包含一系列符合设计的功能供其他对象调用。这么说可能还是比较抽象,

例如当我们设计一个五子棋游戏时,面向过程的设计思路就是首先分析问题的步骤:

1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。

把上面每个步骤用分别的函数来实现,问题就解决了。

而面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为:

1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。

第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。

(以上例子来自国内著名问答社区)

随便写点代码,大家看看就好,不要太认真….

/** 玩家类 **/ public class Player {     String name;       //棋手名称     boolean isFirst;  //是否先手     int color_flag;  //代表颜色  0-白 1-黑     Table table;//棋盘对象          public Player(String name,boolean isFirst;int color_flag){              this.name=name;              this.isFirst=isFirst;              this.color_flag=color_flag;       }         /**     下棋,x,y为落子坐标     **/     public void play(int x,int y) throws Exception{       if(this.table==null){          throw new IllegalArgumentException("玩家还未注册到棋盘!");       }       table.setNewPieces(x,y);     }          public void setTable(Table table){        this.table=table;     }  } /** 棋盘类 **/ public class Table{   List<Player> playerList=new ArrayList<Player>();   Referee referee ;   public Table(){    referee =new Referee(this);   }   /**     注册玩家   **/   public void registPlayer(Player player) throws Exception {       //检测棋盘中的玩家是否已满,先手玩家和玩家选色是否冲突。       .......      playerList.add(player);      player.setTable(this);   }     /**     落子    **/     public void setNewPieces(int x , int y){           //重新绘制棋盘           ......          //调用裁判对象,判断结果       if(referee.isEnd){           End();         }    }     public void End(){       .......   } } /** 裁判类 **/ public class Referee(){   Table table;   public Referee(Table table){     this.table=table;  }     public boolen isEnd(){       //判断输赢       ....     return false;     } }  

然而事实上,通过上述示例代码,我们不难发现,即使我们使用面向对象的方式,上面例子里面向过程中提到的几个下棋过程我们还是都实现了的,只不过程被封装到了类的方法中。所以说其实面向对象和面向过程并不是编程的区别(需要实现的业务逻辑的量不会产生变化),而是设计的区别!

美高梅59599,类与对象

类是抽象的,而对象是具体的

如何理解上面的话呢?
例如鸭嘴兽是类型,具体的鸭嘴兽A、鸭嘴兽B就是对象了。在JAVA中对象是通过new关键字声明的。
再例如,《红色警戒》中美国大兵是一类兵种,点击制造后从兵营里出来的那个会开枪的家伙就是对象了:

admin

网站地图xml地图