10-面向对象3

Posted liujiaqi1101

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了10-面向对象3相关的知识,希望对你有一定的参考价值。

构造器

用构造器确保初始化

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

特征

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

分类

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

注意

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

属性的赋值过程

  • 赋值的位置
    1. 默认初始化
    2. 显式初始化
    3. 构造器初始化
    4. 通过 "对象.属性" 或 "对象.方法" 的方式赋值
  • 赋值的先后顺序:① → ② → ③ → ④

JavaBean

  • JavaBean是一种Java语言写成的可重用组件
  • 所谓JavaBean,是指符合如下标准的Java类
    • 类是公共的
    • 有一个无参的公共的构造器
    • 有属性,且有对应的get、set方法
  • UML
    技术图片

this

引入

技术图片

  • 为了能用简便、面向对象的语法来编写代码,编译器做了一些幕后工作。它暗自把 "所操作对象的引用" 作为第一个参数传递给show()。所以上述两个方法调用变成了:a1.show(a1); a2.show(a2);
  • 而每个 !static方法的形参列表中都隐含一个指向当前正在调用该方法的对象形参
    技术图片

概述

  • 假设你希望在方法的内部获得对当前对象的引用。由于这个引用是编译器"偷偷"传入的,所以没有标识符可用。但是,为此有个专门的关键词:this,它是一个系统隐含的指针,被自动附加在非静态的成员方法参数列表中
  • this只能在方法内部使用,表示对 "调用方法的那个对象" 的引用;this的用法和其他对象引用并无不同
    • 注意,如果在方法内部调用同一个类的另一个方法,就不必使用this,直接调用即可。当前方法中的this引用会自动应用于同一类中的其他方法
    • 特殊情况,如果方法的形参和类的属性同名时,必须显式的使用"this.属性"的方式,表明此变量是属性,而非形参
  • this 可以调用类的属性、方法和构造器
  • this根据使用环境不同,具体可分为2种情况
    • 在成员方法中:代表调用了该方法的对象
    • 在构造器中:代表该构造器正在初始化的对象

在构造器中调用构造器

  • 可能为一个类写了多个构造器,有时可能想在一个构造器中调用另一个构造器,以避免重复代码。可用this做到这一点
  • 通常写this的时候,都是指"当前对象",而且它本身表示对当前对象的引用。在构造器中,如果为this添加了参数列表,那么就有了不同的含义。这将产生对符合此参数列表的某个构造器的明确调用(除构造器外,编译器禁止在其他任何方法中调用构造器)
  • 注意,尽管可以用this调用一个构造器,但却不能调用两个。此外,必须将构造器调用置于最起始处,否则编译器会报错

package

  • 为了更好的实现项目中类的管理,提供了"包"的概念
  • package语句作为Java源文件的第一条语句,指明该文件中定义的类所在的包
  • 包对应于文件系统的目录,package语句中,用 "." 来指明包(目录)的层次
  • 格式:package 顶层包名.子包名;
    技术图片
  • MVC设计模式
    技术图片
  • JDK中主要包介绍
    技术图片

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);





以上是关于10-面向对象3的主要内容,如果未能解决你的问题,请参考以下文章

python之路之前没搞明白4面向对象(封装)

面向面试编程代码片段之GC

JS 设计模式 (待整理)

web代码片段

PHP面向对象之选择工厂和更新工厂

Java中面向对象的三大特性之封装