JAVA基础知识(四)

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值