1.概述
面对对象程序设计(object-oriented programmiing,OOP)
1.1 类
是构造对象的模板。由类构造 (construct) 对象的过程称为创建类的实例 (instance) 。
封装是处理对象的一个重要概率,就是把数据和行为组合在一个包里。(隐藏数据)
对象中的数据称为实例字段(instance field)
操作数据的过程称为方法(method)
某个对象的实力字段值的集合就是这个对象的当前状态(state)
1.2对象的三个主要特性
对象的行为:可以对对象完成哪些操作,或者对对象应用哪些方法?
对象的状态:当调用那些方法时,对象会如何响应?
对象标识:如何区分具有相同行为与状态的不同对象?
1.3类之间的关系:
依赖(“uses-a”)、聚合(“has-a”)、继承(“is-a”)
2.预定义类与自定义类
预定义类可以直接调用它的方法,如Math.random
要想构造一个预定义类的对象,需要加new操作符,如果要对该对象应用一个方法,如:
String s = new Date().toString();
预定义类实例:
package com.Test;
import java.time.DayOfWeek;
import java.time.LocalDate;
/**
* @Author xcf
* @Company
* 利用LocalDAte类编写一个简单的日历程序
*/
public class CalendarTest {
public static void main(String[] args) {
//构造LocalDate对象,并进行初始化
LocalDate date = LocalDate.now();
//获得当前的月份和日期
int month = date.getMonthValue();
int today = date.getDayOfMonth();
//将date设置为这个月的第一天,并得到这一天为星期几
date = date.minusDays(today-1);
DayOfWeek weekday = date.getDayOfWeek();
int value = weekday.getValue();
//打印日历头部,并打印第一行缩进
System.out.println("Mon Tue Wed Thu Fri Sat Sun");
for (int i = 0; i < value; i++) {
System.out.print(" ");
}
while (date.getMonthValue() == month){
System.out.printf("%3d", date.getDayOfMonth());
if (date.getDayOfMonth() == today){
System.out.print("*");
}else {
System.out.print(" ");
}
date = date.plusDays(1);
if (date.getDayOfWeek().getValue() == 1){
System.out.println("");
}
}
if (date.getDayOfWeek().getValue() != 1){
System.out.println("");
}
}
}
final实例字段:被final修饰的字段必须在构造对象时初始化,且以后不能再修改这个字段。
3.静态字段与静态方法
3.1只想用一个存储区域来保存一个特定的数据——无论要创建多少个对象,甚至根本不创建对象。
3.2我们需要一个特殊的方法,它没有与这个类的任何对象关联。也就是说,即使没有创建对象,也需要一个能调用的方法。
3.3静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的
4.方法参数与对象构造
java语言总是采用按值调用。方法不能修改传递给他的任何参数变量的内容。
java语言对对象采用的不是按引用调用,实际上,对象引用是按值传递的。
实例:
package com.Test;
/**
* @Author xcf
* @Company
* 这个程序演示了java中的参数传递
*/
public class ParamTest {
public static void main(String[] args) {
//测试1,方法无法修改数值参数
System.out.println("tripleValue:");
double percent = 10;
System.out.println("调用前percent ="+percent);//percent = 10.0
tripleValue(percent);
System.out.println("调用后percent ="+percent);//percent = 10.0
//测试2,方法可以改变对象参数的状态
System.out.println("\ntripleSalary:");
Employee2 harry = new Employee2("Harry",50000);
System.out.println("调用前salary ="+harry.getSalary());//salary =50000.0;
tripleSalary(harry);
System.out.println("调用后salary ="+harry.getSalary());//salary =150000.0;
//测试3,方法无法将新对象附加到对象参数
System.out.println("\nswap:");
Employee2 a = new Employee2("Alice",7000);
Employee2 b = new Employee2("Bob",6000);
System.out.println("调用前a ="+a.getName());//a =Alice
System.out.println("调用前b ="+b.getName());//b =Bob
swap(a,b);
System.out.println("调用后a ="+a.getName());//a =Alice
System.out.println("调用后b ="+b.getName());//b =Bob
}
public static void tripleValue(double x){
x = 3* x;
System.out.println("End of method:x =" + x);
}
public static void tripleSalary(Employee2 x){
x.raiseSalary(200);
System.out.println("End of method:salary =" + x.getSalary());
}
public static void swap(Employee2 x,Employee2 y){
Employee2 temp = x;
x = y;
y =temp;
System.out.println("End of method:x =" + x.getName());
System.out.println("End of method:y =" + y.getName());
}
}
class Employee2
{
private String name;
private double salary;
public Employee2(String name, double salary) {
this.name = name;
this.salary = salary;
}
public String getName() {
return name;
}
public double getSalary() {
return salary;
}
public void raiseSalary(double byPercent){
double raise =salary * byPercent / 100;
salary += raise;
}
}
5.包与jar文件
在一个java文件中,只能有一个package
类的“完全限定”名如:com.horstmann.corejava.Employee
类的导入:import;静态导入 import static
权限修饰符:
本类 | 同一个包下 | 不同包下的子类 | 不同包下的无关类 | |
---|---|---|---|---|
public | Y | Y | Y | Y |
protected | Y | Y | Y | |
默认(default) | Y | Y | ||
private | Y |
jar文件:在将应用程序打包时,只向用户提供一个单独的文件,而不是包含大量的类文件的目录结构,
Java归档(JAR)文件就是为此目的而设计。
6.类设计技巧
6.1一定要保证数据私有
6.2一定要对数据进行初始化
6.3不要在类中使用过多的基本类型
6.4不是所有的字段都需要单独的字段访问器和字段更改器(get,set)
6.5分解有过多职责的类
6.6类名和方法名要见名知意
6.7优先使用不可变的类