> 文章列表 > java day3

java day3

java day3

第三章 对象

  • 3.1 创建新对象
    • 3.1.1 使用new
    • 3.1.2 对象是如何创建的
    • 3.1.3 内存管理
  • 3.2 使用类变量和实例变量
    • 3.2.1 获取值
    • 3.2.2 设置值
    • 3.2.3 类变量
  • 3.3 调用方法
    • 3.3.1 设置字符串的格式
    • 3.3.2 嵌套方法调用
    • 3.3.3 类方法
  • 3.4 对象的引用
  • 3.5 对象和基本数据类型的强制类型转换
    • 3.5.1 强制转换基本类型
    • 3.5.2 强制转换对象
    • 3.5.3 基本类型和对象之间的转换
  • 3.6 比较对象值和类
    • 3.6.1 比较对象
    • 3.6.2 判断对象所属的类

3.1 创建新对象

类是用来创建对象的模板。对象(也叫实例)是程序的独立元素,包含相关的特性和数据。

  • 除了String和表示基本数据类型的类,要创建其他类的实例,需要使用new运算符。

3.1.1 使用new

  1. eg:
Point pt = new Point(0,0);

圆括号中可包含的参数个数和类型由类本身决定,这是通过一种叫做构造函数(constructor)的特殊方法定义的。如果提供的方法不正确,将导致编译出错。

  1. 这里介绍了一个StringTokenizer类,它可以将一个字符串划分为一系列叫做标记(token)的短字符串。
String quote;
StringTokenizer str;
str = new StingTokenizer(quote,"@");

这样就可以将quote以@分类。若括号中没有指定分类符,则空格、制表符、换行符、回车或换页符都可以作为默认分页符。

3.1.2 对象是如何创建的

  • 当您使用运算符new时,将发生如下几件事:创建给定类的实例,为它分配内存,调用构造函数。
  • 构造函数初始化新对象及其变量,创建该对象所需的其他对象,并执行初始化该对象所需的其他操作。
  • 同一个类可以有多个构造函数,每个构造函数的参数数目和类型各不相同。
  • 如果没有定义任何构造函数,创建这个类的对象时,默认将调用没有参数的构造函数。这个构造函数所做的唯一工作是,调用其超类中不接收任何参数的构造函数。
  • 只有没有定义任何构造函数的类才有默认构造函数。只要您在类中定义了一个构造函数,就不要指望它有不带任何参数的默认构造函数。

3.1.3 内存管理

  • 在Java中,内存管理是动态的、自动的。当您创建新对象时,Java自动为该对象分配适当数量的内存,您不必显式地为对象分配内存。这项工作有java虚拟机(JVM)完成。
  • 程序运行时,Java虚拟机定期地查找未用的对象,并收回这些对象占用的内存。这被称为动态垃圾收集。

3.2 使用类变量和实例变量

3.2.1 获取值

float total=customer.orderTotal;

3.2.2 设置值

要使用句点表示法给实例变量赋值,可使用运算符=,就像给基本类型变量赋值一样。

3.2.3 类变量

类变量是在类中定义和存储的,它们的值适用于类及其所有实例。

  • 定义类变量的方法是,在前面加上关键字static。
class FamilyMember{static String surname = "Mendoza";String name;int age;
}

类FamilyMember的每个实例都有自己的name和age值;但对所有家庭成员来说,类变量surname的值都相同:Mendoza。修改surname的值将影响所有FamilyMember实例。

3.3 调用方法

通过调用对象的方法来让对象做事情。

3.3.1 设置字符串的格式

int accountBalance = 5005;
System.out.format("Balance: $%,d%n", accountBalance);

上述输出为Balance:$5,5005.

double pi = Math.PI;
System.out.format("%.11f%n", pi);

上述输出为3.14159265359.

3.3.2 嵌套方法调用

如果某方法返回一个对象,则可以在同一条语句中调用该对象的方法。

customer.orderTotal.putOnLayaway(itemNumber,price,quatity);

3.3.3 类方法

类方法也被称为静态方法,他们与类变量一样适用于整个类,而不是某个实例。类方法通常用作通用的工具方法,它不是直接操作某个对象,而是整个类。

3.4 对象的引用

1.引用是一个地址,它指明了对象的变量和方法的存储位置。
2.将对象赋给变量或将其作为参数传递给方法时,您实际上并没有使用对象。您甚至没有使用对象的拷贝,您使用的是对象的引用。

public class RefTester {public static void main(String[] args){Point pt1,pt2;pt1 = new Point(100,100);pt2 = pt1;pt1.x =200;pt1.y =200;System.out.println("Point1: "+ pt1.x+", "+pt1.y);System.out.println("Point2: "+ pt2.x+", "+pt2.y);}
}
输出:
Point1: 200, 200
Point2: 200, 200

要让pt1和pt2指向不同的对象,可以在第6~7行分别使用new Point()语句来创建不同的对象,如下所示:

pt1 = new Point(100,100);
pt2 = new Point(100,100);

3.5 对象和基本数据类型的强制类型转换

强制类型转换(casting)将值从一个类型转换为另一种类型。

3.5.1 强制转换基本类型

基本类型之间的强制转换让您能够将值从一种基本数据类型转换为另一种。这通常发生在数字类型上,而有一种基本数据类型永远不能用于强制类型转换中:布尔值要么为true,要么为false,不能用于强制类型转换操作中。

3.5.2 强制转换对象

由于子类的行为比超类多,所以将降低降低精度。超类对象可能不具备子类对象的所有行为。例如,如果在调用Interger对象的方法的地方使用其超类Number的对象,而Number对象没有很多Interger特有的方法。试图调用目标对象没有的方法将出错。

Employee emp=new Employee();
VicePresident veep=new VicePresident();
emp=veep; //no cast needed for upward use
veep = (VicePresident) emp; // must cast explicity

3.5.3 基本类型和对象之间的转换

  • 在任何情况下,您都不能将对象强制转换为基本数据类型或将基本类型强制转换为对象。在Java中,基本类型和对象是完全不同的东西,不会自动在它们之间进行转换。
  • 下面的类用来处理对象,而不是基本数据类型:Boolean、Byte、Character、Double、Float、Interger、Long、Short和Void。这些类通常被称为对象封装器(object wrapper),因为它们提供了基本类型值的对象表示。
  • 通过自动封装(autoboxing)和拆封(unboxing)—— 一种自动转换过程,处理表示同一类值的基本类型和对象时更为容易。
Float f1 = 12.5F;
Float f2 = 27.2F;
System.out.println("Lower number: "+Math.min(f1,f2));

方法Math.min()接受两个float参数,但在上述示例中,给这个方法传递的是两个Float对象。编译器不会因为这种不一致而报错。相反,它将float对象拆封为float值,再将其传递给min()方法。

3.6 比较对象值和类

除强制类型转换外,还常常需要对对象执行下列3种操作:

  • 比较对象
  • 判断对象所属的类
  • 判断对象是否是特定类的实例

3.6.1 比较对象

要比较类的对象,并使结果有意义,必须在类中实现特殊的方法,并调用这些方法。

public class EqualsTester {public static void main(String[] args){String str1,str2;str1="Boy, that escalated quickly.";str2 = str1;System.out.println("String1: "+ str1);System.out.println("String2: "+ str2);System.out.println("Same object? "+ (str1 == str2));str2 = new String(str1);System.out.println("String1: "+ str1);System.out.println("String2: "+str2);System.out.println("Same object? "+(str1==str2));System.out.println("Same value? "+ str1.equals(str2));}
}

==用于判断两边引用的是否是同一个对象。

3.6.2 判断对象所属的类

  • 想确定对象所属的类,可以采用下述方式。这里判断的是赋给变量key的对象所属的类:
String name = str2.getClass().getName();
System.out.println(name);

方法getClass()是在Object类中定义的,因此所有java对象都包含它。这个方法返回一个Class对象,指出了对象所属的类。对象的getName()返回一个表示类名的字符串。

  • 另一种检测方式是instanceof运算符,它使用两个操作数:左边为对象的引用,右边是类名。该表示返回一个布尔值:如果该对象是这种类或其子类的实例,为true,否则为false,如下面例子所示:
boolean check1 = "Texas" instanceof String; //   trueobject obiwan = new Object();
boolean check2 = obiwan instanceof String; // false

鲁西人才网