第四章 对象与类 | 学习笔记(一)

学习内容:
1.面向对象程序设计
2.如何创建标准Java类库中的类对象
3.如何编写自己的类

4.1 面向对象程序设计概述

1.面向对象程序设计(简称OOP)是当今主流的程序设计泛型。
2.面向对象的程序是由对象组成的,每个对象包含对用户公开的特定功能部分和隐藏的实现部分。

1.类是构造对象的模板或蓝图。由类构造对象的过程称为创建类的实例。
2.封装(数据隐藏)从形式上看,封装不过是将数据和行为组合在一个包中,并对对象的使用隐藏了数据的实现方法。
3.对象中的数据称为实例域,操纵数据的过程称为方法。
可以通过拓展一个类来建立另一个新的类。即为继承。

  • 对象

    1.对象的三个特性:
    对象的行为——对象的行为是用可调用的方法定义的。
    对象的状态——每个对象都保存着描述当前特征的信息。
    对象标识——辨别具有相同行为和状态的不同对象。

  • 识别类

  • 类之间的关系

    依赖、聚合、继承。

4.2 使用预定义类

  • 对象与对象变量

1.想要适用对象,就必须首先构造对象,并指定其初始状态,然后,对对象应用方法。
2.构造器的名字应该与类名相同。

例如:
new Date();
System.out.println(new Date());
String s = new Date().toString();
Date birthday = new Date();

在这里插入图片描述

3.一个对象变量并没有实际包含一个对象,而仅仅引用一个对象。

  • Java类库中的LocalDate类

1.标准的Java类库包含两个类:一个是用来表示时间点的Date类,以及用来表示日历的LocalDate类。

例如:
LocalDate.now();//静态方法
LocalDate.of(1999, 12, 31);
  • 更改器方法与访问器方法
LocalDate aThousandDaysLater = newYearsEve.plusDays(1000);
//plusDays方法会生成一个新的LocalDate对象,然后把这个新对象赋给aThousandDaysLate变量。原来的对象不做任何改动。

1.另一个处理日历的GregorianCalendar类是一个更改器方法。
相反,之访问对象而不修改对象的方法称为访问器方法。

例如:
LocalDate.getYear 和 GregorianCalendar.get

java.time.LocalDate 8

static Local Time now( )
  构造一个表示当前日期的对象。
• static LocalTime of(int year, int month , int day )
  构造一个表示给定日期的对象。
• int getYear( )int getMonthValue( )int getDayOfMonth( )
  得到当前日期的年、 月和曰。
• DayOfWeek getDayOfWeek
  得到当前日期是星期几, 作为 DayOfWeek 类的一个实例返回。 调用 getValue 来得到1~ 7 之间的一个数, 表示这是星期几, 1 表示星期一, 7 表示星期日。
• Local Date piusDays(int n )
• Local Date minusDays(int n)
  生成当前日期之后或之前 n 天的日期。

4.3 用户自定义类

  • Employee类

1.在Java中,最简单的类定义形式为:

class ClassName
{
    field1
    field2
    ...
    constructor1
    constructor2
    ...
    method1
    method2
    ...
}
例如:
    class Employee
    {
        // instance fields
        private String name ;
        private double salary;
        private Local Date hireDay;
        // constructor
        public Employee(String n , double s, int year, int month , int day)
        {
            name = n;
            salary = s;
            hireDay = Local Date.of(year, month, day);
        }
        // a method
        public String getNameO
        {
            return name;
        }
        // more method
        ...
    }
创建三个雇员对象:
    Employee[] staff = new Employee[3];
    staff[0] = new Employee("Carl Cracker", . . .);
    staff[1] = new Employee("Harry Hacker", . . .);
    staff[2] = new Employee("Tony Tester", . . .);
  • 多个源文件的使用
  • 剖析Emloyee类

1.通过查看源代码会发现,这个类包含一个构造器和四个方法:

public Employee(String n , double s, int year, int month , int day)
public String getName()
public double getSalary()
public Local Date getHi reDay()
public void raiseSal ary(double byPercent)

2.这个类的所有方法都是public修饰。其意味着任何类的任何方法都可以调用这些方法。

在此类中的三个实例:
private String name;
private double salary;
private LocalDate hireDay;

3.关键词private确保只有Employee类自身的方法能够访问这些实例域,而其他类的方法不能读写这些域。
从构造器开始
先看下面的Employee类的构造器:

public Employee(String n, double s, int year, int month, int day)//构造器与类同名
{
    name = n;
    salary = s;
    LocalDate hireDay = Local Date.of(year, month, day);
}

创建实例:

new Eraployee("James Bond", 100000, 1950, 1, 1)

将会把实例域设置为:

name = "James Bond";
salary = 100000;
hireDay = LocalDate.of(1950, 1, 1); // January 1, 1950
  • 隐式参数与显式参数

1.方法用于操作对象以及存取他们的实例域。

例如:
public void raiseSalary(double byPercent)
{
    double raise = salary * byPercent / 100;
    salary += raise;
}

将调用这个方法的对象的salary实例域设置为新值。

number007.raiseSalary(5);

2.raiseSalary方法有两个参数。第一个参数称为隐式参数,是出现在方法名前的Employee类对象(salary)。
3.第二个参数位于方法名后面括号中的数值,这是显式参数(byPercent)。

  • 封装的优点
public double getSalaryO
{
    return salary;
}
public LocalDate getHireDay()
{
    return hireDay;
}
以上都是典型的访问器方法。
1.新旧数据表示之间的转换
2.更改器方法可以执行错误检查,然而直接对域进行赋值将不会进行这些处理。
  • 基于类的访问权限
  • 私有方法

1.在实现一个类时,由于公有数据十分危险,所以应该将所有的数据域都设置为私有的。(private)

  • final实例域
例如:
class Employee
{
    private final String name;
    ...
}

1.final修饰符大都应用于基本类型域、或不可变类的域。

4.4 静态域域静态方法

  • 静态域

1.如果将域定义为static,每个类中只有一个这样的域。

例如:
class Employee
{
    private static int nextld = 1;//即使没有一个雇员对象,静态域nextId也存在。并且创建的每个对象共享。
    private int id;
        ...
}
  • 静态常量
例如:在Math类中定义了一个静态常量:
public class Hath
{
    ...
    public static final double PI = 3.14159265358979323846;
    ...
}

1.在程序中,可以采用Math.PI的形式获得这个常量。
2.如果关键词static被省略,PI就变成了Math类的一个实例域。需要通过Math类的对象访问PI,并且每一个Math对象都有它自己的一份PI拷贝。

  • 静态方法

1.静态方法是一种不能向对象实施操作的方法。

例如:Math类的pow方法就是静态方法。
    Math.pow(x, a)

2.Employee类的静态方法不能访问Id实例域,因为i它不能操作对象。但静态方法可以访问自身类中的静态域。

例如:
public static int getNextld()
{
    return nextld; // returns static field
}
可以通类名调用这个方法:
    int n = Employee.getNextld();
使用静态方法的情况:
1.一个方法不需要访问对象状态,其所需的参数都是通过显式参数提供。
2.一个方法只需要访问类的静态域。
  • 工厂方法

1.使用静态工厂方法来构建对象。

例如:
NumberFormat currencyFormatter = NumberFormat.getCurrencylnstance();
NumberFormat percentFormatter = NumberFormat.getPercentlnstance();
double x = 0.1;
System.out.println(currencyFormatter.format(x))//prints $O.10
System.out.println(percentFomatter.format(x);//prints 10%
  • main方法

1.main方法也是一个静态方法。main方法不对任何对象进行操作。
2.事实上,在启动程序时还没有任何一个对象。静态的main方法将执行并创建程序所需的对象。

4.5 方法参数

值传递机制

发布了14 篇原创文章 · 获赞 23 · 访问量 573

猜你喜欢

转载自blog.csdn.net/qq_41550921/article/details/103908640