《Java核心技术》复习笔记 - 第四章 对象与类

本文深入探讨了Java中对象与类的基本概念,包括类、数据域、方法、封装等核心内容,并介绍了类之间的关系,如依赖、聚合和继承。此外还讲解了构造器的作用与使用方法,以及如何正确编写返回对象的访问器方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java核心技术》复习笔记 第四章 对象与类

1. 基本概念:类,数据域,方法,封装,对象

2. 类之间的关系:依赖(uses-a),聚合(has-a),继承(is-a)。一个类的方法操纵另一个类的对象,我们就说一个类依赖于另一个类。

3. 注意区别对象和对象变量,对象是存储在堆上的,对象变量在栈上分配空间,存储的是堆上对象的地址,对象变量就是对象引用,类似C++中的指针变量(指向对象的指针)。

4. 构造器:构造器与类同名,每个类可以有一个以上的构造器,构造器可以有0个,1个或1个以上的参数,构造器没有返回值,构造器总是伴随着new操作一起调用。

5. 不要编写返回引用可变对象的访问器方法,如返回一个员工的入职日期hireDate,不能直接返回数据域,这样会被外部非法修改。如果需要返回一个可变对象的引用,应该首先对它进行克隆clone

6. 基于类的访问权限:一个方法可以访问所属类的所有对象的私有数据,C++也有同样的原则。

7. 类似C++中的const成员变量,可以将实例域定义为final,构建对象时必须初始化这样的域。final一般用于修饰基本数据类型域或不可变类(如果一个类中的所有方法都不改变其对象,这种类就是不可变类)的域。final修饰引用变量时,是说该引用变量初始化后不能指向其它对象,类似C++中的常指针,而其引用的对象还是可以被修改的

8. 静态域又称类域,每个类只有一个这样的域。静态常量 static final也和C++类似。静态方法就是没有this参数的方法。

9. Java中的参数传递总是采用值调用。对象引用进行的也是值传递,传递的是对象的地址。引用类似C++中的对象指针,但是不需要进行解引用操作。

10. 类似C++java中的方法也是可以重载overloading的,返回类型不是方法签名的一部分。

11. 默认域初始化:如果在构造器中没有显示的给域赋予初值,那么会被默认的赋值为默认值:数值为0,布尔值为false,对象引用为null

12. 默认构造器:没有参数的构造器。如果编写类时,没有提供构造器,编译器会提供一个默认构造器将所有实例域设置为默认值。

13. 显示的进行域初始化:如private String name = “”;在执行构造器之前,先执行该赋值操作。当一个类的所有构造器都希望相同的值赋予某个特定的实例域时,这种方式特别有用。

14. 在一个构造器中调用(第一行语句)另一个构造器用this(),这样公共的构造器代码部分只需要编写一次即可,而在C++中,必须将抽取出的公共初始化代码编写成一个独立的方法。

15. 初始化块是用{}包围的初始化语句,在构造器主体代码之前运行。

16. 调用构造器的具体处理步骤:

1) 所有数据域被初始化为默认值(0falsenull)。

2) 按照在类声明中的出现次序,依次执行所有域初始化语句和初始化块。

3) 如果构造器第一行调用了第二个构造器,则执行第二个构造器主体。

4) 执行这个构造器的主体。

import java.util.*;

/**
 * This program demonstrates object construction.
 * @version 1.01 2004-02-19
 * @author Cay Horstmann
 */
public class ConstructorTest
{
   public static void main(String[] args)
   {
      // fill the staff array with three Employee objects
      Employee[] staff = new Employee[3];

      staff[0] = new Employee("Harry", 40000);
      staff[1] = new Employee(60000);
      staff[2] = new Employee();

      // print out information about all Employee objects
      for (Employee e : staff)
         System.out.println("name=" + e.getName() + ",id=" + e.getId() + ",salary="
               + e.getSalary());
   }
}

class Employee
{
   // three overloaded constructors
   public Employee(String n, double s)
   {
      name = n;
      salary = s;
   }

   public Employee(double s)
   {
      // calls the Employee(String, double) constructor
      this("Employee #" + nextId, s);
   }

   // the default constructor
   public Employee()
   {
      // name initialized to ""--see below
      // salary not explicitly set--initialized to 0
      // id initialized in initialization block
   }

   public String getName()
   {
      return name;
   }

   public double getSalary()
   {
      return salary;
   }

   public int getId()
   {
      return id;
   }

   private static int nextId;

   private int id;
   private String name = ""; // instance field initialization
   private double salary;

   // static initialization block
   static
   {
      Random generator = new Random();
      // set nextId to a random number between 0 and 9999
      nextId = generator.nextInt(10000);
   }

   // object initialization block
   {
      id = nextId;
      nextId++;
   }
}
17. 在类第一次加载时,将会进行静态域的初始化。与实例域一样,除非将它们显示地设置成指定值,否则默认的初始化值为0falsenull。所有静态初始化语句以及静态初始化块按照类定义中的顺序执行。

18. 一个源文件中只能有一个public类,可以有任意数目的非public类,文件名和public类一致。

19. 静态导入:导入静态方法和静态域。

20. 如果没有在源文件中使用package语句,则源文件置于默认包中,默认包为一个没有名字的包。

21. 包作用域:如果没有指定访问修饰符publicprotected,或private,则这个部分(类,方法或变量)可以被同一个包中的所有方法访问。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值