Java核心卷一复习笔记(2)——第四章

4.2.1对象与对象变量
     Java中 , 使用构造器 ( constructor ) 构造新实例 。 构造器是一种特殊的方法, 用来构造并初始化对象 。
构造器的名字应该与类名相同。
    希望构造的对象可以多次使用 , 因此, 需要将对象存放在一个变量中 :
Date birthday = new Date ( ) ;
    在对象与对象变量之间存在着一个重要的区别。 例如 , 语句
Date deadline ; / / deadline doesn ' t refer to any object
定义了一个对象变量 deadline , 它 可 以 引 用 Date 类型的对象。 但是 , 一定要认识到 : 变量deadline 不是一个对象 , 实际上也没有引用对象。 此时 , 不能将任何Date 方法应用于这个变量上。 语句
s = deadline . toStringO ; / / not yet
    将产生编译错误。必须首先初始化变量 deadline , 这里有两个选择。 当然 , 可以用新构造的对象初始化这个变量 :
deadline = new Date ( ) ;
也让这个变量引用一个已存在的对象 :
deadline = birthday ;
    一定要认识到 : 一个对象变量并没有实际包含一个对象, 而仅仅引用一个对象 。在 Java 中, 任何对象变量的值都是对存储在另外一个地方的一个对象的引用 。 new 操作符的返回值也是一个引用。 下列语句 :
Date deadline = new Date ( ) ;
    有两个部分。 表达式new Date ( ) 构造了一个 Date 类型的对象 , 并且它的值是对新创建对象的引用。 这个引用存储在变量
deadline 中。
可以显式地将对象变量设置为 null, 表明这个对象变量目前没有引用任何对象 。
deadline = null ;
if ( deadline ! = null )
System . out . println ( deadline ) ;
如果将一个方法应用于一个值为 null 的对象上 , 那么就会产生运行时错误 。局部变量不会自动地初始化为 null, 而必须通过调用 new 或将它们设置为 null进行初始化 。

4.3自定义类
    在一个源文件中,只能有一个公有类, 但可以有任意数目的非公有类 。
    • 构造器与类同名
    • 每个类可以有一个以上的构造器
    • 构造器可以有0 个 、 1 个或多个参数
    • 构造器没有返回值
    • 构造器总是伴随着new 操作一起调用

4.3.6基于类的访问权限
    方法可以访问所调用对象的私有数据 。 一个方法可以访问所属类的所有
对象的私有数据。

4.3.9 final实例域
    可以将实例域定义为 final 。 构建对象时必须初始化这样的域。 也就是说 , 必须确保在每一个构造器执行之后 , 这个域的值被设置 , 并且在后面的操作中,不能够再对它进行修改。
例如, 可以将 Employee 类中的name 域声明为 final , 因为在对象构建之后, 这个值不会再被修改 , 即没有 setName 方法。
class Employee
{
private final String name ;
}
final 修饰符大都应用于基本 ( primitive ) 类型域, 或不可变 ( immutable )类的域 ( 如果类中的每个方法都不会改变其对象, 这种类就是不可变的类。 例如 , String 类就是一个不可变的类 ) 。对于可变的类,使用 final 修饰符可能会对读者造成混乱。 例如 ,
private final StringBuiIcier evaluations ;
在 Employee 构造器中会初始化为
evaluations = new StringBuilder ( ) ;
final 关键字只是表示存储在 evaluations 变量中的对象引用不会再指示其他 StringBuilder
对象 。 不过这个对象可以更改 :
public void giveGoldStarO
{

evaluations . append ( LocalDate . now ( ) + " : Gold star ! \ n " ) ;
}

4.4.1静态域
    如果将域定义为 static , 每个类中只有一个这样的域。 而每一个对象对于所有的实例域却都有自己的一份拷贝。

4.4.2静态常量
    在Math 类中定义了一个静态常量 :
public class Hath
{
public static final double PI = 3.14159265358979323846 ;

}
    另一个多次使用的静态常量是 System . out。 它在 System 类中声明 :
public cl ass System
{
public static final PrintStream out = . . . ;
}

4.4.3静态方法
    静态方法是一种不能向对象实施操作的方法。
    • 一个方法不需要访问对象状态 , 其所需参数都是通过显式参数提供 ( 例如 : Math . pow ) 
    • 一个方法只需要访问类的静态域 ( 例如: Employee . getNextldh)。

4.4.5方法参数
    按值调用 ( call by value ) 表示方法接收的是调用者提供的值。 而按引用调用( call by reference )表示方法接收的是调用者提供的变量地址。 一个方法可以修改传递引用所对应的变量值 , 而不能修改传递值调用所对应的变量值。

4.6.1重载
     如果多个方法 ( 比如 , StringBuilder构造器方法 ) 有相同的名字 、 不同的参数, 便产生了重载 。

4.6.2默认域初始化
    如果在构造器中没有显式地给域赋予初值 , 那么就会被自动地赋为默认值 : 数值为 0 、布尔值为 false、对象引用为 null 。
    这是域与局部变量的主要不同点 。 必须明确地初始化方法中的局部变量 。 但是 ,如果没有初始化类中的域 , 将会被自动初始化为默认值 ( 0、 false 或null )。

4.6.3无参构造器
   如果在编写一个类时没有编写构造器 , 那么系统就会提供一个无参数构造器 。  如果类中提供了至少一个构造器 , 但是没有提供无参数的构造器 , 则在构造对象时如果没有提供参数就会被视为不合法。

4.6.6调用另一个构造器
     this 指示隐式参数 , 也就是所构造的对象 。
    如果构造器的第一个语句形如 this ( . . . ), 这个构造器将调用同一个类的另一个构造器 。

4.6 . 7 初始化块
    • 在构造器中设置值
    •在声明中赋值
    Java 还有第三种机制 , 称为初始化块 ( initializationblock ) 。 在一个类的声明中 ,可以包含多个代码块。 只要构造类的对象 , 这些块就会被执行
class Employee
{
private static int nextld ;
private int id ;
private String name ;
private double salary ;
/ / object initialization block
{
id = nextld ;
nextld + + ;
public Employee ( St ring n , double s )
salary = s ;
public Employee ( )
{
name =
salary = 0 ;
}
}
在这个示例中
, 无论使用哪个构造器构造对象 , id 域都在对象初始化块中被初始化 。 首先运行初始化块, 然后才运行构造器的主体部分 。

下面是调用构造器的具体处理步骤 :
1 ) 所有数据域被初始化为默认值 ( 0、 false 或null )。
2 ) 按照在类声明中出现的次序 , 依次执行所有域初始化语句和初始化块 。
3 ) 如果构造器第一行调用了第二个构造器, 则执行第二个构造器主体
4 ) 执行这个构造器的主体

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值