Java对象和类

对象与类

面向对象程序设计概述

传统的结构化程序设计通过设计一系列的过程(即算法)来求解问题。面向对象程序设计(object-oriented programming , OOP) 将数据放在第一位 , 然后再考虑操作数据的算法 , 更加适合解决规模较大的问题 .

由类构造(construct)对象的过程称为创建类的实例。
封装(encapsulation有时称为数据隐藏)是处理对象的一个重要概念。从形式上看,封装就是将数据和行为组合在一个包中,并对对象的使用者隐藏具体的实现方式。对象中的数据称为实例字段,操作数据的过程称为方法。

OOP可以通过扩展其他类来构建新类。在扩展一个已有的类时,这个扩展后的新类具有被扩展的类的全部属性和方法。通过扩展一个类来建立另外一个类的过程称为继承。

类包含的实例字段通常属于某个类类型 .

类之间的关系

  • 依赖(uses-a)
  • 聚合(has-a)
  • 继承(is-a)

依赖:一个类的方法 使用或者操纵另一个类的对象
聚合:类A的对象包含类B的对象
继承:一个更特殊的类与一个更一般的类之间的关系

对象

对象中的数据称为实例字段 , 操作数据的过程称为方法 . 作为一个类的实例 , 特定对象都有一组特定的实例字段值 . 这些值的集合就是这个对象的当前状态 .

封装(数据隐藏 encapsulation)是处理对象的一个重要概念

对象的状态:对着中保存着的描述当前状况的信息。对象的状态并不能完全描述一个对象,对象状态的改变必须通过调用方法实现。对象的状态影响它的行为。

所有的Java对象都是在堆中构造的 .

预定义类

对象与对象变量

构造对象 :

使用构造器(或构造函数)构造新实例 : 构造器的名字应该与类名相同

1
2
3
4
5
6
7
8
9
10
11
12
//构造一个Date对象需要在构造器前面加上 new 操作符 : 
new Date();
//可以将对象放在一个变量中
//表达式 new Date()构造了一个Date类型的对象,它的值是对新创建对象的一个引用,这个引用储存在变量deadLine中
Date birthday = new Date();

//可以将这个对象传递给一个方法
System.out.println(new Date());
//也可以对刚创建的对象应用一个方法
//Date类中有一个 toString 方法,返回日期的字符串描述
String s = new Date().toString();

构造对象变量 :

1
Date deadLine;

定义了一个对象变量 deadLine , 它可以引用 Date 类型的对象 , 但变量 deadLine 不是一个对象 , 也没有引用任何对象 , 此时还不能在这个变量上使用任何 Date 方法 .

变量对象并没有实际包含一个对象 , 它只是引用一个对象 . 任何对象变量的值都是对储存在另外一个地方的某个对象的引用 .

可以显示地将对象变量设置为 null , 指示这个对象变量目前没有引用任何对象 .

必须首先初始化变量 deadLine

1
2
3
4
//可以引用一个新构造的对象
deadLine = new Date();
//可以设置这个变量让它引用一个已有的对象 :
deadLine = birthday;

更改器方法与访问器方法(待整理)

更改器方法
访问器方法:访问器方法访问器方法 (字段访问器 : 只返回实例字段值)

自定义类

Employee类

1
2
3
4
5
6
7
8
9
10
class ClassName{
//field1(字段)
//fiedl2
//...
//constructor1(构造函数)
//constructor2
//...
//method1(方法)
//method2
}

构造器(待整理)

构造器总是结合 new 运算符来调用 . 不能对一个已经存在的对象调用构造器来达到重新设置实例字段的目的 .

null引用(待整理)

一个对象变量包含一个对象的引用 , 或者包含一个特殊值null , 后者表示没有引用任何对象 .

如果对null值应用一个方法 , 会产生一个 NullPointerException (空指针)异常 .

解决办法 :

  1. 把null参数转换为一个适当的非null值

    1
    if (n--null) name = "unknown";else name = n;
  2. 拒绝null参数

    1
    2
    3
    4
    5
    6
    public Employee(String n,double s, int year,int month,int day)
    {
    Objects.requireNonNull(n,"The name cannot be null");
    name="n";
    ...
    }

隐式参数与显示参数(待整理)

隐式参数又称为方法调用的目标或者接收者

封装(待整理)

私有方法(待整理)

public : 任何类的任何方法都可以用这些方法

private : 确保只有Employee类自身的方法能够访问这些实例字段 , 而其他类的方法不能够读写这些字段 .

final实例字段(待整理)

可以将实例字段定义为final . 这样的字段必须在构造对象时初始化

final 修饰符对于基本类型或者不可变类的字段尤其有用(如果类中的所有方法都不会改变其对象 , 这样的类就是不可变的类)

final 关键字只是表示储存在 evaluations 变量中的对象引用不会再指示另一个不同的StringBuilder对象

静态字段与静态方法(待整理)

静态字段(类字段)

定义为 static 的字段 , 每个类只有一个

非静态字段(待整理)

每个对象都有自己的一个副本

静态常量(待整理)

静态方法(待整理)

不在对象上执行的方法 , 没有隐式参数 , 没有this参数的方法

工厂方法(待整理)

静态工厂方法构造对象

main(待整理)

方法参数(待整理)

对象构造

重载(待整理)

多个方法有不同的名字 , 不同的参数 , 便出现了重载 . 编译器必须挑选出具体的调用哪个方法 . 它用各个方法首部中的参数类型与特定方法调用中所使用的值类型进行匹配 , 来选出正确的方法 .

查找匹配的过程被称为重载解析 .

显式字段初始化(待整理)

默认字段初始化(待整理)

如果在构造器中中没有显式地为字段设置初值 , 会被自动地赋为默认值 : 数值为 0 , 布尔值为 false , 对象引用为 null

初始化块(待整理)

无参数的构造器(待整理)

由无参数的构造器创建对象时 , 对象的状态会设置为适当的默认值 .

有参数的构造器(待整理)

调用另一个构造器(this关键字)(待整理)

包命名

使用包的主要原因是确保类名的唯一性

类的导入

一个类可以使用所属包中的所有类 , 以及其他包中的公共类 .

1
2
3
4
5
6
//1.使用完全限定名
java.time.LocalDate today = java.time.LocalDate.new();
//2.使用 import 语句导入一个特定的类或整个包
//只能使用*导入一个包
import java.time.*;
import java.time.LocalDate;

静态导入

有一种 import 语句允许导入静态方法和静态字段

1
2
3
4
5
6
7
8
//例如在源文件顶部添加一条指令 :
import static java.lang.System.*;
//就可以使用System类的静态方法和静态字段而不必加类名前缀
out.println("Goodbye,World!");
exit(0);

//还可以导入特定的方法或字段
import static java.lang.System.out;

包访问

标记为 public 的部分可以由任意类使用 , 标记为 private 的部分只能由定义他们的类使用 . 如果没有指定 public 和 private , 这个部分(类,方法或变量) 可以被同一个包中的所有方法访问 .

JAR文件(待整理)

文档注释

javadoc 由源文件生成一个HTML文档 , 在源代码中加以特殊界定符 /** 开始的注释

每个 /**...*/ 文档注释包含标记以及之后紧跟着的自由格式文本 . 自由格式文本的第一句应该是一个概要性的句子

标记以 @ 开始

类注释

类注释必须放在 import 语句之后 , 类定义之前

方法注释

方法注释必须放在所描述的方法之前

除了通用标记外 , 还可以使用 :

这个标记将给当前方法的 “ parameters “ (参数) 部分添加一个条目 . 这个描述可以占很多行 , 并且可以使用HTML标记 . 一个方法的所有的 @param 标记必须放在一起

1
@param variable description

字段注释(待整理)

通用注释

包注释

注释抽取

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信