继承
共性抽取
在继承关系 中,子类就是一个父类,也就是说,子类可以被当作父类看待
例如:父类是员工,子类是讲师,“讲师就是员工”
定义父类:(普通类的定义是一样的)
public class 父类名称{
//……
}
定义子类格式:
public class 子类名称 extends 父类名称{
//……
}
父子类中成员变量的访问顺序
在父子类的继承关系中,如果成员变量重名,则创建子类对象时,访问有两种方式
直接通过子类对象访问成员变量
等号左边是谁,就优先用谁,没有则向上找
间接通过成员方法访问成员变量
该方法属于谁,谁就优先使用,没有则向上找
局部变量:直接写变量名
本类中的成员变量:this.成员变量名
父类的成员变量:super.成员变量名
public class Son extends Father{
int num=200;
public void methodSon(){
int num=30;
System.out.println(num);
System.out.println(this.num);
System.out.println(super.num);
}
}
继承中成员变量访问的特点
在父子类的继承关系中,如果成员变量重名,则创建子类对象时,访问方式有两种
直接通过子类对象访问成员变量等号左边是谁,就优先用谁,没有则向上找
间接通过成员方法访问成员变量
继承中成员方法访问的特点
在父子的继承关系中,创建子类对象,访问成员方法的规则:
创建的对象是谁,就优先用谁,如果没有则继续向上找
注意事项:
无论是成员变量还是成员方法,如果没有都是向上找父类,绝对不会向下找子类的
public class Test {
public static void main(String[] args) {
// Father father = new Father();
// father.methodFather();
// father.method();
Son son = new Son();
son.methodSon();
son.methodFather();
son.method();
}
void method(){
}
}
super关键字
super关键字用来访问父类内容,而this关键字用来访问本类内容
1.在本类的成员方法中,访问本类的成员变量
2.在本类的方法中,访问本类的另一个成员方法
3.在本类的构造方法中,访问本类的另一个构造方法
继承关系中,构造方法的访问特点:
1.子类构造方法中,有一个默认隐含的【super();】,所以说,先调用父类的构造,后执行子类的构造
2.子类构造可以通过【super】关键字来调用父类的内容
3.super的父类构造调用,必须是子类构造中的第一句【重要】,不能一个子类构造调用多次super构造
【总结】:
子类必须调用父类的构造方法,不写赠送super()
public class Son extends Father{
int num=20;
public Son(){
// super();
System.out.println("子类的无参构造!");
}
public Son(String name){
this();
// super(); 可以省略
System.out.println("子类的有参构造!");
// super(); //错误写法
}
public void method(){
int num=30;
System.out.println(num);
System.out.println(this.num);
System.out.println(super.num);
super.method();
}
}
方法的重写
重新与重载的比较
重写(Override):方法的名称一样,参数列表【一样】,覆盖、复写
重载(Overload):方法的名称一样,参数列表【不一样】
方法的覆盖重写的特点:创建的是子类对象,则优先用子类方法
方法重写的注意事项:
1.必须保证父子类之间方法的名称相同,参数列表也相同
@Overrider:写在方法前边,用来检验是否有效正确的覆盖重写,
起到安全检测的作用。注解:annotation
2.子类方法的返回值必须【小于等于】父类方法的返回值范围
提示:java.lang.String,,父亲类:java.lang.Object
3.子类方法的权限必须【大于等于】父类方法的权限修饰符
提示:public > protected >默认> private
工具类的使用
日期和时间类
java.util.Date:表示日期和时间类
类Date表示特定的瞬间,精确到毫秒
毫秒:千分之一秒,1000毫秒=1秒
把日期转换为毫秒:
当前的时间:2021-07-22
时间的原点(0毫秒):1970-01-01 00:00:00(英国格林)
1626942611592
就是计算当前日期到时间原点之间一共经历了多少毫秒(一个long)
把毫秒值转换为日期:
1天=246060*1000=86400 000毫秒
注意:中国属于东八区,会把时间增加8个小时
1970-01-01 08:00:00
DateFormat类
-
java.text包中是时间/日期格式化子类【抽象类】,通过这个;类帮我们完成日期和时间的格式化
Date类转字符串:
字符串转Date类:
* Date类转字符串:
*
* 字符串转Date类:
*/
public class Demo1Date {
public static void main(String[] args) throws ParseException {
//获取当前系统时间距离1970-01-01 08:00:00一共经历了多少毫秒
// System.out.println(System.currentTimeMillis());
System.out.println(24*60*60*1000);
// Date date = new Date();
// long time = date.getTime();
// System.out.println(date);
// System.out.println("2021-07-22");
// System.out.println(time);
String dateStr="2002-01-01";
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
Date parse = sdf.parse(dateStr);
System.out.println(parse);
}
}
字符串转日期:
-
Date parse(String str):
-
注意:
-
parse()方法声明了一个异常机制叫做ParseException
-
如果字符串和构造方法的模式不一样,那么程序就会抛出异常
/**
* 字符串转日期:
* Date parse(String str):
* 注意:
* parse()方法声明了一个异常机制叫做ParseException
* 如果字符串和构造方法的模式不一样,那么程序就会抛出异常
*/
public void strFormatDate(){
public static void main(String[] args){
String dateStr="2002-01-01";
Student student = new Student();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = sdf.parse(dateStr);
student.setBrithDate(date);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
日历类
java.util.Calendar:日历类
Calendar类是一个抽象类,里边提供了很多操作日历字段的方法
Calendar类无法直接创建对象,里边有一个静态的方法叫getInstance(),
该方法可以直接返回Calendar类的子类对象
public class Demo2Calendar {
public static void main(String[] args) {
Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
System.out.println(year);
int month = c.get(Calendar.MONTH);//西方的月份0-11 东方1-12
System.out.println(month);
int day = c.get(Calendar.DAY_OF_MONTH);
System.out.println(day);
int date = c.get(Calendar.DATE);
System.out.println(date);
}
}