JavaSE 对象与类(一)
对象与类
1、面向对象程序概述
Java是完全面向对象的,必须熟悉OOP才能够编写Java程序。
概念:类class、实例(对象)instance
由类构造(construct)对象的过程称为创建类的实例(instance)。
封装 encapsulation 有时称为数据隐藏,是与对象有关的一个重要概念。
从形式上看,封装只不过是将数据和行为组合在一个包中,并对对象的使用者隐藏了数据的实现方式,
对象中的数据称为实例域(instance field),操纵数据的过程称为方法(method)。
对于每个特定的实例(对象)都有一组特定的实例域值。
这些值得集合就是这个对象的当前 状态(state)。
类之间的关系
- 依赖(
uses-a) - 聚合(
has-a) - 继承(
is-a)
应该尽可能的把相互依赖的类减至最少。术语,让类之间的耦合度最小。

2、使用预定义类
在Java程序设计语言中,使用构造器(constructor)构造一个新的实例。
构造器是一种特殊的方法,用来构造并初始化对象。
用标准Java库中包含的Data类观察结果:
import java.util.Date;
public class Test5 {
public static void main(String[] args) {
Date birthday = new Date(); // 用构造器构造一个对象
System.out.println(birthday); // Sat Oct 02 09:58:58 CST 2021
}
}

对象与对象变量
对象:可以调用方法。
对象变量:在没有引用时(未被初始化),不可以调用方法。
import java.util.Date;
public class Test5 {
public static void main(String[] args) {
Date birthday = new Date();
System.out.println(birthday); // Sat Oct 02 10:08:25 CST 2021
Date d; // 两个对象指向同一块内存区域
// d.toString(); // Error:(8, 9) java: 可能尚未初始化变量d
d = birthday;
System.out.println(d.toString()); // Sat Oct 02 10:08:25 CST 2021
}
}

一定要认识到:一个对象变量并没有实际包含一个对象,而仅仅引用一个对象。
在Java中,任何对象变量的值都是对存储在另外一个地方的一个对象的引用。
new操作符的返回值也是一个引用。
所有的Java对象都存储在堆中。
当一个对象包含另一个对象变量时,这个变量依然包含着指向另一个堆对象的指针。
在Java中,必须使用clone方法获得对象的完整拷贝。
更改器方法:访问并修改。
访问器方法:只访问,不修改。(更改器方法,访问器方法并没有明显的不同)
3、用户自定义类
在一个源文件中,只能有一个共有类,但可以有任意数目的非共有类。
源文件名必须与public类的名字相同。
// Employee类
import java.time.LocalDate;
public class Employee {
// instance field 实例域
private String name;
private double salary;
private LocalDate hireDay;
// constructor
public Employee(String n, double s, int year, int month, int day)
{
name = n;
salary = s;
hireDay = LocalDate.of(year, month, day);
}
// a method
public String getName()
{
return name;
}
public double getSalary()
{
return salary;
}
public LocalDate getHireDay()
{
return hireDay;
}
public void raiseSalary(double byPercent)
{
double raise = salary * byPercent / 100;
salary += raise;
}
}
// EmployeeTest类
public class EmployeeTest {
public static void main(String[] args) {
// fill the staff array with three Employee objects.
Employee[] staff = new Employee[3];
staff[0] = new Employee("aa", 75000, 1987, 12, 15);
staff[1] = new Employee("bb", 50000, 1989, 10, 1);
staff[2] = new Employee("cc", 40000, 1990, 3, 17);
// raise everyone's salary by 5%
for(Employee e : staff)
{
e.raiseSalary(5);
}
// print out information about all Employee objects
for(Employee e : staff)
{
System.out.println("name=" + e.getName() + ",salary=" + e.getSalary() + ", gireDay=" + e.getHireDay());
}
}
}
/*
最终输出
name=aa,salary=78750.0, gireDay=1987-12-15
name=bb,salary=52500.0, gireDay=1989-10-01
name=cc,salary=42000.0, gireDay=1990-03-17
*/
构造器总是伴随着new操作符的执行被调用,而不能对一个已经存在的对象调用构造器来达到重新设置实例域的目的。
构造器特点:
- 构造器与类同名
- 每个类可以有一个以上的构造器
- 构造器可以有0、1或者多个参数
- 构造器没有返回值
- 构造器总是伴随着
new操作一起调用
隐式参数与显式参数
隐式参数:没有出现在方法声明中。
显式参数:出现在方法声明中。
例
定义:public void raiseSalary(double byPercent)
调用:number007.raiseSalary(5)
函数有两个参数。
第一个参数称为隐式(implicit)参数,是出现在方法名前的Employee类对象。
第二个参数位于方法名后面括号中的数值,这是一个显式(explicit)参数。(有些人把隐式参数称为方法调用的目标或接收者。)
每一个方法中,关键字this表示隐式参数。如果有隐式参数的话,推荐使用this.salary代替salary,这样可以更清楚的将实例域与局部变量明显的区分开来。
注意不要编写返回引用可变对象的访问器方法,这会破坏类的封装性。
如果需要返回一个可变对象的引用,应该首先对它进行克隆(clone)。对象clone是指存放在另一个位置上的对象副本。
基于类的访问权限
一个方法可以访问所属类的所有的对象的私有数据。
class Employee
{
...
public boolean equals(Employee other) // 定义
{
return name.equals(other.name);
}
}
// 调用
if(harry.equals(boss)) ...
这个方法访问harry的私有域,并且还访问了boss的私有域。
这是合法的,其原因是boss是Employee类对象,而Employee类的方法可以访问Employee类的任何一个对象的私有域。
final实例域
确保早每一个构造器执行之后,这个域的值被设置,并且在后面的操作中,不能够对它进行修改。
final可以修饰非抽象类和非抽象类成员方法和变量
final类不能被继承,没有子类,final类中的方法默认是final的final方法不能被子类的方法覆盖,但可以被继承final成员变量表示常量,只能被赋值一次,赋值后不再改变final不能用于修饰构造方法
4、静态域与静态方法
static关键字:属于类且不属于类对象的变量和函数。
静态域:用关键字static修饰的类的成员变量。所有实例对象都共享这一块内存中的数据。
静态常量:用关键字static final修饰的类的成员变量。在被赋值后就不可以修改。
静态方法:用关键字static修饰的类的方法。不能向对象实施操作的方法,调用时应使用类名.静态方法名。
在下面两种情况下使用静态方法:
一个方法不需要访问对象状态,其所需参数都是通过显式参数提供(例如:
Math.pow)一个方法只需要访问类的静态域(例如:
Employee.getNextId)
工厂方法:将类的实例化(具体产品的创建)延迟到工厂类的子类(具体工厂)中完成,即由子类来决定应该实例化(创建)哪一个类。
main方法:静态的main方法将执行并创建程序所需要的对象。
5、方法参数
参数传递分为两种:
按值调用(call by value):表示方法接收的是调用者提供的值。
按引用调用(call by reference):表示方法接收的是调用者提供的变量地址。
Java语言总是采用按值调用。
方法得到的是所有参数值的一个拷贝,特别是,方法不能修改传递给它的任何参数变量的内容。
- 对于基本数据类型

- 对于对象引用参数

public static void tripleSalary(Employee x)
{
x.raiseSalary(200);
}
当调用
harry = new Employee(...);
tripleSalary(harry);
时,具体的执行过程为:
1)x被初始化为harry值的拷贝,这里是一个对象的引用。
2)raiseSalary 方法应用于这个对象应用。x和harry同时引用的那个Employee对象的薪金提高了200%。
3)方法结束后,参数变量x不再使用。当然,对象变量harry继续引用那个薪金增至3倍的雇员对象。
总结:Java中方法参数的使用情况
- 一个方法不能修改一个基本数据类型的参数(即数值型或布尔型)
- 一个方法可以改变一个对象参数的状态
- 一个方法不能让对象参数引用一个新的对象
JavaSE 对象与类(一)的更多相关文章
- JavaSE基础(十二)--Java 对象和类
Java 对象和类 Java作为一种面向对象语言.支持以下基本概念: 多态 继承 封装 抽象 类 对象 实例 方法 重载 本节我们重点研究对象和类的概念. 对象:对象是类的一个实例(对象不是找个女朋友 ...
- JavaSE 学习笔记02丨对象与类
Chapter 4. 对象与类 4.1 面向对象程序设计概述 面向对象程序设计(简称OOP),是当今主流程序设计范型.面向对象的程序是由对象组成的,每个对象(来自于标准库或自定义的)包含对用户公开的特 ...
- Java匹马行天下之JavaSE核心技术——工具类
Java匹马行天之JavaSE核心技术——工具类 一.Object类 java.lang.ObjectObject类是所有类直接或间接的父类 常用的方法: toString():以字符串形式返回对象的 ...
- 关于Java中的对象、类、抽象类、接口、继承之间的联系
关于Java中的对象.类.抽象类.接口.继承之间的联系: 导读: 寒假学习JavaSE基础,其中的概念属实比较多,关联性也比较大,再次将相关的知识点复习一些,并理顺其中的关系. 正文: 举个例子:如果 ...
- Java核心技术卷阅读随笔--第4章【对象与类】
对 象 与 类 4.1 面向对象程序设计概述 面向对象程序设计(简称 OOP) 是当今主流的程序设计范型, 它已经取代了 20 世纪 70 年代的" 结构化" 过程化程序设计开发技 ...
- .NET 基础 一步步 一幕幕[面向对象之对象和类]
对象和类 本篇正式进入面向对象的知识点简述: 何为对象,佛曰:一花一世界,一木一浮生,一草一天堂,一叶一如来,一砂一极乐,一方一净土,一笑一尘缘,一念一清静.可见"万物皆对象". ...
- Python-面向对象(类)二
一.成员修饰符 • 共有成员 • 私有成员 __+字段 __:成员修饰符 无法直接访问,只能通过该成员所属类的方法简介访问 class Foo: def __init__(self, name, ag ...
- Python-面向对象(类)一
一.如何创建类 class cls: pass 二.创建方法 构造方法: __init__(self, arg) obj = 类('a1') 普通方法: obj = 类('xxx') obj.普通方法 ...
- CoreJava学习笔记1-基本概念、对象和类
一. java的基本程序设计结构 (一) java共有8种基本类型:4种整型,2种浮点类型,1种char,1种boolean. 1) 4种整型:byte(1).short(2). ...
- [javaSE] 反射-Class类的使用
JAVA-Reflect 专题 ①Class类的使用 ②方法的反射 ③成员变量的反射 ④构造函数的反射 ⑤java类的加载机制 Ⅰ在面向对象的世界里,万事万物皆为对象 类是对象,类是java.lang ...
随机推荐
- Entity Framework Core 7中高效地进行批量数据插入
因为之前的版本中,EF Core无法实现高效地批量插入.修改.删除数据,所以我开发了Zack.EFCore.Batch这个开源项目,比较受大家的欢迎,获得了400多个star. 从.NET 7开始,微 ...
- 《Java口袋指南》-内容总结
Java口袋指南 一.语言 1.命名 类名:大驼峰 泛型:E标识集合元素 方法名:小驼峰 变量名:小写 包名:小写或下划线 2.词法元素/token 字符串压缩优化 ...
- 【每日一题】【优先队列、迭代器、lambda表达式】2022年1月15日-NC119 最小的K个数
描述 给定一个长度为 n 的可能有重复值的数组,找出其中不去重的最小的 k 个数.例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4(任意顺序皆可). 数据范围: ...
- 【Hive】概念、安装、数据类型、DDL、DML操作、查询操作、函数、压缩存储、分区分桶、实战Top-N、调优(fetch抓取)、执行计划
一.概念 1.介绍 基于Hadoop的数据仓库工具,将结构化数据映射为一张表,可以通过类SQL方式查询 本质:将HQL转换成MapReduce程序 Hive中具有HQL对应的MapReduce模板 存 ...
- Semaphore信号量源码解析(基于jdk11)
目录 1.Semaphore信号量源码解析(基于jdk11) 1.1 Semaphore概述 1.2 Semaphore的原理 1.2.1 基本结构(jdk11) 1.2.2 可中断获取信号量 1.2 ...
- MongoDB数据库与Python的交互
一.缘由 这是之前学习的时候写下的基础代码,包含着MongDB数据库和Python交互的基本操作. 二.代码实现 import pymongo #连接数据库 client=pymongo.MongoC ...
- MIT6.828学习笔记3(Lab3)
Lab 3: User Environments 在这个lab中我们需要创建一个用户环境(UNIX中的进程,它们的接口和实现不同),加载一个程序并运行,并使内核能够处理一些常用的中断请求. Part ...
- ChatGPT 会开源吗?
最近,我被一款叫做 ChatGPT 的人工智能(AI)聊天机器人,刷屏了.网上有人说它是搜索引擎杀手,还有人说它将取代程序员... 最后,我还是没扛住铺天盖地的赞美,跑去注册了个账号,抱着调侃&quo ...
- 软件开发目录规范、python常用内置模块
编程思想的转变 1.面条版阶段 所有的代码全部堆叠在一起.可以看成是直接将所有的数据放在C盘 视频.音频.文本.图片 2.函数版阶段 根据功能的不同封装不同的函数.可以看成是将C盘下的数 ...
- django 之swagger配置与生成接口文档
swagger好处不多说,直接上配置步骤 1.安装swagger pip install django-rest-swagger 2.将swagger配置到setting.py文件中 3.在主url. ...