Java对象和类(第九章)

一、为对象定义类

面对对象的程序设计(OOP)就是使用对象进行程序设计。

对象(object)代表现实世界中可以明确标识的一个实体。

每个对象都有自己独特的标识、状态、行为。

一个对象的状态(state,也称特征或属性)是由具有当前值的数据域来表示的。

一个对象的行为(behavior,也称为动作)是由方法定义的。调用对象的一个方法就是要求对象完成一个动作。

使用一个通用类来定义同一类型的对象。类用来定义对象的数据域是什么以及方法是做什么的。

一个对象是类的一个实例。可以从一个类中创建多个实例。创建实例的过程称为实例化。

对象和实例之间经常可以互换的。

Java使用变量定义数据域,使用方法定义动作。类还提供构造方法,调用它可以创建一个新对象。构造方法本身是可以完成任何动作的,但是设计构造方法是为了完成初始化动作。

不含main方法的类是不能运行的。包含main方法的类称为主类。

类的模板和对象的图示可以使用统一建模语言(UML)的图形符号进行标准化,这种表示方法称为UML类图或类图。

每个类被单独的翻译成一个字节码文件。

二、使用构造方法构造对象

构造方法在使用new操作符创建对象的时候被调用。

构造方法的特殊性:

1、构造方法必须具备和所在类相同的名字

2、构造方法没有返回值类型,void也没有

3、构造方法是在创建一个对象使用new操作符时调用的。构造方法的作用时初始化对象。

eg:public void Circle(){}在这种情况下Circle()是方法,而非构造方法。

构造方法是用来构造对象的。为了能够从一个类构造对象、使用new这个操作符来调用这个类的构造方法。如:new Classname(arguments);

通常一个类会提供一个没有参数的构造方法,称为无参构造方法。

一个类可以不定义构造方法,类中隐含定义一个方法体为空的无参构造方法,称为默认构造方法,当且仅当类中没有明确定义任何构造方法时才会提供它。

三、通过引用变量访问对象

1.引用变量和引用类型

对象是通过对象引用变量(reference variable)来访问的,该变量包含对对象的引用,

声明该变量语法:ClassName objectRefVar;

类是一种引用类型,意味着该类类型的变量都可以引用该类的一个实例。

eg:Circle myCircle;//声明了变量myCircle的类型是Circle类型

         变量myCircle能够引用一个Circle对象。

        myCircle=new Circle();//创建一个对象,并把它的引用值赋给变量myCircle

声明变量引用对象、创建对象以及将对象的引用赋值给这个变量:

ClassName objectRefVar = new ClassName();

对象引用变量和对象是不同的,但是在大多数情况下可以忽略差异。

2.访问对象的数据和方法

在面对对象的编程中,对象成员可以引用该对象的数据域和方法。在创建一个对象之后,它的数据和方法可以使用点操作符(.)来访问和调用,该操作符也称为对象成员访问操作符:

                objectRefVar.dateField引用对象的数据域

                objectRefVar.method(arguments)调用对象的方法。

eg:myCircle.radius引用myCircle的半径,而myCircle.getArea()调用myCircle的方法方法作为对象的操作被调用,它们依赖于某个具体的实例,称为实例变量和实例方法

与之相对:Math.methodName(参数)中所有的方法都是用关键字static定义的静态方法,而   getArea()是实例方法,不能用Circle.getArea()来调用

3.引用数据域和null值

数据域也可能是引用型的。如果一个引用类型的数据域没有引用任何对象,那么这个数据域就有一个特殊的Java值null。null同true和false一样都是一个直接量。true和false是boolean类型直接量。null是引用类型直接量。

引用类型数据域的默认值是null(eg:String类),数值类型数据域的默认值是0,boolean类型数据域的默认值是false,char类型数据域默认值是'\u0000'。但是Java没有给方法中的局部变量赋默认值

NullPointerException异常出现在调用值为null的引用变量上方法时。

4.基本类型变量和引用类型变量的区别

每个变量都代表一个存储值的内存位置。声明一个变量时,就是告诉编译器这个变量可以存放什么类型的值。对基本类型变量来说,对应内存所存储的值是基本类型值。对引用类型变量来说,对应的内存所存储的值是一个引用,是对象的存储地址。

eg:基本类型: int i =1 表示int型变量i的值就是int值1

        对象类型: Circle c 这时Circle对象c的值存的就是一个引用,指向对象在内存中的位置

对于基本类型变量来说,就是将一个变量的实际值赋给另一个变量。

对于引用变量来说,赋值语句c1=c2是将c2的引用赋给c1,之后c1和c2指向同一个对象。(在执行完赋值语句后,c1之前的引用的对象就不再有用,就成为了垃圾,垃圾会占用内存空间,Java运行系统会检测垃圾并自动回收它所占的空间,称为垃圾回收,如果不在需要某个对象时,可以显示的给该对象的引用变量赋值null值。如果该对象没有被任何引用变量所引用,Java虚拟机将自动回收它所占的空间)

四、使用Java库中的类

1.Date类

Java在java.util.Date类中提供了与系统无关的对日期和时间的封装

+Date()为当前时间创建一个Date对象

+Date(elapseTime: long)

为一个从格林尼治时间1970年1月1日至今流逝的以毫秒为单位计算的给定时间创建Date对象
+toString(): String返回一个代表日期和时间的字符串表示
+getTime(): Long返回从格林尼治时间1970年1月1日至今流逝的毫秒数
+setTime(elapseTime: Long): void在对象中设置一个新的流逝时间

2.Random类

java.util.Random
+Random()以当前时间作为种子创建一个Random对象
+Random(seed: long)以一个特定值作为种子创建一个Random对象
+nextInt(): int返回一个随机的int值
+nextInt(n:int): int返回一个0到n(不含n)之间的随机int值
+nextLong(): long返回一个随机的long值
+nextDouble(): Double返回一个0.0到1.0(不含1.0)之间的随机double值
+nextFloat(): float返回一个0.0F到1.0F(不包含1.0F)之间的随机float值
+nextBoolean(): boolean返回一个随机的boolean值

创建Random对象时,必须指定一个种子或者使用默认的种子。种子是一个用于初始化随机数字生成器的数字。无参构造方法使用之前以及逝去的时间作为种子,创建一个Random对象。如果两个Random对象有相同的种子,那么它们产生相同的数列。

3.Point2D类

javafx.geometry.Point2D
+Point2D(x:double,y:double)用给定的x和y坐标来创建一个Point2D对象
+distance(x:double,y:double):double返回该点到给定点(x,y)之间的距离
+distance(p:Point2D):double返回该点到给定点p之间的距离
+getX():double

返回该点的x坐标

+getY():double

返回该点的y坐标

+toString():String返回该点的字符串表示

五、静态变量、常量和方法

实例变量是绑定到类的某个特定实例的,它是不能被同一个类的不同对象所共享的。

eg:Circle 类的数据域radius称为一个实例变量。

        创建两个对象:Circle circle1=new Circle();  Circle circle2=new Circle();

        circle1中的radius和circle2中的radius是不相关的,它们存储在不同的内存位置。

如果想让一个类中的所有实例共享数据,要用静态变量(类变量)。静态变量将变量值存储在一个公共的内存地址。Java支持静态方法和静态变量,无须创建类的实例就可以调用静态方法。

类中的常量是被该类的所有对象所共享的。常量的声明为  final static

使用“类名.方法名(参数)”的方式调用实例方法和静态方法。

使用“类名.静态变量”的方法来访问静态变量。(提高可读性)

六、可见性修饰符

可以在类、方法和数据域前使用public修饰符,表示它们可以被任何其他的类访问。(可以应用在类或类的成员上)

如果没有使用可见性修饰符,那么则默认类、方法和数据域是可以被同一个包中的任何类访问的。这类称为包私有或包内访问。

包可以用来组织类。为了完成这个目标,需要在程序中首先出现下面的语句,在这行语句之前不能有注释也不能有空白:package packageName;

如果定义类时没有声明包,则表示把它放在默认包中。(建议放入包中)

private修饰符限定方法和数据域只能在它自己的类中被访问。(只能应用在类的成员上)

可见性修饰符指明类中的数据域和方法是否能在该类以外被访问。

七、数据域封装

为了避免对数据域的直接修改,可以使用private修饰符将数据域声明为私有,这称为数据域封装

在定义私有数据域的类外的对象是不能访问这个数据域的。为了能够访问私有数据域,提供了一个get方法返回数据域的值。为了能提供一个更新一个私有数据域,提供了一个set方法给数据域更新新值。get方法也称为访问器,set方法也称为修改器。

get方法签名:public returnType getPropertyName();

如果返回值类型是boolean型,习惯上定义:public boolean isPropertyName();

set方法签名:public void setPropertyName(dateType propertyValue)

八、 向方法传递对象参数

给方法传递一个对象,是将对象的引用传递给方法。

Java只有一种参数传递的方法:值传递。

九、对象数组

数组既可以储存基本类型值,也可以存储对象。

eg:Circle[] circleArray=new Circle[10];声明和创建10个Circle对象的数组

对象的数组实际上就是引用变量的数组。当使用new操作符创建对象数组后,每个元素都是默认为null的引用变量。

十、不可变对象和类

可以定义不可变类来产生不可变对象,不可变对象的内容不能更改。(没有set方法)

要使一个类成为不可变类,需要满足:

1、所有数据域都是私有的  2、没有修改器方法 

3、没有一个返回指向可变数据域的引用的访问器方法

十一、变量的作用域

实例变量和静态变量的作用域都是整个类,无论变量声明在哪里。

一个类的实例变量和静态变量称为类变量或数据域。在方法内部定义的变量称为局部变量。

十二、this引用

关键字this是指向调用对象本身的引用名。可以使用this关键字引用对象的实例成员。

this引用通常情况下是可以省略的,但是在引用隐藏数据域以及调用一个重载的构造方法的时候,this引用是必须的。

1、使用this引用隐藏数据域

eg:在数据域的set方法中,经常将数据域名作为参数名,在这种情况下,这个数据域在set方法中被隐藏。为了给他设置新值,需要在方法中引用隐藏的数据域名。

隐藏的静态变量通过“类名.静态变量”的方式引用。

隐藏的实例变量使用关键字this来引用。

2、使用this调用构造方法

关键字this可以调用同一个类的另一个构造方法。

Java要求在构造方法中,语句this(参数列表)应在任何其他可执行语句前出现。

如果一个类中有多个构造方法,最好尽可能使用this(参数列表)来实现它们。通常,无参数和参数少的构造方法可以使用this(参数列表)调用参数多的构造方法。可以简化代码,易于阅读维护

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值