一、为对象定义类
面对对象的程序设计(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(参数列表)调用参数多的构造方法。可以简化代码,易于阅读维护