基本知识点:
包:package 为了便于管理大型软件系统中数目众多的类,解决类命名冲突的问题,Java引入了包。
包相当于一个收纳盒,类相当于收纳盒里面的物品,一个包里面可以有多个类。
import 导入包的类,比如:import java.util.Scanner;导入了工具(util)的键盘输入类(Scanner)
修饰符:java提供四个修饰符public、private、default、protected。
(1)public:公共的,实现跨包访问,public修饰的,在任何地方都能访问;跨包访问;
(2)private:表示私有的,就是说除了自己的class类能直接访问外,其他任何类不能访问;
解决private局限性的方法:类私有、公开方法;快捷键:Alt+Shift+S 直接生成公开方法;
(3)default:默认的,作用域范围在自己类里面使用,一般不建议使用;
(4)protected:和继承特性相关,受保护的,对子女和朋友来说,可以自由使用,其他外部class不能访问。
static 静态修饰符:
(1)概念:类的静态成员不依赖类的某一实例,可以使用类名直接访问;
(2)static静态关键字修饰:属性、方法、内部类、代码块;
(3)static属性:static修饰的资源属于类级别,是全体对象实例共享的资源;
(4)静态属性:
<1>使用static修饰的属性,属于类的全体类的实例共享的变量;
<2>静态属性是在类的加载期间初始化的;
<3>使用类名.属性访问;
(5)实例变量:属于对象的属性;使用对象.属性访问
static方法:使用static声明的方法,属于类的方法,一般用来表示工具方法。
在类加载以后就可以自己调用,不需要创建任何类的实例对象;
静态代码块:
静态代码块是在类加载期间运行的代码块,由于类只加载一次,所以静态代码块只执行一次;
静态代码块用途不是很常见,一般用来在类加载以后初始化一些静态资源时使用。
类:相似/相同的一类事物的集合
.类、对象、实例三者的关系:
(1)类:是对象的模板,可以实例化对象;
(2)对象:类的个体;
(3)实例:实现的对象。
方法:
概念:方法是完成某一个操作的一系列代码的集合
方法设计时候的原则是一个方法只做一件事情
方法格式:由访问【修饰符】 【方法返回值】 【方法名称】 【参数列表】
方法会隐藏实现的细节,供需求方简单调用
面向对象的特征:封装【隐藏实现的细节{}】,继承,多态【方法的重载】
第一大特征:封装
1.概念:保证软件部件具有优良的模块性的基础;面向对象的封装就是把描述一个对象的属性和行为的代码封装在一个“模块”中,也就是一个类中,
属性用变量定义,行为用方法进行定义,方法可以直接访问同一个对象中的属性;
2.目标:“高内聚 低耦合”;
3.对象是封装的基本单位;
第二大特征:抽象
1.概念:抽象就是找出一些事物的相似和共性之处,然后就把这些事物归为一类
2.抽象分类:行为抽象;状态抽象
第三大特征:继承
1.概念:在定义和实现一个类时,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并可以
加入若干新的内容,或修改原来的方法使之更合适特殊的需求,这就是继承;
2.关系:继承是子类自动共享父类数据和方法的机制;
3.意义:提高了软件的可重用性和可扩展性。
第四大特征:多态
1.概念:多态是程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而在程序运行期间才能确定;
即一个引用变量到底指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须由程序运行期间决定。
2.原因及意义:
在运行时才能确定类,这样不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,
即不修改程序代码就可以改变程序运行时,所绑定的具体代码,让程序可以多个运行状态。增强了软件的灵活性和扩展性。
传统方法“万年历”的设计过程:
万年历
* 程序参考基数:1900年1月1日:星期一
* 分析:
* 1.顺序输入年月日,控制台获取输入的年月日;
* 2.计算1900年开始,整年至当前年的天数;
* 3.计算1900年1月至当前年月的天数;
* 4.计算总共至当前年月日的天数;
* 5.输出当前日期为星期几: dayOfWeek=(monthPassDay+day)%7+1;
import java.util.Scanner;
public class WanNianLi {
/**
* 万年历
* 程序参考基数:1900年1月1日:星期一
* 分析:
* 1.顺序输入年月日,控制台获取输入的年月日;
* 2.计算1900年开始,整年至当前年的天数;
* 3.计算1900年1月至当前年月的天数;
* 4.计算总共至当前年月日的天数;
* 5.输出当前日期为星期几: dayOfWeek=(monthPassDay+day)%7+1;
* @param args
*/
public static void main(String args[]){
System.out.println("========================================");System.out.println("***************万年历*********************");System.out.println("=========================================");int year=0,month=0,day;
Scanner in=new Scanner(system.in);
System.out.println("请输入年:");
year=in.nextInt();
System.out.println("请输入月:");
month=in.nextInt();
System.out.println("请输入日:");
day=in.nextInt();
System.out.println("你输入的年:"+year+"年"+month+"月"+day+"日 请确认是否继续:0:退出;1继续.....");
while(true){
int choice=in.nextInt();
if(choice==0){
break;
}
}
System.out.println("程序努力计算中......");
int totlePassDay=0;//总共过去的天数
//计算从1900年到输入的年,整年过去的天数
int yearPassDay=0;//整年过去的天数
for(int j=1900;j<year;j++){
if(j%4==0&&j%100!=0||j%400==0){
yearPassDay+=366;
}else{
yearPassDay+=355;
}
}
System.out.println("从1900年至"+year+"年过去了"+yearPassDay+"天!");
//计算从1900年到输入的年月,总共过去月的天数
int monthPassDay=0;//整月过去的天数
for(int i=1;i<month;i++){
switch (i) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
monthPassDay+=31;
break;
case 2:
if(year%4==0&&year%100!=0||year%400==0){
monthPassDay+=29;
}else{
monthPassDay+=28;
}
break;
default:
monthPassDay+=30;
break;
}
}
System.out.println(year+"年1月至"+month+"月 总共过去的天数:"+(monthPassDay+day)+"天!");
totlePassDay=yearPassDay+monthPassDay+day;
System.out.println("从1990至:"+year+"年"+month+"月"+day+"日总共过去的天数:"+totlePassDay+"天!");
//输出星期
int dayOfWeek=0;
dayOfWeek=(monthPassDay+day)%7+1;
System.out.println("星期"+dayOfWeek);
int monthDay=0;
System.out.println("星期天t 星期一t 星期二t星期三t 星期四t 星期五t 星期六 ");
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
monthDay+=31;
break;
case 2:
if(year%4==0&&year%100!=0||year%400==0){
monthDay+=29;
}else{
monthDay+=28;
}
break;
default:
monthDay+=30;
break;
}
for(int i=0;i<dayOfWeek;i++){
System.out.print("#t");
}
if(dayOfWeek%7==0){
System.out.println();
}
for(int d=1;d<=monthDay;d++){
System.out.print(d+"t");
if((dayOfWeek+d)%7==0){
System.out.println();
}
}
}
}
缺点:
1.代码冗余,重复性高;
2.不利于后期维护;
改进一:利用方法进行重构
* 定义方法
* 1.showCalendar():展示万年历;
* 2.outPut():输出万年历的格式;
* 3.getTotleDay():获取1900年1月1日至输入年月日的总天数;
* 4.monthDay():获取该年该月的天数;
* 5. isLeapYear(int year):判断输入的年是否为闰年
import java.util.*;
public class PerpetualCalendar {
/**
* 定义属性
*/
public int year;//定义属性年
public int month;//定义属性月
/**
* 定义方法
* 1.showCalendar():展示万年历;
* 2.outPut():输出万年历的格式;
* 3.getTotleDay():获取1900年1月1日至输入年月日的总天数;
* 4.monthDay():获取该年该月的天数;
* 5. isLeapYear(int year):判断输入的年是否为闰年
*/
public void showCalendar(){
/**
* 展示万年历
* 内容:1.获取控制台输入年月;
* 2.判断输入的月份是否合法;
* 3.判断输入的年份是否大于参考年份1900年,小于系统予以提示;
* 4.调用 outPut();输出万年历格式。
*/
Scanner in=new Scanner(http://System.in);
System.out.println("############################");
System.out.println("###########万年历#############");
System.out.println("############################");
System.out.print("请输入您想要输出的年份:");
year=in.nextInt();
System.out.print("请输入您想要输出的月份:");
month=in.nextInt();
if(year<1900){
System.out.println("输入的年份小于参考年份1900年!系统不予识别!!!");
return;
}
if(month<1||month>12){
System.out.println("月份输入错误!");
return;
}
outPut();
}
public void outPut(){
/**
* 万年历输出格式
* http://1.int totleDay=getTotleDay();声明totleDay并调用getTotleDay()方法,获取1900年至该年该月的总天数
* 2. int dayOfWeek= totleDay%7;声明并获取星期数;
* 3.定格万年历的格式:
* (1)遍历该月的天数;
* (2)7位以换行。
*/
int totleDay=getTotleDay();
int dayOfWeek= totleDay%7;
System.out.println("星期"+dayOfWeek);
System.out.println("星期天t 星期一t 星期二t星期三t 星期四t 星期五t 星期六 ");
/*
* 星期数的值为定格万年历前的空格数,遍历输出
*/
for(int i=0;i<dayOfWeek;i++){
System.out.print("t");
}
/*
* 星期数值为7时,换行避免七个空格后面跟7个数不换行的情况
*/
if(dayOfWeek%7==0){
System.out.println();
}
/*
* 调用monthDay(month);方法获取输入月的天数
* 遍历该月的天数并输出
*/
int monthDay=monthDay(month);
for(int d=1;d<=monthDay;d++){
System.out.print(d+"t");
/*
* 判断换行,月的天数+空格对7求余为0,则换行
*/
if((dayOfWeek+d)%7==0){
System.out.println();
}
}
}
public int getTotleDay(){
/**
* 获取总天数
* 1.循环判断年份是否闰年,并统计年的天数;
* 2.调用monthDay(i);方法,并统计月的天数;
* 3.totleDay=monthPassDay+yearPassDay+1;统计总天数。
*/
int totleDay,yearPassDay=0,monthPassDay=0;
for(int i=1900;i<year;i++){
if(isLeapYear(i)){
yearPassDay+=366;
}else{
yearPassDay+=365;
}
}
/*
* 循环1月-输入的月,并统计天数
*/
for(int i=1;i<month;i++){
monthPassDay+= monthDay(i);
}
totleDay=monthPassDay+yearPassDay+1;
return totleDay;
}
public int monthDay(int month){
/**
* 获取月的天数
* switch-case条件语句判断为哪个月,并返回该月的天数
*/
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31;
case 2:
if(isLeapYear(year)){
return 29;
}else{
return 28;
}
default:
return 30;
}
}
public boolean isLeapYear(int year){
/**
* 判断是否为闰年
* 判断条件:year%4==0&&year%100!=0||year%400==0
*/
if(year%4==0&&year%100!=0||year%400==0){
return true;
} return false;
}
}
主页面启动程序:
package javacalendar.com;
public class Start {
public static void main(String args[]){
/**
* 同一个包里面调用类
* new 一个对象
*/
PerpetualCalendar pc=new PerpetualCalendar();
pc.showCalendar();
}
}
改进二:利用java提供的相关包
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;
public class CalendarService2 {
private int year;// 用户要计算的年
private int month;// 用户要计算的月
private Scanner input = new Scanner(System.in);
/**
* 输出日历
*
* @throws ParseException
*/
public void showCalendar() throws ParseException {
System.out.println("=================================");
System.out.println("===========java万年历=============");
System.out.println("=================================");
System.out.print("请输入要计算的年:t");
year = input.nextInt();
System.out.print("请输入要计算的月:t");
month = input.nextInt();
if (month < 1 || month > 12) {
System.out.println("月份输入错误!");
return;// 代码不会向下执行了
}
// 计算输入的年,月1日星期几
// java为我们提供了大量的类
// 通过使用这些类的方法,我们就可以快速实现程序功能
// 介绍java类 Calendar 类
Calendar cl = Calendar.getInstance();
// 给日历设置一个时间,将用户输入的年月设置到日历中
// 将字符串转换为日期
Date date = new SimpleDateFormat("yyyyMMdd").parse(year + "" + (month < 10 ? ("0" + month):( month + "01")));
cl.setTime(date);
// 调用日历类,计算这一天是星期几
int dayOfWeek = cl.get(Calendar.DAY_OF_WEEK) - 1;
CalendarService c = new CalendarService();
c.year = year;
c.month = month;
c.printCalendar(dayOfWeek);
}
}