黑马程序员 05 Java基础教学 - 05 - 面向对象(1) 之 类、对象、封装

来源:互联网 发布:淘宝美工专业名词 编辑:程序博客网 时间:2024/04/29 20:01

               -------android培训、java培训、期待与您交流! ----------


本日志doc文档下载



一、理解面向对象

 基本概念

l 面向对象是相对面向过程而言

l 面向对象和面向过程都是一种思想

l 面向过程(强调的是功能行为);而面向对象(将功能封装进对象)

                    “执行者”         ---->                              “指挥者”             

l 面向对象是基于面向过程的

 举例说明

Ø 将大象装进冰箱(将开、关、储存封装到“冰箱”对象中)


Ø 去饭店点菜(找服务员对象点菜"交给厨师做菜)

Ø 软件公司招人(找一群具有代码编写能力的对象)

Ø 买电脑(找一个懂硬件会砍价的对象)

面试问题----  “谈一谈你对面向对象的理解?”

这是一个非常开放的题目,我们可以从两点入手:

1、这是一种思想,建立在面向过程的基础之上,它的目的就是让复杂的问题简单化,让我们的角色从执行者转变成指挥者

2、 最好结合生活的例子来说明:比如上文‚的例子

到底什么是对象呢?

在“Thinking in Java”中说过一句“一切皆对象”,这种话是要到了一定的境界层次说出来才会有人相信。在面试的时候显然我们这么说是不合适的。但是我们可以举例说明,比如说:我们身边就有很多物体可以看成是对象,桌子、笔记本、大楼、汽车等,他们具有一些属性和行为,他们是一个实实在在存在的个体。

二、类与对象的关系

类就是:对现实生活中事物的描述      

对象就是:这类事物实实在在存在的个体


描述对象:

现实生活中的对象:张三、王五

对象描述的方法:提取对象中共性内容。  " 这是一种对具体的抽象

描述:这是对象的共性有 姓名、年龄、性别、学习能力等。


映射到Java

描述:就是class定义的类

具体对象:就是对象Java在堆内存中用new建立的实体


看下面一段代码:

  //描述汽车(颜色,轮胎数)  public class Car {   //描述颜色  String color = "red";   //描述轮胎数  int num = 4;    void run(){  System.out.println(color+"..."+num);  }  }


描述事物其实就是描述事物的属性和行为

属性对应是类中的变量,行为对应类中的函数

其实定义类,就是在描述事物,就是在定义属性和行为。属性和行为共同成为类中的成员(成员变量和成员方法)

//生产汽车,在Java中通过new操作符来完成。//其实就是在堆内存产生一个实体Car c = new Car(); //c就是一个类类型变量


成员变量和局部变量的区别:

1、作用范围

a) 成员变量作用域整个类中

b) 局部变量作用于函数或者语句中

2、在内存中的位置

a) 成员变量在堆内存中,因为对象的存在才在内存中存在

b) 局部变量存在在栈内存中

三、匿名对象

匿名对象是对象的简化形式

匿名对象两种使用情况

当对对象方法仅进行一次调用的时候

匿名对象可以作为实际参数进行传递

先看下面一段代码

  public static void main(String[] args) {Car c = new Car(); show(c);}public static void show(Car c) {c.num = 3;c.color = "blue";c.run();  }


这段代码在内存中大致是下图所示


如果是这一段代码:

  public static void main(String[] args) {show(new Car());}public static void show(Car c) {c.num = 3;c.color = "blue";c.run();  }


这段代码在内存中大致是下图所示


上面两端代码分析了非匿名对象和匿名对象在栈内存和堆内存中的存储形式,他们在内存中的处理方式有出入。非匿名对象在show方法结束后仍然存在直至main函数运行结束,而匿名对象随着show方法的结束而消亡。

四、封装(Encapsulation

封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式(之所以这么做,就是因为在访问方式中可以加入逻辑判断语句,对访问的数据进行操作,提高代码健壮性)

好处:

˜ 将变化隔离

˜ 便于使用

˜ 提高重用性

˜ 提高安全性

封装原则:

˜ 把不需要对外提供的内容隐藏起来

˜ 把属性都隐藏,提供公共方法对其访问


注意:私有(private)仅仅是封装的一种表现形式

五、构造函数和构造代码块

5.1 构造函数

特点:

˜ 函数名与类名相同

˜ 不用定义返回值类型

˜ 不可以写return语句

作用:

˜ 给对象进行初始化

注意:

˜ 默认构造函数的特点(当一个类中没有定义构造函数时,那么系统默认给该类加入一个空参数的构造函数,当在类中自定义了构造函数后,默认的构造函数就没有了)

˜ 多个构造函数是以重载的形式存在的

构造函数和一般函数的区别:

˜ 在写法上不同

˜ 在运行上也不同:

1、构造函数是在对象一建立就运行,给对象初始化 ;一般函数的对象调用才执行,给对象添加其具备的功能

2、一个对象建立,构造函数只运行一次 ; 一般方法可以被该对象多次调用


5.2 构造代码块

作用:

给对象进行初始化。对象一建立就运行,而且优先于构造函数执行

构造代码块和构造函数的区别:

构造代码块是给所有对象进行统一初始化

构造函数是给对应的对象初始化

总结:构造代码块定义的是不同对象共性的初始化内容


对于构造代码块的应用,请看一下这段代码:

  public class SportCar {  // 描述颜色  private String color = "红色";  // 描述轮胎数  private int num = 4;    // 汽车名称  private String name;    /*   * 构造代码块,所生产的汽车名称相同   */  {  setName("宾利");  }    private SportCar() {    }    private SportCar(String color) {  this.color = color;  }    private SportCar(String color, int num) {  this(color);  this.num = num;  }    public String getColor() {  return color;  }    public String getName() {  return name;  }    public int getNum() {  return num;  }    public void setColor(String color) {  this.color = color;  }    public void setName(String name) {  this.name = name;  }    public void setNum(int num) {  this.num = num;  }    public static void main(String[] args) {  SportCar sc = new SportCar();  SportCar sc1 = new SportCar("绿色");  SportCar sc2 = new SportCar("蓝色",8);  System.out.println(sc);  System.out.println(sc1);  System.out.println(sc2);  }    @Override  public String toString() {  return name +" 汽车 "+color+"  "+num+" 个轮子";  }    }


六、this详解

在说明this之前,先看下面一段代码:


  public class SportCar02 {  // 描述颜色  private String color = "红色";  // 描述轮胎数  private int num = 4;    // 汽车名称  private String name;    /*   * 构造代码块,所生产的汽车名称相同   */  {  setName("宾利");  }    private SportCar02() {    }    private SportCar02(String color) {  color = color;//////  }    private SportCar02(String color, int num) {  this(color);  this.num = num;  }    public String getColor() {  return color;  }    public String getName() {  return name;  }    public int getNum() {  return num;  }    public void setColor(String color) {  this.color = color;  }    public void setName(String name) {  this.name = name;  }    public void setNum(int num) {  this.num = num;  }    public static void main(String[] args) {  SportCar02 sc1 = new SportCar02("绿色");  System.out.println(sc1);  }    @Override  public String toString() {  return name +" 汽车 "+color+"  "+num+" 个轮子";  }    }

在创建对象时我已经设置了汽车颜色为绿色,但是运行结果如下,车身颜色仍然为红色:


引出疑问:

this为什么可以解决这个问题,this到底代表的是什么呢?

this代表的是本类的对象,代表它所在函数所属对象的引用

简单的说:哪个对象在调用this所在的函数,this就代表哪个对象

上面的代码将“color = color;//////”处的代码改成“this.color = color;”即可

this的应用:

1、当定义类中功能时,该函数内部要用到调用该函数的对象时,这时用this来表示这个对象,但凡本类功能内部使用了本类的对象,都用this表示

2、用于构造函数之间进行互相调用,this语句只能定义在构造函数的第一行。因为初始化要先执行

定义这样一个需求:给跑车定义一个用于比较颜色是否相同的功能,并使用this进行构造函数之间的互相调用

代码如下:


  public class SportCar02 {  // 描述颜色  private String color = "红色";  // 描述轮胎数  private int num = 4;    // 汽车名称  private String name;    /*   * 构造代码块,所生产的汽车名称相同   */  {  setName("宾利");  }    private SportCar02() {    }    private SportCar02(String color) {  this.color = color;  }    private SportCar02(String color, int num) {  this(color);  this.num = num;  }    /**   * 用于比较颜色是否相同的功能   * @param sc   * @return   */  public boolean compare(SportCar02 sc) {  return this.color.equals(sc.color);  }    public static void main(String[] args) {  SportCar02 sc1 = new SportCar02("绿色",3);  SportCar02 sc2 = new SportCar02("绿色",8);  System.out.println(sc1+"\t"+sc2);  System.out.println(sc1.compare(sc2));  }    public String getColor() {  return color;  }    public String getName() {  return name;  }    public int getNum() {  return num;  }    public void setColor(String color) {  this.color = color;  }    public void setName(String name) {  this.name = name;  }    public void setNum(int num) {  this.num = num;  }    @Override  public String toString() {  return name + " 汽车 " + color + "  " + num + " 个轮子";  }    }

结果如下:





原创粉丝点击