static关键字的使用:
继承:
一个类继承另外一个类,被继承的类叫做父类(超类、基类),当前类叫做子类
子类继承父类,可以得到父类非私有的属性和方法。 + 不能继承构造方法
子类的构造方法会默认调用父类的无参构造方法
子类继承了父类的方法,发现父类方法不能满足子类需求,那么子类可以对该方法进行重写
重写的要求:
1、发生在继承关系中
2、方法结构(返回值类型、方法名、参数列表)必须和继承的方法完全一致
3、使用的访问修饰符不能严于父类
public < protected <缺省
继承的特点:
1.传递性
2.单根性
java中所有的类,都间接或者直接继承自Object类。
继承的语法
[修饰符] class 子类名 extends 父类名{
}
继承的作用:
super的使用:
super([参数列表])
的形式来调用父类的构造方法封装:
把客观事务描述为类的过程就是封装
一般指的是把类的属性或者方法私有化
属性私有化之后,需要给私有化的属性提供公开的get和set方法
final关键字的使用:
抽象类:
[修饰符] abstract 返回值类型 方法名([参数列表]);
格式:父类类型 父类引用;
父类引用=new 子类类型();
格式:子类类型 子类引用;
子类引用=(子类类型)父类引用;
接口
比抽象类还抽象的存在
在接口中只能定义常量和抽象方法
接口的作用:
1、解决java中类之间单继承的问题 2、达到约定的目的(降低耦合)
接口:interface 接口之间的继承是多继承
语法格式:
[修饰符] class 类名 implements接口1名,接口2名.....{
类体;
}
接口和抽象类的区别:
多态
接口的功能:
多个产品都存在一个相同的功能;这个功能可以被定为一个接口。
这个接口为这些商产品定义一个统一的规范约束起来。
此时所有产品实现这个接口。
然后用一个类进行对接口的具体实现,称为实现类;
将其属性定义为
接口类型 接口名
然后进行方法的具体实现
接口名.接口中方法()
最后在测试类中直接调用类中的具体实现方法。
多态的实现:
一个事物的两种状态;
一个事物拥有多种状态时,将多种状态定义为多个接口,
然后声明这个事物的类,该类同时属于多个接口的实现。重写多个接口中的抽象方法。
最后在测试时,实例化该类一个对象,并声明多个接口;
利用 接口名=对象名
向上转型实现对同一对象的不同抽象方法调用。
内部类:
1、成员内部类,内部类的位置和外部类的实例成员同一级别
内部类可以直接访问外部类的属性和方法
外部类不能直接访问内部类的属性和方法,要想访问可以实例化内部类对象
在其他类中访问语法: 内部类类型 对象名 = new 外部类类型().new 内部类类型();
2、方法内部类,定义在方法中
只能在定义了这个内部类的方法中使用
方法内部类不能使用访问修饰符,测试类直接调用方法
3、静态嵌套类,使用static修饰的成员内部类
内部类可以直接访问外部类的类成员,不能直接实例成员,要想访问实例成员,必须实例外部类的对象
在其他类中访问语法: 内部类类型 对象名 = new 外部类类型.内部类类型();
4、匿名内部类
继承式
接口式
参数式
常用类库
字符串:String类,不可变字符串,字符串常量
StringBuffer\StringBuilder,可变字符串
StringBuffer线程安全,常用于全局变量
StringBuilder线程不安全,用于局部变量,速度比StringBuffer快
Math类:数学类
八种基本数据类型对应的包装类
基本数据类型 — 包装类 — 字符串
jdk1.5之后基本数据类型和包装类对象可以自动拆封箱
拆箱:对象—基本数据类型
封箱:基本数据类型–对象
byte—Byte
short–Short
int-----Integer
long—Long
float—Float
double-Double
char—Character
boolean-Boolean
java.util包
Date 日期类
Calendar 日历类
Scanner 扫描器
Random 随机数类
Arrays 数组工具类
java.text包
DateFormat SimpleDateFormat
NumberFormat DecimalFormat
Date date=new Date();
System.out.println(date.after(date2));//判断date是不是再date2之后
System.out.println(date.before(date2));//判断date是不是再date2之前
System.out.println(date.equals(date3));//当getTime得到的毫秒数相同时,结果为true
Calendar now = Calendar.getInstance();
System.out.println(now);
//获取年份
System.out.println(now.get(Calendar.YEAR));
//获取小时
System.out.println(now.get(Calendar.HOUR));//12小时制
System.out.println(now.get(Calendar.HOUR_OF_DAY));//24小时制
now.add(Calendar.YEAR, -5);//给指定的字段增减值
now.set(Calendar.YEAR, 5);
SimpleDateFormat sdf=new SimpleDateFormat();
//定义一个格式
String pattern="yyyy年MM月dd日 HH:mm:ss";
//把模式设置给工具
sdf.applyPattern(pattern);
//实例化一个当前的日期对象
Date date=new Date();
//把日期对象格式化成日期字符串
String str_date=sdf.format(date);
System.out.println(str_date);
/*
* 日起到字符串:格式化
* 字符串到日期:解析
*/
String sdate="2019.2.3 12:12:12"; //字符串日期
//在指定模式的时候,必须定义的模式和字符串日期一致
SimpleDateFormat sdf2=new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
//解析日期字符串
Date date2=sdf2.parse(sdate);
System.out.println(sdf2.format(date2));
集合(很重要)
1.collection,集合框架的跟接口,定义了集合中的通用方法
2.Map接口
以键值对的方式来存储,键不允许重复,值允许重复
在选择集合的时候,如果不是同步的,可以使用Collections工具类中的同步方法完成外部同步。
格式:Collections.synchronized集合(集合);
思维导图:
定义一个类员工类Employee,包含属性薪资和生日月份,以及获取薪资的方法,如果当月员工过生日,会有100元的生日奖励。
1-1、定义一个销售员工类,是员工类的子类,包含属性销售金额以及提成率。
1-2、定义一个销售经理类,是销售员工类的子类,包含属性基本薪资
1-3、定义一个固定薪资的员工类,是员工类的子类,包含属性固定薪资
1-4、定义一个小时工类,是员工类的子类,包含属性时薪和工作的小时数。超过160个小时的部分按照1.5倍薪资计算。
定义所有类,使用构造方法完成对象的创建。
Employee 类:
code
1-3 Fixation 类:
package com.zhiyou.day01work;
public class Fixation extends Employee{
//父类有:属性:salary birthday_month
// 方法:getSalary (int month)
int salary;
public Fixation(){//空构造函数
}
//需要获取的值包括 :birthday_month、salary;两者均可以从父类中找到
public Fixation( int birthday_month, int salary) {
super(birthday_month,salary);
}
//获取工资方法与父类方法相同
}
1-4 HourEmployee 类:
package com.zhiyou.day01work;
public class HourEmployee extends Employee {
//父类有:属性:salary birthday_month
// 方法:getSalary (int month)
double hourSalary; //时薪
int hour; //工作时间
public HourEmployee() {
}
//还需获取的有:birthday_month、hourSalary、hour ;其中需要新获得有hourSalary,hour
public HourEmployee(int birthday_month,double hourSalary, int hour) {
super(birthday_month); //父类获取生日月
this.hourSalary = hourSalary;
this.hour = hour;
}
@Override
double getSalary(int month) {
if(hour>160){
return 160*hourSalary+(hour-160)*hourSalary*1.5+super.getSalary(month);
}
return hour*hourSalary+super.getSalary(month);
}
}
1-1 SellEmployee 类:
package com.zhiyou.day01work;
public class SellEmployee extends Employee {
//父类有:属性:salary birthday_month
// 方法:getSalary (int month)
double salesAmount; //销售金额
double royaltyRate; //提成率
public SellEmployee() { //空构造方法
}
//需要获取的三个值:生日月;销售金额;提成率;其中需要新获得的为 salesAmount、royaltyRate
public SellEmployee(int birthday_month,double salesAmount, double royaltyRate) {
super(birthday_month); //生日月已定义,从父类获得
this.salesAmount = salesAmount;
this.royaltyRate = royaltyRate;
}
@Override //获取工资方法不同需要重写方法
double getSalary(int month) {
return super.getSalary(month)+salesAmount*royaltyRate;
}
}
1-2 SalesManager 类:
package com.zhiyou.day01work;
public class SalesManager extends SellEmployee{
//父类有:属性:salary、 birthday_month 、salesAmount、 royaltyRate
// 方法:getSalary (int month)
double salary; //基本工资
public SalesManager() {
}
//需要获取的有: salary、birthday_month 、salesAmount 、royaltyRate 其中 salary需要新获取
public SalesManager( int birthday_month,double salary,double salesAmount,double royaltyRate) {
super(birthday_month,salesAmount,royaltyRate);
this.salary = salary;
}
double getSalary(int month){
return salary+super.getSalary(month);
}
}
测试类:
package com.zhiyou.day01work;
public class Test {
public static void main(String[] args) {
//销售员工对象创建
SellEmployee sellEmployee =new SellEmployee(4,100000,0.2);
System.out.println(sellEmployee.getSalary(5));
//固定工资员工对象创建
Fixation fixation=new Fixation(5,4000);
System.out.println(fixation.getSalary(5));
//小时工对象创建
HourEmployee hourEmployee=new HourEmployee(8,180,15);
System.out.println(hourEmployee.getSalary(8));
//销售经理对象创建
SalesManager salesManager=new SalesManager(10,8000,10000,0.3);
System.out.println(salesManager.getSalary(10));
}
}
编写一个台灯测试;有台灯和灯泡,灯泡多个,台灯一个,台灯打开后点亮相应灯泡。
分析,用抽象类规定统一标准来规范红绿灯灯泡类
抽象父类灯泡 TableLamp 类:
package com.zhiyou.abstactwork;
/**
* 台灯类
* @author XiaoHui
* 包含属性为一个灯泡类
*/
public class TableLamp {
//创建一个Bulb类型的对象
private Bulb bulb;
//空构造函数
public TableLamp() {
}
//构造函数来获取用户想要使用的灯泡的父类Bulb,此时如果传入子类灯泡,直接向上转型
public TableLamp(Bulb bulb) {
super();
this.bulb = bulb; //令传入bulb赋值给本类创建的bulb
}
public void on(){
System.out.println("台灯打开......");
bulb.shine(); //调用bulb的发光方法
}
}
子类 GreenBulb 类:
package com.zhiyou.abstactwork;
public class GreenBulb extends Bulb {
//重写父类发光方法
@Override
public void shine() {
System.out.println("绿灯泡发绿光....");
}
}
子类 RedBulb 类:
package com.zhiyou.abstactwork;
public class RedBulb extends Bulb {
//重写父类发光方法
@Override
public void shine() {
System.out.println("红灯泡发红光.....");
}
}
台灯类 TableLamp 类:
package com.zhiyou.abstactwork;
/**
* 台灯类
* @author XiaoHui
* 包含属性为一个灯泡类
*/
public class TableLamp {
//创建一个Bulb类型的对象
private Bulb bulb;
//空构造函数
public TableLamp() {
}
//构造函数来获取用户想要使用的灯泡的父类Bulb,此时如果传入子类灯泡,直接向上转型
public TableLamp(Bulb bulb) {
super();
this.bulb = bulb; //令传入bulb赋值给本类创建的bulb
}
public void on(){
System.out.println("台灯打开......");
bulb.shine(); //调用bulb的发光方法
}
}
测试类:TableLampTest 类:
package com.zhiyou.abstactwork;
public class TableLampTest {
public static void main(String[] args) {
//此时实例化一个红灯泡对象属于灯泡的子类;
RedBulb redBulb=new RedBulb();
//本来TableLamp()括号内传值为父类(Bulb),此处直接利用子类RedBulb
//子类对象向父类转型是向上转型,可以直接转型
TableLamp tableLamp=new TableLamp(redBulb);
tableLamp.on();
}
}
日期工具类
/**
* 日期工具类,实现日期与字符串互转
* @author XiaoHui
* dateToString(Date date,String Pattern)
* stringToDate(String toDate ,String Pattern)
*/
package com.zhiyou.util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateTool {
private static SimpleDateFormat sdf=new SimpleDateFormat();
public static String dateToString(Date date,String Pattern){
sdf.applyPattern(Pattern);
return sdf.format(date);
}
public static Date stringToDate(String toDate ,String Pattern) throws ParseException{
sdf.applyPattern(Pattern);
return sdf.parse(toDate);
}
}
数字工具类
package com.zhiyou.util;
/**
* 数字工具类
* @author XiaoHui
* numToString(Number num,String Pattern)
* stringToNum(String toNum,String Pattern)
*/
import java.text.DecimalFormat;
import java.text.ParseException;
public class NumberTool {
private static DecimalFormat df=new DecimalFormat();
public static String numToString(Number num,String Pattern){
df.applyPattern(Pattern);
return df.format(num);
}
public static Number stringToNum(String toNum,String Pattern) throws ParseException{
df.applyPattern(Pattern);
return df.parse(toNum);
}
}