第四章 对象和类(1)

最近在学java的时候发现前边学的忘得差不多了,所以准备回过头来看看。

本文主要是霍斯特曼所著《java核心技术卷1》的代码理解。

4.1 面向对象程序设计概述

面向对象的程序是由对象组成的,每个对象包含对用户公开的特定功能和隐藏的实现部分。程序中的很多对象来着标准库,还有一些是自定义的。

传统的结构化程序设计通过设计一系列过程(算法)来求解问题,一旦确定了这些过程,就要考虑存储数据的适当格式。

面向过程 VS 面向对象

面向过程是一种以事件为中心的编程思想,编程的时候把解决问题的步骤分析出来,然后用函数把这些步骤实现,在一步一步的具体步骤中再按顺序调用函数。

在日常生活或编程中,简单的问题可以用面向过程的思路来解决,直接有效,但是当问题的规模变得更大时,用面向过程的思想是远远不够的。所以慢慢就出现了面向对象的编程思想。世界上有很多人和事物,每一个都可以看做一个对象,而每个对象都有自己的属性和行为,对象与对象之间通过方法来交互。面向对象是一种以“对象”为中心的编程思想,把要解决的问题分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个对象在整个解决问题的步骤中的属性和行为。

编程思想 优点 缺点
面向过程
  • 流程化使得编程任务明确,在开发之前基本考虑了实现方式和最终结果,具体步骤清楚,便于节点分析。
  • 效率高,面向过程强调代码的短小精悍,善于结合数据结构来开发高效率的程序。
  • 需要深入的思考,耗费精力,代码重用性低,扩展能力差,后期维护难度比较大。
面向对象
  • 结构清晰,程序是模块化和结构化,更加符合人类的思维方式;
  • 易扩展,代码重用率高,可继承,可覆盖,可以设计出低耦合的系统;
  • 易维护,系统低耦合的特点有利于减少程序的后期维护工作量。
  • 开销大,当要修改对象内部时,对象的属性不允许外部直接存取,所以要增加许多没有其他意义、只负责读或写的行为。这会为编程工作增加负担,增加运行开销,并且使程序显得臃肿。
  • 性能低,由于面向更高的逻辑抽象层,使得面向对象在实现的时候,不得不做出性能上面的牺牲,计算时间和空间存储大小都开销很大。

4.1.1 类

类(class)是构造对象的模板或蓝图,我们可以将类想象成制作小甜饼的模具,将对象想象成小甜饼。由类构造(construct)对象的过程称为创建类的实例(instance)。

4.1.2 对象

对象的三个主要特性:

对象的行为:可以对对象完成哪些操作,或者可以对对象应用哪些方法?

对象的状态:当调用哪些方法时,对象会如何响应?

对象标识:如何辨别具有相同行为与状态的不同对象?

4.1.3 类之间的关系

类之间,最常见的关系:

  • 依赖(“use-a”)
  • 聚合(“has-a”)
  • 继承(“is-a”)

4.2 使用预定义类

要想使用对象,就必须首先构造对象,并指定其初始状态,然后对对象应用方法。

4.2.1 new对象

java中,使用构造器(constructor)构造新实例,构造器是一种特殊的方法,用来构造并初始化对象。例如:标准java库中的Date类,使用new操作符构造对象。

new Date()

将对象传递给一个方法:

System.out.println(new(Date));

 或者对创建的对象应用一个方法。Date类中的toString方法。

String s = new Date().toString();

4.2.2 java类库中的LocalDate类

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.util.Date;

public class DateTest {
    public static void main(String[] args) {
        System.out.println(new Date());
        String s = new Date().toString();
        System.out.println(s);
        System.out.println(LocalDate.now());
        System.out.println(LocalDate.of(2022,9,26));
        LocalDate timenow = LocalDate.now();
        System.out.println(timenow.getYear());
        System.out.println(timenow.getMonthValue());
        System.out.println(timenow.getMonth());
        System.out.println(timenow.getDayOfMonth());
        System.out.println(timenow.getDayOfYear());
        LocalDate athounsandsdaysLater = timenow.plusDays(1000);
        System.out.println("一千天后的时间:"+athounsandsdaysLater);
        LocalDate date = LocalDate.now();
        int month = date.getMonthValue();
        int today = date.getDayOfMonth();
        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 = 1; i < value; i++)
            System.out.println("    ");
        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();


    }

}

以上代码中,LocalDate类是用日历表示法表示日期的类。

LocalDate.now()

会构造一个新对象,表示构造这个对象时的日期。同理,可以提供年、月、日来构造对应一个特定日期的对象:

LocalDate.of(1999,12,31)

当然,我们可以将其保存于一个对象变量中:

LocalDate newYearsEve = LocalDate.of(1999,12,31)

一旦有了一个LocalDate对象,便可以使用方法getYear,getMonthValue,getDayofMonth得到年月日,同时可以使用plusDays方法对日期进行增加1000天的操作。

仪式代码运行结果:

 LocalDate date = LocalDate.now();
        int month = date.getMonthValue();
        int today = date.getDayOfMonth();
        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 = 1; i < value; i++)
            System.out.println("    ");
        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();


 以上代码将显示当前月的日历,其格式为:

猜你喜欢

转载自blog.csdn.net/weixin_45985148/article/details/127159575