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 }
输出结果:
内存分析: