二、Java面向对象(3)_类和对象

2018-04-29

 

类和对象

 

一、什么是抽象

  在计算机科学中,抽象是一种过程,在这个过程中,数据和程序定义的形式与代表的内涵语言相似,同时隐藏了实现细节。

  抽象:一个概念或者想法不和任何特定的具体实例绑死。

    

  简单地说:“抽象只从正确的角度,透露对象的某些相关细节。”

  在面向对象编程理论中,抽象涉及到定义抽象对象的语言基础,它到底如何工作、如何获取和改变状态,并与系统中的其他对象进行“交流”。

  抽象在任何编程语言中的许多方面起作用。从创建子程序到定义接口来,生成低级语言调用,例如设计模式

  

  参考:

  http://www.cnblogs.com/keeplearnning/p/7021600.html

二、对象和类的关系

  1.对象

    状态(属性)

    行为(功能)

 ---------------------------------------------------------------------------------------------------------------------------

    在现实中任何存在的事物都可以看成对象 通过其属性进行分类

    比如生物包括动物等不同种类,动物又分猫科等 猫科又分特定物种
    而每一个对象都是一个单独的个体,就好像世界上不存在两个你

    在程序中也是如此,类的继承就好像生物包括动物、动物包括猫科这样
    而对象也是通过不同的类来创建出来的单独的个体

    类之间只存在继承关系(extends ) 就和上边说的 生物包括动物 动物包括猫科
    而接口相当于拥有能力 一个生物可以拥有很多能力 但是他只属于一个类别
    所以说只有接口才可以implements

    对此 你也可以理解为extends过来的是父母教的 implements 是自学成才。

------------------------------------------------------------------------------------------------------------------------------

    通过对多个同类型的对象分析,我们可以把对象抽象成类。

  2.类

    具有相同属性(状态)和行为(功能)的对象的抽象就是类。  类实际上是一种数据类型。

    因此,对象的抽象是类,类的具体化是对象(类的实例化就是对象)。

 

    类具有的属性也就是对象的状态,使用成员变量定义,用来封装数据。

    类具有的功能也就是对象的行为,定义在方法里面。

 

    类是对象的模板/类型。创建一个对象,就是使用类作为构建该对象的基础。描述类少不了对象,描述对象也少不了类。“先有鸡还是先有蛋”。

    在面向对象编程里,先有类才有对象,如果没有类对象无法实例化。

    对象是类的实例,类是对象的模板。(根据模板来创建实例)

三、类的定义

  [修饰符] class 类名{

    //定义成员变量(字段/field)

    //定义成员方法

  }

    

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  定义类的注意事项:

  1)如果类使用了public修饰符,则当前文件名必须与类名相同。

  2)类名最好使用名词表示,因为类表示一类事物。类名首字母大写,如果是多个单词组成则使用驼峰表示法命名,如:EmployeeSetting

  3)在面向对象学习过程中,专门为描述对象提供一个类,该类不需要main方法,我们再专门定义一个测试类用来运行程序。

 

四、对象基本操作

 

a)对象的创建和使用

  1.(根据类)创建对象的语法:

    类名  变量 =  new 类名();

  2.给字段设置值

    对象变量.字段名 = 该类型的值;

  3.获取字段值

    该字段类型 变量 = 对象变量.字段值;

  4.通过对象调用方法

    对象变量.方法名([实参]);

  

b)对象的实例化过程

  先为对象分配空间,并按属性类型默认初始化
  ps:八种基本数据类型,按照默认方式初始化,其他数据类型默认为null

  

  不同类型的成员变量的初始值:

  

  对象实例化内存分析:

  

c)对象的生命周期

   对象的打印操作:object的toString方法

   对象的比较操作:“==”对于基本数据类型比较的是值,对于引用类型比较的是内存中的地址值

            如果对象拥有完全相同的数据,想让他们相等,使用object的equals方法

   对象的生命周期:

    开始:使用new创建对象的时候,内存中就会分配一个空间

    结束:当堆中的对象没有被任何变量引用,此时改对象就成了垃圾,等着被垃圾回收器(GC)回收垃圾,当改垃圾被回收的时候,对象就被销毁了。(回收垃圾的目的是为了释放更多的内存空间)

 

d)匿名对象

  没有名称的对象,创建对象之后没有赋给一个变量。

  new Servant();//匿名对象只是在堆中开辟一块新的内存空间,但是没有把该空间的内存地址赋给任何变量

  因为没有名称,所以匿名对象只能使用一次。

------------------------------------------------------------------------------------------------------------

普通申明一个对象是这样的
A a = new A();
那么这个时候a就是类A的一个对象,这个对象名字就是a
再来看下面一个例子:
method(A a);
整理method是一个方法,他需要传递一个对象来作为参数,那么这个时候有2种方法:
方法1:
A a =new A();
method (a);
方法2:
method (new A());

方法2中new A()就是一个匿名对象,他没有名字。这样可以理解了吧。

--------------------------------------------------------------------------------------

  匿名对象的用法:

  1)当对象的方法只调用一次时,可以用匿名对象来完成,这样写比较简化。

 

    如果对一个对象进行多个成员的调用,就必须给这个对象起个名字。

 

   2)匿名对象使用方法二:可以将匿名对象作为实际参数进行传递。

 

 

e)学生缴费案例

  学生类(Student)有两个字段:name(名字)和isFee(是否交学费的状态),有一个方法交学费(fees)。

  每一个学生都是通过Student类new出来的一个对象,现在创建一个数组存放多个学生对象,再判断数组中的学生是否已经交费,如果没有则调用交学费的方法。

 

代码实现:

 1 class Student
 2 {
 3     String name;//名字
 4     boolean isFee = false;//是否交费,默认未交费
 5 
 6     //定义交学费的方法
 7     void fees(){
 8          isFee = true;
 9     }
10 }
11 
12 
13 //测试类
14 public class TestDemo
15 {
16     public static void main(String[] args){
17         
18         Student s1 = new Student();
19         s1.name = "李白";
20         s1.isFee = true;
21 
22         Student s2 = new Student();
23         s2.name = "鲁班";
24         
25 
26         Student s3 = new Student();
27         s3.name = "张三";
28         s3.isFee = false;
29 
30         Student s4 = new Student();
31         s4.name = "李军";
32         s4.isFee = true;
33 
34         //创建数组用来存放多个学生对象
35         Student[] arr = new Student[] {s1,s2,s3,s4};
36         //使用for-each循环迭代数组元素
37         for(Student ele : arr){
38             //System.out.println(ele.name + "," +ele.isFee);
39 
40             //判断是否交费,如果没有交费则调用fees方法
41             if(!ele.isFee){
42                 ele.fees();
43             }
44         }
45         for(Student ele : arr){
46             System.out.println(ele.name + "," +ele.isFee);
47         }
48 
49     }
50 }

 输出结果:

 内存分析:

原文地址:https://www.cnblogs.com/sunNoI/p/8969378.html