不可变对象和类

由不可变类创建的对象就是不可变对象,要使一个类成为不可变的,它必须满足下面的需求:

  • 所有数据域都是私有的
  • 没有修改器方法
  • 没有一个访问器的方法,它会返回一个指向可变数据域的引用

看下面的代码:

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对象的思考的更多相关文章

  1. Java对象的序列化(Object Serialization)

    先定义两个简单的类: package comm; import java.io.Serializable; import java.util.Date; import java.util.Gregor ...

  2. Java对象的创建

    学了很久的java,是时候来一波深入思考了.比如:对象是如何在JVM中创建,并且被使用的.本文主要讲解下new对象的创建过程.要想更深入的了解建议去认认真真的看几遍<深入理解Java虚拟机> ...

  3. java对象池commons-pool-1.6详解(一)

    自己的项目中用到了 对象池 commons-pool: package com.sankuai.qcs.regulation.protocol.client; import com.dianping. ...

  4. 深入学习Java对象创建的过程:类的初始化与实例化

    在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类构造器完 ...

  5. Java对象和多态

    Java对象和多态 (面向对象) 面向对象基础 面向对象程序设计(Object Oriented Programming) 对象基于类创建,类相当于一个模板,对象就是根据模板创建出来的实体(就像做月饼 ...

  6. Java对象序列化剖析

    对象序列化的目的 1)希望将Java对象持久化在文件中 2)将Java对象用于网络传输 实现方式 如果希望一个类的对象可以被序列化/反序列化,那该类必须实现java.io.Serializable接口 ...

  7. 通过JAXB完成Java对象与XML之间的转换

    Java对象转换XML的过程叫marshal. XML转换到Java对象的过程叫unmarshal. 一.Java对象转化为XML 这里省略getter和setter方法 通过标注@XMLRootEl ...

  8. json相关类库,java对象与json相互转换

    有效选择七个关于Java的JSON开源类库 转自:http://www.open-open.com/lib/view/open1397870197828.html 翻译: (英语原文:http://w ...

  9. Hibernate 系列 07 - Hibernate中Java对象的三种状态

    引导目录: Hibernate 系列教程 目录 1. Java对象的三种状态 当应用通过调用Hibernate API与框架发生交互时,需要从持久化的角度关注应用对象的生命周期. 持久化声明周期是Hi ...

随机推荐

  1. java信号量PV操作 解决生产者-消费者问题

    package test1; /** * 该例子演示生产者和消费者的问题(设只有一个缓存空间.一个消费者和一个生产者) * MySystem类定义了缓冲区个数以及信号量 * @author HYY * ...

  2. Android:控件的对象修改控件的值

    TextView private TextView textView; ... textView =(TextView)findViewById(R.id.textView); textView.se ...

  3. MYSQL 优化建议

    转自 http://coolshell.cn/articles/1846.html MYSQL 优化建议20条 1. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效 ...

  4. Java读写Windows共享文件夹 .

    版权声明:本文为博主原创文章,未经博主允许不得转载. 项目常常需要有访问共享文件夹的需求,例如共享文件夹存储照片.文件等.那么如何使用Java读写Windows共享文件夹呢? Java可以使用JCIF ...

  5. Django QuerySet API文档

    在查询时发生了什么(When QuerySets are evaluated) QuerySet 可以被构造,过滤,切片,做为参数传递,这些行为都不会对数据库进行操作.只要你查询的时候才真正的操作数据 ...

  6. allegro飞线隐藏

    这些都是最基本的操作,你说的应该是飞线的显示和隐藏,命令在display下面,display>show rats>net(component/all) display>blank r ...

  7. WinAPI—— CallNextHookEx调用下一个钩子

    CallNextHookEx(   hhk: HHOOK;    {当前钩子的句柄}   nCode: Integer; {钩子代码; 就是给下一个钩子要交待的}   wParam: WPARAM; ...

  8. 三个入侵的必备小工具-lcx.exe、nc.exe、sc.exe

      lcx.exe的使用方法 以前抓肉鸡都是通过1433弱口令,然后.. 但是发现很多服务器开了1433,3389,但是终端是连不上的,因为服务器本身是在内网,只对外开放了1433端口,幸好有lcx. ...

  9. poj 1753 Flip Game 枚举(bfs+状态压缩)

    题目:http://poj.org/problem?id=1753 因为粗心错了好多次……,尤其是把1<<15当成了65535: 参考博客:http://www.cnblogs.com/k ...

  10. [转]Linux下Nagios的安装与配置

    转自:http://blog.chinaunix.net/uid-29539073-id-4149856.html 月色书香 一.Nagios简介 Nagios是一款开源的电脑系统和网络监视工具,能有 ...