JAVA基础知识(四)
5.2 类与对象
5.2.1 类与对象的关系
在面向对象中类和对象是最基本、最重要的组成单元。类实际上是表示一个客观世界某类群体的一些基本特征抽象。对象是表示一个个具体的东西。例如,在现实生活中,人就可以表示为一个类,因为人本身属于一种广义的概念,并不是一个具体的。而某一个具体的人,就可以称为对象,可以通过各种信息完善的描述这个具体的人,如这个人的姓名、年龄、性别等信息,这些信息在面向对象的概念中就称为属性,当然人是可以吃饭、睡觉的,那么这些人的行为在类中就称为方法。也就是说如果要使用一个类,就一定有产生对象,每个对象之间是靠各个属性的不同来进行区分的,而每个对象所具备的操作就是类中规定好的方法。
5.2.2 类的定义
class 类名称{
数据类型 属性;
......
public 返回值得数据类型 方法名称(参数1,参数2···){
程序语句;
[return 表达式;]
}
}
例 定义Person类
class Person{
String name; //声明姓名属性
int age; //声明年龄属性
public void tell(){ //取得信息的方法
System.out.println("姓名:"+name+",年龄:"+age);
}
}
定义tell方法是为了打印定义的两个属性的内容。
没有加“static”关键字,这是因为此时定义的方法将要由对象调用,而不像之前那样与主方法定义在一个类中且由主方法直接调用。
Person
——
name:String
age:int
——
+tell():void
(1)第一层表示类的名称,类的名称与之前一样要求开头字母大写;
(2)第二层表示属性的定义,按照“访问权限 属性名称:属性类型”的格式定义,在本类中因为声明属性处没有写任何的访问权限,所以前面暂时不加任何的符号;
(3)第三层表示类中方法的定义,按照“访问权限 方法名称():方法返回值”的格式定义,在本类中方法的声明处加上了public(此为访问权限,表示任何地方都可以访问),所以使用“+”表示。另外如果方法中有传递的参数,则方法定义格式为:“访问权限 方法名称(参数名称:参数类型,…):方法返回值”。
5.2.3 对象的创建及使用
类名 对象名称 = null; //声明对象
对象名称 = new 类名(); //实例化对象,只要有关键字new就表示开辟新的堆内存空间
或
类名 对象名称 = new 类名();
5-3 访问对象中的属性或方法
访问属性:对象名称.属性名
访问方法:对象名称.方法名()
如果一个对象要被使用,则对象必须被实例化,如果一个对象没有被实例化而直接调用了对象里的属性或方法,则程序运行时会出现以下异常:Exception in thread "main"java.lang.NullPointerException
此问题只会出现在引用数据类型中,只要使用了未实例化的对象则肯定会出现此异常。
5.2.4 创建多个对象
类属于引用数据类型,而且从数组的使用上也可以发现,引用数据类型就是指一段堆内存空间可以同时被多个栈内存所指向。
所谓的引用传递,就是将一个堆内存空间的使用权给多个栈内存空间,每个栈内存空间都可以修改堆内存的内容。
关于垃圾空间的释放。
Java本身提供垃圾收集机制(简称GC, GarbageCollection),会不定期的释放不用的内存空间,只要对象不适用了,就会等待GC释放空间。
一个栈内存空间只能指向一个堆内存空间,如果要想再指向其他的堆内存空间,则必须先断开已有的指向才能分配新的指向。
5.3 封装性
格式5-4 使用封装性
为属性封装:private 属性类型 属性名称;
为方法封装:private 方法返回值 方法名称(参数列表){}
使用了关键字private定义,属性为私有的,所以不能有对象直接进行访问。这样就可以保证对象无法直接去访问类中的属性,从而保证对入口处有限制。为了解决属性必须封装且又必须访问的矛盾,在Java开发中对于私有属性的访问有了以下明确定义:“只要是被封装的属性,则必须通过setter和getter方法设置和取得”。
对于私有属性要使用setter和getter方法设置和访问实际上还有一个原因,就是在Java中存在反射机制,在各个程序中,反射机制都会利用setter和getter设置和取得属性内容。
在程序中可以发现通过setter()和getter()方法可以设置和取得属性,而在主方法调用时,也是调用了setter()方法进行内容的赋值,也就是说如果想对设置进去的值进行检查的话,则只需要在setter()方法处检查即可。
关于private的补充说明。
1.类中全部属性都必须封装,封装之后的属性必须通过setter和getter进行访问。
2.面向对象的封装性本身并不是单指private关键字,用private声明的属性或方法只能在其类的内部被调用,而不能在类的外部被调用。
3.正常情况下,类中的方法直接写上方法名称就可以完成本类中的方法调用,如果在此时非要强调是本类中的方法,也可以在调用的时候按“this.方法名称()”的形式编写:
public void tell(){
System.out.println(“姓名:”+this.getName()+",年龄:"+this.getAge());
}
在代码中是否使用this明确的表示当前类中的方法并没有严格的要求,但是最好采用this.方法的形式,这样会比较标准一些,在查错的时候也会更加方便。
程序中的属性进行封装之后,在使用类图表示封装属性的时候就必须按照如下风格:
“- 属性名称:数据类型”
Person
————————————
- name:String
- age :int
————————————
+tell() :void
+getName():String
+setName(String n):void
+getAge():int
+setAge(int a):void
“-”表示private。