99

0x00 前言

本周学习java核心技术卷1基础知识原版第10版第四章-对象与类
这两周浪费了好多时间,都没怎么学,虽然学习压力大,但是还是要好好学习。

0x01 面向对象程序设计概述

个人理解,java中的类和其他语言中的函数类似,只允许用户调用函数或者类下的方法,不允许直接修改函数或者类,提高了安全性。

0x02 使用预定义类

对象与对象变量

对象变量如果赋值null,那么此对象变量的指针指向了null。

import java.util.Date;
public class date {
public static void main(String[] args){
//实例化(构造)一个新类,使用Date下的方法,必须实例化(构造)
System.out.println(new Date());//Wed Aug 07 23:27:00 CST 2019

String s = new Date().toString();
System.out.println(s);//Wed Aug 07 23:32:09 CST 2019

//此代码等同于上述代码,构造一个新的类并且赋值给一个变量,后面可直接使用变量.方法来使用Date类中所有的方法
Date barthday = new Date();//引用新构造的对象变量barthday
String b = barthday.toString();
System.out.println(b);//Wed Aug 07 23:32:46 CST 2019

//错误用法
//Date barth;
//String d = barth.toString();//未构造方法,无法使用Date类中的方法

//正确用法
//Date barth = new Date();
//或者
Date barth = barthday;//引用已存在的对象
}
}

java类库中的LocalDate类

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

public class localdate {
public static void main(String[] args){
//自定义特殊时间
LocalDate time = LocalDate.of(2019 , 8 , 7);
System.out.println(time);//2019-08-07

int year = time.getYear();//年
int month = time.getDayOfMonth()+1;//月
int day = time.getDayOfMonth();//日
System.out.println(year);
System.out.println(month);
System.out.println(day);

//增加天数,赋给days,days根据当前时间+1000计算。
LocalDate days = time.plusDays(1000);
year = days.getYear();
month = days.getMonthValue();
day = days.getDayOfMonth();
System.out.println(year);//2022
System.out.println(month);//5
System.out.println(day);//3
}
}

更改器方法与访问器方法

import jdk.swing.interop.SwingInterOpUtils;

import java.time.LocalDate;
import java.util.Calendar;
import java.util.GregorianCalendar;

public class plusdate {
public static void main(String[] args){
LocalDate time = LocalDate.of(2019 , 8 , 7);
LocalDate days = time.plusDays(1000);//此方法是将当前时间+1000后赋给新变量,原变量不变

//老版增加天数写法,使用此方法后,变量会改变
GregorianCalendar some = new GregorianCalendar(2019 , 8 , 8);
some.add(Calendar.DAY_OF_MONTH , 1000);
int year = some.get(Calendar.YEAR);//年
int month = some.get(Calendar.MONTH) + 1;//月
int day = some.get(Calendar.DAY_OF_MONTH);//日
System.out.println(year);
System.out.println(month);
System.out.println(day);
}
}

日历程序小栗子
代码有点绕,看的我有点懵,所以暂时不写注释了。。

import java.time.DayOfWeek;
import java.time.LocalDate;

public class datelizi {
public static void main(String[] args){
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++){//月份从1开始,1小于当前月份
System.out.println(" ");
}
while (date.getMonthValue() == month){
System.out.printf("%3d" , date.getDayOfMonth());
if (date.getDayOfMonth() == today){
System.out.println("*");
}else {
System.out.println(" ");
}
date = date.plusDays(1);
if (date.getDayOfWeek().getValue() == 1){
System.out.println();
}
}
if (date.getDayOfWeek().getValue() != 1){
System.out.println();
}
}
}

0x03 用户自定义类

Employee类

增加雇员薪水小程序

import java.time.*;
public class EmployeeTest{
public static void main(String args){
Employee[] staff = new Employee[3];//定义三个成员

//写入三个成员的个人信息
staff[0] = new Employee("carl Cracker" , 75000 , 1987 , 12 , 15);
staff[1] = new Employee("Harry Hacker" , 50000 , 1989 , 10 , 1);
staff[2] = new Employee("Tony Tester" , 40000 , 1990 , 3 , 15);

//将成员的薪水提高5%
for (Employee e : staff){
e.raiseSalary(5);
}

//遍历输出成员薪水增加后的信息
for (Employee e:staff){
System.out.println("name=" + e.getName() + ", salary=" + e.getSalary() + ", hireDay=" + e.getHireDay());
}
}
}
class Employee{
private String name;//定义字符串类型(名字)
private double salary;//浮点型数值(薪水)
private LocalDate hireDay;//时间类型(出生年月日)

//封装一个类,接收传输过来的数值,放入类中处理
public Employee(String n , double s, int year, int month, int day){
name = n;
salary = s;
hireDay = LocalDate.of(year , month , day);
}


public String getName(){
return name;
}

public double getSalary(){
return salary;
}

public LocalDate getHireDay(){
return hireDay;
}

//接收传递过来的参数值,并进行运算后弹出运算结果
public void raiseSalary(double byPercent){
double raise = salary * byPercent / 100;
salary += raise;
}
}

剖析Employee类

public 公共的,任何类或方法都可以调用这些方法

public Employee(String n , double s, int year, int month, int day)
public String getName()
public double getSalary()
public LocalDate getHireDay()
public void raiseSalary(double byPercent)

private 私有的,只有类里面的方法才可以调用,其他类方法禁止调用

private String name;
private double salary;
private LocalDate hireDay;

从构造器开始

//封装类
public Employee(String n , double s, int year, int month, int day){
name = n;
salary = s;
hireDay = LocalDate.of(year , month , day);
}

//实例化Employee
new Employee("carl Cracker" , 75000 , 1987 , 12 , 15);

//上述实例化后,会把写入的内容放入实例域中
name = "carl Cracker"
salary = 75000
hireDay = LocalDate.of(1987, 12, 15)

构造器一般跟随new使用,无法对已经设置过的实例域重新赋值

隐式参数与显式参数

//将参数带入此方法中,运算后返回结果
public void raiseSalary(double byPercent){
double raise = salary * byPercent / 100;
salary += raise;
}
//调用上述方法的对象,传入参数5
e.raiseSalary(5);
//运算,员工本来薪水*传入的参数5 / 100
double raise = salary * byPercent / 100;
salary += raise;

raiseSalary方法有两个参数,第一个参数隐式参数,在方法名前的Employee类,第二个是显式参数byPercent,在方法名()中

封装的优点

public String getName(){
return name;
}

public double getSalary(){
return salary;
}

public LocalDate getHireDay(){
return hireDay;
}

封装,只返回一个调用方法,其他人无法通过方法修改封装内中的内容,增强安全性

  • 设置私有数据域
  • 公有域访问器方法
  • 公有域更改器方法

final实例域

实例域定义为final,构建对象时必须初始化域,且不能对域进行修改。

0x04 静态域与静态方法

静态方法

//调用静态方法

public class Test {
public static void main(String[] args){
Employee[] staff = new Employee[3];

staff[0] = new Employee("Tom" , 40000);
staff[1] = new Employee("Dick" ,60000);
staff[2] = new Employee("Harry" , 65000);

for (Employee e : staff){
e.setId();
System.out.println("name=" + e.getName() + "id=" + e.getId() + ",salary=" + e.getSalary());
}

int n = Employee.getNextId();
System.out.println("Next availabble id=" + n);
}
}

class Employee{
private static int nextId = 1;

private String name;
private double salary;
private int id;

public Employee(String n , double s){
name = n;
salary = s;
id = 0;
}

public String getName(){
return name;
}

public double getSalary(){
return salary;
}

public int getId(){
return id;
}

public void setId() {
id = nextId;
nextId++;
}

public static int getNextId(){
return nextId;
}

public static void main(String[] args){
Employee e = new Employee("Harry" , 50000);
System.out.println(e.getName() + " " + e.getSalary());
}
}