10-面向对象3

1. 构造器

1.1 用构造器确保初始化

  • 可以假想为编写的每一个类都定义一个 initialize() 方法
    • 该方法的名称提醒你在使用其对象之前,应首先调用 initialize()。然而,这同时意味着用户必须记得自己去调用此方法
    • 在 Java 中,通过给定【构造器】,类的设计者可确保每个对象都会得到初始化
    • 创建对象时,如果其类具有构造器,Java 就会在用户有能力操作对象之前自动调用相应的构造器,从而确保了初始化的进行。
  • 如何命名这个方法?
    • Q1:所取得任何名字都可能与类的某个成员名称相冲突;Q2:调用构造器是编译器的责任,所以必须让编译器知道应该调用哪个方法
    • 解决方法:构造器采用与类相同的名称
  • 如何使用构造器?
    • 老早就已经开始使用了,如:Person p = new Person(); 该语句会为对象分配存储空间[new],并调用相应的构造器[Person()]。这就确保了你在能操作对象之前,它已经被恰当地初始化了。
    • 从概念上讲,"初始化" 和 "创建" 是彼此独立的,但在 Java 中,"初始化"和"创建"捆绑在一起,两者不能分离
    • 构造器是一种特殊类型的方法,因为它没有返回值,这与返回值为 void 明显不同;构造器不会返回任何东西 (new 表达式确实返回了对新建对象的引用,但构造器本身并没有任何返回值)

1.2 特征

  • 它具有与类相同的名称
  • 它不声明返回值类型(与声明为void不同)
  • 可以有参数,也可以没有参数
  • 不能有return _____;

1.3 分类

  • 不接受任何参数的构造器叫做【默认构造器(无参构造器)】
    • 如果没有给出构造方法,则编译器会自动帮你创建一个默认构造器
    • public Person() {}
  • 但和其他方法一样,构造器也能带有形式参数,以便指定如何创建对象
    • 如果已经定义了一个或多个构造器(无论是否有参数),编译器就不会帮你自动创建默认构造器
    • public Person(String name, int age) {...}
    • public Person(String name) {...}
    • public Person(int age) {...}
    • public Person() {...}

1.4 注意

  • Java 语言中,每个类都至少有一个构造器
  • 默认构造器的修饰符 与 所属类的修饰符 一致
  • 一个类可以创建多个重载的构造器
  • 定义一个有返回值且方法名与类名同名的方法是 OK 的,程序不会报错。

2. 属性的赋值过程

赋值的位置:

  1. 默认初始化
  2. 显式初始化
  3. 构造器初始化
  4. 通过 "对象.属性" 或 "对象.方法" 的方式赋值

赋值的先后顺序:① → ② → ③ → ④

3. JavaBean

JavaBean 是一种 Java 语言写成的可重用组件,所谓 JavaBean,是指符合如下标准的 Java 类:

  • 类是公共的
  • 有一个无参的公共的构造器
  • 有属性,且有对应的 get、set 方法

统一建模语言(Unified Modeling Language, UML)

4. this

4.1 引入

为了能用简便、面向对象的语法来编写代码,编译器做了一些幕后工作。它暗自把 “所操作对象的引用” 作为第一个参数传递给 show()。所以上述两个方法调用变成了:a1.show(a1); a2.show(a2);

每个 !static 方法的形参列表中都隐含一个指向当前正在调用该方法的对象形参

4.2 概述

假设你希望在方法的内部获得对当前对象的引用。由于这个引用是编译器“偷偷”传入的,所以没有标识符可用。但是,为此有个专门的关键词:this,它是一个系统隐含的指针,被自动附加在非静态的成员方法参数列表中

this 只能在方法内部使用,表示对“调用方法的那个对象”的引用;this 的用法和其他对象引用并无不同。注意,如果在方法内部调用同一个类的另一个方法,就不必使用 this,直接调用即可。当前方法中的 this 引用会自动应用于同一类中的其他方法

特殊情况,如果方法的形参和类的属性同名时,必须显式的使用“this.属性”的方式,表明此变量是属性,而非形参。

this 可以调用类的属性、方法和构造器。根据使用环境不同,具体可分为 2 种情况:

  • 在成员方法中:代表调用了该方法的对象
  • 在构造器中:代表该构造器正在初始化的对象

4.3 在构造器中调用构造器

可能为一个类写了多个构造器,有时可能想在一个构造器中调用另一个构造器,以避免重复代码。可用 this 做到这一点。

通常写 this 的时候,都是指“当前对象”,而且它本身表示对当前对象的引用。在构造器中,如果为 this 添加了参数列表,那么就有了不同的含义。这将产生对符合此参数列表的某个构造器的明确调用(除构造器外,编译器禁止在其他任何方法中调用构造器)

注意,尽管可以用 this 调用一个构造器,但却不能调用两个。此外,必须将构造器调用置于最起始处,否则编译器会报错。

5. package

  • 为了更好的实现项目中类的管理,提供了“包”的概念
  • package 语句作为 Java 源文件的第一条语句,指明该文件中定义的类所在的包
  • 包对应于文件系统的目录,package 语句中,用“.”来指明包(目录)的层次
  • 格式:package 顶层包名.子包名;

MVC 设计模式

JDK 中主要包介绍:

6. import

  • 为使用定义在不同包中的 Java 类,需用 import 语句来引入指定包层次下所需要的类或全部类(.*) // import 语句告诉编译器到哪里去寻找类
  • 语法格式:import 包名.类名;
  • 应用举例
    • import java.util.*;
    • import cn.edu.nuist.test.Demo;
  • 如果导入的类或接口是 java.lang 包下的,或者是当前包下的,则可以省略此 import 语句
  • 如果在代码中使用不同包下的同名的类,那么至少有一个类需要使用类的全类名的方式指明调用的是哪个类
    • import java.util.*; ... Date date = new Date();
    • java.sql.Date date1 = new java.sql.Date(1064603372);
  • 已经默认导入 java.lang 包下的类,那么如果还需要使用 lang 包下的子包中的类的话,仍然需要导入
  • import static 组合的使用:调用指定类或接口下的静态的属性或方法(注意!落脚点是类中的结构)
    • import static java.lang.System.*; ... [System.(省略)] out.println("Hello");
    • import static java.lang.Math.*; ... [Math.(省略)] round(10.24);
原文地址:https://www.cnblogs.com/liujiaqi1101/p/12997016.html