1. 对象
对象(object):代表现实世界中可以明确标识的一个实体。例如:一个学生、一张桌子等。每个对象都有自己独特的标识、状态和行为。
-
- 1) 对象的状态是指那些具有它们当前值的数据域。java使用变量定义数据域。
- 2) 一个对象的行为是由方法定义的。调用对象的方法就是要对象完成一个动作。
2.使用构造方法构造对象
构造方法是一种特殊的方法,具有以下三个特性:
-
- 1) -- 构造方法必须与所在类名字相同。
- 2) -- 构造方法没有返回值,甚至也没有void。
- 3) -- 构造方法在创建一个对象使用new操作符时调用的。用于初始化对象。
new ClassName (arguments); new 类名 (参数);
-
- 4) -- 构造方法可以重载。
通常情况下,一个类会提供一个没有参数的构造方法,即无参构造函数。如果类中没有定义构造方法,则系统会提供一个默认的方法体为空的无参构造方法,即默认构造方法。(default constructor)。
一个类的例子:
public class TV { int channel = 1; int volumeLevel = 1; boolean on = false; //默认无参构造函数 public TV(){} //带参数的构造函数 public TV(int newChannel, int newVolumeLevel, boolean newOn){ this.channel = newChannel; this.volumeLevel = newVolumeLevel; this.on = newOn; } //方法 public void turnOn(){ on = true; } public void turnOff(){ on = false; } public void setChannel(int newChannel){ if (on && newChannel >= 1 && newChannel <= 120) channel = newChannel; } public void setVolume(int newVolumLevel){ if (on && newVolumLevel >= 1 && newVolumLevel <= 7) volumeLevel = newVolumLevel; } public void channelUp(){ if (on && channel < 120) channel++; } public void channelDown(){ if (on && channel > 1) channel--; } public void volumeUp(){ if (on && volumeLevel < 7) volumeLevel++; } public void volumeDown(){ if (on && volumeLevel > 1) volumeLevel--; } }
调用实例:
Now the TV's channel is 10 , and volum level is: 3 Now the TV's channel is 30 , and volum level is: 4
3. 通过引用变量访问对象
3.1. 引用变量和引用类型
对象是通过引用变量来访问的,该变量包含对对象的引用,使用如下语句声明引用变量:
ClassName objectRefVar; 类名 对象引用变量
Circle myCircle = new Circle();//创建一个对象,并将其引用赋值给变量myCircle
ClassName objectRefVar = new ClassName(); 类名 对象引用变量 = new 类名(); //声明对象引用变量,创建对象以及将对象的引用赋值给这个变量的语句
在java中,数组被看成是对象。数组是用new操作符创建的。一个数组变量实际上就是一个包含数组引用的变量。
3.2. 访问对象的数据和方法
创建一个对象后,其数据和方法可以使用圆点(.)运算符来访问和调用。该运算符.也称为对象成员运算符:
objectRefVar.dataField; //引用对象的数据域 objectRefVar.method; //(参数)调用对象的方法
myCircle.radius //引用myCircle的半径
-
- 1) 引用变量与基本类型变量的区别:基本类型变量——对应内存所存储的是基本类型变量的值;引用变量——对应内存所存储的值是一个引用,是对象存储的地址。
- 2) 将一个变量赋值给另一个变量时,另一个变量就被赋予同样的值。对基本数据类型来说,就是将变量的数值赋予另一个变量。对引用来说则是将一个变量的引用赋给另一个变量,两个变量同时指向同一个对象。
java中的垃圾回收:如果原来两个引用变量c1, c2分别指向不同的对象,但是后来由于引用赋值,c1与 c2都指向c1所指的对象,那么c2之前引用的对象就是无用的了,称为了垃圾(garbage)。垃圾会占用内存空间。Java运行系统会检测垃圾并自动回收它所占用的空间,这个过程称为垃圾回收(garbage collection)。
--如果你认为不再需要某个对象,可以显示地给该对象的引用赋null值。
4. 静态变量、常量和方法
- 1)如果想让一个类的所有实例共享数据,就将其声明为静态变量,也称为类变量。静态变量将变量存储在一个公共的内存空间。 Java支持静态变量和静态方法,无须创建类的实例就可以调用静态方法。
- 2)要声明一个静态变量或者定义一个静态方法,就要在这个变量或方法的声明中加上static。
- 3)类中的常量是被该类的所有对象所共享的。因此常量应该声明为:final static。 例如Math类中的PI常量: final static double PI = 3.14159265358979323846
- 4)使用 “类名.方法名” 的方式来调用静态方法,使用 “类名.静态变量”的方法来调用静态变量。
- 5)如果一个变量或者方法不依赖于具体类的实例对象,那么应该将其设计为静态变量、静态方法。
Circle类:
package demo; public class Circle { double radius; //圆的半径 static int numberOfObjects = 0; //创建实例对象的个数 Circle(){ radius = 1.0; numberOfObjects++; } Circle(double newRadius){ radius = newRadius; numberOfObjects++; } static int getNumberOfObjects(){ return numberOfObjects; } double getArea(){ return radius * radius * Math.PI; } }
测试类:
package demo; public class TestCircle { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("创建对象前:"); System.out.println("实例的个数为:" + Circle.numberOfObjects); Circle c1 = new Circle(); //创建c1 System.out.println("创建c1后,c1的半径为:" + c1.radius + ", c1的面积为: "+ c1.getArea()); System.out.println("实例的个数为:"+ c1.numberOfObjects); Circle c2 = new Circle(2.5); System.out.println("创建c2后,c2的半径为:" + c2.radius + ", c2的面积为: "+ c2.getArea()); System.out.println("实例的个数为:"+ c2.numberOfObjects); } }
输出:
创建对象前: 实例的个数为:0 创建c1后,c1的半径为:1.0, c1的面积为: 3.141592653589793 实例的个数为:1 创建c2后,c2的半径为:2.5, c2的面积为: 19.634954084936208 实例的个数为:2
5. 可见性修饰符(public、private、protected)
-
- 1)、如果在类、方法、数据域前使用public修饰符,表示它们可以被任何其他的类访问。
- 2)、如果没有使用可见性修饰符,那么默认为类、方法、数据域可以被同一个包中的任何一个类访问。————称为包私有或包内访问。
- 3)、private修饰符限定方法和数据域只能在它自己的类中被访问。
- 4)、如果一个类没有被定义为公共的,那么其只能在同一个包内被访问。
- 5)、修饰符private只能应用在类的成员上。修饰符public可以作用在类或类的成员上。
- 6)、在局部变量上使用修饰符public和private都会导致编译错误。
- 7)、大多数情况下,构造方法是公共的。但是如果想要阻止用户创建类的实例,就该使用私有的构造方法。例如Math类的所有数据域和方法都是静态的,没必要创建Math的实例。其构造 方法: private Math(){}
- 8)、protected关键字现在父类的数据域和方法只能有其子类访问。
- 9)、private、protected只能用于类的成员,public既可以用于类成员,也可以用于类。
修饰符 | 在同一个类内可访问 | 在子类可访问 | 在同一包内可访问 | 在不同包可访问 |
public | √ | √ | √ | √ |
protected | √ | √ | √ | - |
default | √ | - | √ | - |
private | √ | - | - | - |
6. 数据域封装
为了防止对数据域的直接修改,使用private修饰符将数据域声明为私有的,称为数据域的封装。
为了修改和访问私有数据域,定义get和set方法:get(读取器)返回数据域的值,set(设置器)给数据域设置新值。
get方法的签名: public returnType getPropertyName() 如果返回值是boolean类型: public boolean isPropertyName() set方法的签名: public void setPropertyName( dataType propertyValue )
7. 对象数组
Circle [] circleArray = new Cricle [10] ; //创建10个circle对象数组 初始化circleArray数组: for( int i = 0; i < 10; i++){ circleArray[i] = new Circle(); }
终极类--final修饰符
· 1. 使用final关键字表示一个类是终极的,是不能作为父类进行扩展的。Math类就是一个终极类。
public final class C {}
· 2. 使用关键字修饰一个方法,表示其不能被子类覆盖,是终极的
public class Test{ public final void test(){ //方法体 } }
不可变对象和类
不可变对象对应的是不可变类。一个类是不可变的,必须满足:
· 所有数据都是私有的。
· 没有修改器方法
· 没有访问器方法,因为访问器会返回一个指向可变数据域的引用。
this引用
关键字this指向调用对象本身的引用名。
public class Circle { double radius; public Circle(double radius){ this.radius = radius; //显示调用this来引用被创建对象的数据域radius } public Circle(){ this(1.0); //使用this调用另一个构造方法 } public double getArea(){ return this.radius * this.radius * Math.PI; } }