关于java对象的思考
不可变对象和类
由不可变类创建的对象就是不可变对象,要使一个类成为不可变的,它必须满足下面的需求:
- 所有数据域都是私有的
- 没有修改器方法
- 没有一个访问器的方法,它会返回一个指向可变数据域的引用
看下面的代码:
public class Main
{
public static void main(String args[])
{
Student student = new Student(11222333, "John");
java.util.Date dateCreatedDate = student.getDateCreated();
dateCreatedDate.setTime(200000);
}
}
class Student {
private int id;
private String name;
private java.util.Date dateCreated; public Student(int ssn, String newName){ //构造函数
id = ssn;
name = newName;
dateCreated = new java.util.Date();
} public int getId() {
return id;
}
public String getName() {
return name;
}
public java.util.Date getDateCreated() {
return dateCreated;
}
}
变量的作用域
一个类的实例变量和静态变量称为类变量或数据域。在方法内部定义的变量称为局部变量。类的变量和方法可以在类中以任意顺序出现
public class Main
{
public static void main(String args[])
{
Foo f = new Foo();
f.p();
}
}
class Foo {
private int x = 0;
private int y = 0;
public Foo() { }
public void p() {
int x = 1;
System.out.println("x = " + x);
System.out.println("y = " + y);
}
}
运行结果:
x = 1
y = 0
this引用
关键字this是指向调用对象本身的引用名,一种常见的用法就是引用类的隐藏数据域。
class Foo {
int i = 0;
static double k = 0;
void setTime(int i) {
this.i = i;
}
static void setK(double k) {
Foo.k = k;
}
}
另一种常见方法是让构造方法调用同一个类的另一个构造方法:
class Circle {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
public Circle() {
this(1.0);
}
public double getArea() {
return this.radius * this.radius * Math.PI;
}
}
类的抽象和封装
类抽象是将类的实现和使用分离,从类外可以访问的全部方法和数据域,以及期望这些成员如何行动的描述合称为类的合约
实例:
public class Main
{
public static void main(String args[])
{
Scanner input = new Scanner(System.in);
System.out.print("Enter yearly interest rate, for example, 8.25: ");
double annualInterestRate = input.nextDouble();
System.out.print("Enter number of years as an integer: ");
int numberOfYear = input.nextInt();
System.out.print("Enter loan amount, for example, 1200000.95: ");
double loanAmount = input.nextDouble();
Loan loan = new Loan(annualInterestRate, numberOfYear, loanAmount); System.out.printf("The loan was created on %s\n" +
"The monthly payment is %.2f\nThe total payment is %.2f\n",
loan.getLoanDate().toString(), loan.getMonthlyPayment(),
loan.getTotalPayment());
}
} class Loan {
private double annualInterestRate;
private int numberOfYears;
private double loanAmount;
private java.util.Date loanDate; public Loan() {
this(2.5, 1, 10000);
}
public Loan(double annualInterestRate, int numberOfYears,
double loanAmount) {
this.annualInterestRate = annualInterestRate;
this.numberOfYears = numberOfYears;
this.loanAmount = loanAmount;
loanDate = new java.util.Date();
}
public double getAnnualInterestRate() {
return annualInterestRate;
}
public void setAnnualInterestRate(double annualInterestRate) {
this.annualInterestRate = annualInterestRate;
}
public int getNumberOfYear() {
return numberOfYears;
}
public void setNumberOfYear(int numberOfYears) {
this.numberOfYears = numberOfYears;
}
public double getLoanAmount() {
return loanAmount;
}
public void setLoanAmount(double loanAmount) {
this.loanAmount = loanAmount;
} public double getMonthlyPayment() {
double monthlyInterestRate = annualInterestRate / 1200;
double monthlyPayment = loanAmount * monthlyInterestRate / (1 -
(Math.pow((1 / (1 +monthlyInterestRate)), numberOfYears * 12)));
return monthlyPayment;
}
public double getTotalPayment() {
double totalPayment = getMonthlyPayment() * numberOfYears * 12;
return totalPayment;
}
public java.util.Date getLoanDate() {
return loanDate;
}
}
类的设计原则
1、内聚性
类应该描述一个单一的实体,而所有的类操作应该在逻辑上互相配合,支持一个连贯性的目标
如果一个实体担负太多的职责,就应该按各自的职责分成几个类。例如:String类、StringBuffer类、StringBuilder类
2、一致性
遵循标准java程序设计风格和命名习惯。给类、数据域和方法选择有信息量的名字,选择名字要保持一致。
应该为类提供一个为构造默认实例的公共无参构造函数,如果不想让用户创建类的对象,可以在类中声明一个私有的构造方法。例如:Math类
3、封装性
使用private修饰符隐藏其数据,以免用户直接访问它,更易于维护。
如果想让数据域可读,只需提供get方法。如果想让数据域可更新,应该提供set方法
4、完整性
为了能在一个广泛的应用中使用,一个类应该通过属性和方法提供多种方案以适应用户的不同需求
例如:String提供了40多种很实用的方法
关于java对象的思考的更多相关文章
- Java对象的序列化(Object Serialization)
先定义两个简单的类: package comm; import java.io.Serializable; import java.util.Date; import java.util.Gregor ...
- Java对象的创建
学了很久的java,是时候来一波深入思考了.比如:对象是如何在JVM中创建,并且被使用的.本文主要讲解下new对象的创建过程.要想更深入的了解建议去认认真真的看几遍<深入理解Java虚拟机> ...
- java对象池commons-pool-1.6详解(一)
自己的项目中用到了 对象池 commons-pool: package com.sankuai.qcs.regulation.protocol.client; import com.dianping. ...
- 深入学习Java对象创建的过程:类的初始化与实例化
在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类构造器完 ...
- Java对象和多态
Java对象和多态 (面向对象) 面向对象基础 面向对象程序设计(Object Oriented Programming) 对象基于类创建,类相当于一个模板,对象就是根据模板创建出来的实体(就像做月饼 ...
- Java对象序列化剖析
对象序列化的目的 1)希望将Java对象持久化在文件中 2)将Java对象用于网络传输 实现方式 如果希望一个类的对象可以被序列化/反序列化,那该类必须实现java.io.Serializable接口 ...
- 通过JAXB完成Java对象与XML之间的转换
Java对象转换XML的过程叫marshal. XML转换到Java对象的过程叫unmarshal. 一.Java对象转化为XML 这里省略getter和setter方法 通过标注@XMLRootEl ...
- json相关类库,java对象与json相互转换
有效选择七个关于Java的JSON开源类库 转自:http://www.open-open.com/lib/view/open1397870197828.html 翻译: (英语原文:http://w ...
- Hibernate 系列 07 - Hibernate中Java对象的三种状态
引导目录: Hibernate 系列教程 目录 1. Java对象的三种状态 当应用通过调用Hibernate API与框架发生交互时,需要从持久化的角度关注应用对象的生命周期. 持久化声明周期是Hi ...
随机推荐
- easyui 使特定tab处于选中状态
<div id="tabs" class="easyui-tabs"> <div title="Tab1" style=& ...
- PAT-乙级-1019. 数字黑洞 (20)
1019. 数字黑洞 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 给定任一个各位数字不完全相同的4位 ...
- spoj 2178
好水...... #include<cstdio> #include<cstdlib> #include<cstring> #include<algorith ...
- jmeter 一个可能引起性能严重下降的断言设置
在添加断言时一定要注意: 1. 红框部分选择 "响应文本", 2. 要断言的内容越短越好
- 【疯狂Java学习笔记】【第一章:Java语言概述】
[学习笔记]1.Java与C#的异同:Java与C#的相同之处有很多,它们均摒弃了C++面向对象的多继承.宏定义.全局变量.全局函数.指针等等难以使用的机制,添加进了成熟的机制,如垃圾回收.接口等等. ...
- [主席树]HDOJ4417 Super Mario
题意:n个数 m个询问 ($n.m \le 10^5$) 每个询问有l, r, k 问的是[l, r]区间内有多少个数小于等于k 用主席树做的话查询第i小的数与k比较即可 #define lson ...
- codeforces #310 div1 E
算得上是比较水的E题了吧,自己想了想写了写居然1A了 对于这道题,我们很容易想到对于原图的一个边双,定向后任意两点间一定可达 那么我们可以求出原图的边双并将每个边双缩成一个点 那么原图就变成了无环的无 ...
- cocos2d-x 常规库的图文件配置
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS) LOCAL_MODULE := cocos_lua_static LOCAL_MODULE_FILE ...
- Servlet课程0426(九)Servlet服务器端创建Cookie和客户端读取Cookie
服务器端创建Cookie: Win7默认Cookie位置 C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Cookies Cookie ...
- 在服务器端使用 Git 创建源代码仓库
下面简单讲述在服务器搭建 Git 仓库的过程. 安装 Git 程序 Git 是分布式的,即程序不区分服务端和客户端,大部分 Linux 发行版的官方源里都有它,比如在 Archlinux 里安装 Gi ...