第四章对象与类

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
权限修饰符:

本类同一个包下不同包下的子类不同包下的无关类
publicYYYY
protectedYYY
默认(default)YY
privateY

jar文件:在将应用程序打包时,只向用户提供一个单独的文件,而不是包含大量的类文件的目录结构,
Java归档(JAR)文件就是为此目的而设计。

6.类设计技巧
6.1一定要保证数据私有
6.2一定要对数据进行初始化
6.3不要在类中使用过多的基本类型
6.4不是所有的字段都需要单独的字段访问器和字段更改器(get,set)
6.5分解有过多职责的类
6.6类名和方法名要见名知意
6.7优先使用不可变的类

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值