面向对象(下)日期类
概念题
1.面向对象的三大特性是什么?请分别梳理它们的知识点。
封装、继承、多态
封装:
1、提高程序的安全性、保护数据
2、隐藏代码的实现细节
3、统一接口
4、系统的可维护性增加了
get 获得这个数据 set 给这个数据设置值 ————————快捷键:alt + insert
继承:
public class A extends B
重写:需要有继承关系,子类重写父类的方法!
重写只和非静态方法有关!
方法的调用只和定义的类型有关!
子类的方法和父类必须要一致;方法体不同。
1、方法名必须相同
2、参数列表必须相同
3、修饰符:范围可以扩大,但是不能缩小
public > protected > default > private
4、抛出的异常:范围可以被缩小,但不能扩大:ClassNotFoundException(小) -->Exception(大)
为什么需要重写?
1、父类的功能子类不一定需要,或者不一定满足!
Alt + Insert : override
多态:即统一方法可以根据发送对象的不同而采用多种不同的行为方式。(多态是方法的多态,没有属性)
多态注意事项:
1、多态是方法的多态,属性没有多态
2、父类和子类,有联系 ——>类型转换异常! ClassCastException!
3、存在条件: 继承关系,方法需重写,父类引用指向子类对象!father f1 = new Son();
- 回顾并梳理this,super,static.final,abstract,interface关键字和instanceof运算符
super注意点:
1、super调用父类的构造方法,必须放在构造方法的第一个
2、super必须只能出现在子类的方法或构造方法中
3、super和this不能同时调用构造方法
VS this:
代表的对象不同:
this:本身调用的这个对象
super:代表父类对象的应用
前提:
this:没有继承也可以使用
super:只有在继承条件下才可以使用
构造方法:
this():本类的构造
super():父类的构造
abstract 抽象类:本质上还是是类 extends: 单继承
抽象方法,只有方法名字,没有方法的实现!
抽象类的所有方法,继承了它的子类,都必须要实现他的方法---除非子类也是抽象的,那就让子子类去重写
1、不能new抽象类,只能靠子类去实现它
2、抽象类中可以写普通方法
3、抽象方法必须在抽象类中
interface 定义的关键字 , 接口都需要有实现类
1、接口中的所有定义的方法都是抽象的 public abstract
2、一个类可以实现接口 implements 接口
3、实现了接口的类,就需要重写接口中的方法
4、利用接口实现多继承
static 方法,属于类,它不属于实例
final 常量;如果一个类被final定义了,那么这个类就无法作为父类被继承!!
private 方法,属性私有
- 内部类有哪几种形式,它们的访问顺序是怎样的?
1. 成员内部类
private int id = 40;
public void out(){
System.out.println("这是外部类的方法");
}
public class Inner{
public void in(){
System.out.println("这是内部类的方法");
}
//获得外部类的私有属性
public void getID(){
System.out.println(id);
}
----------------------------------------------------------
Outer outer = new Outer();
//通过这个外部类实例化内部类
Outer.Inner inner = outer.new Inner();
inner.getID();
2. 静态内部类
public static class Inner{
public void in(){
System.out.println("这是内部类的方法");
}
3. 局部内部类
public void method(){
class Inner{
public void in(){
}
}
}
4. 匿名内部类
//没有名字初始化类,不用将实例保存到变量中
new Apple().eat();
}
}
class Apple{
public void eat(){
System.out.println("1");
}
}
- Java为什么要引入基本数据类型的包装类?你如何理解自动装箱(Autoboxing)和自动拆箱(AutoUnboxing)功能?
java是面向对象的语言,而八大基本类型不是类,而是关键字,因此要针对性地对它们做出基本数据类型的包装类。基本类型能做的事情,包装类也能做。 但包装类能做的,基本类型不一定能做,比如要赋一个 null 值
自动装箱(Autoboxing)和自动拆箱 (AutoUnboxing):
自动装箱可以把一个基本类型变量直接赋给对应的包装类变量;
自动拆箱则直接把包装类对象直接赋给一个对应的基本类型变量。
//直接把一个基本类型变量赋给Integer变量
Integer x = 5;
//直接把一个boolean变量赋给一个Object对象
Object y = true;
//直接把一个Integer对象赋给int 类型变量
int z = x;
自动装箱 ----- 基本类型的值 → 包装类的实例
自动拆箱 ----- 基本类型的值 ← 包装类的实例
编程题
抽象类与抽象方法定义一个(形状抽象类) shape 抽象类,包含一个颜色属性
String color、计算周长calPerimeter()的方法和返回形状getType()的方法
定义一个三角形类Triangle,并重写Shape类的计算周长calPerimeter()的方法和返回形状getType()的方法
定义一个圆形类Circle,并重写Shape类的计算周长calPerimeter()的方法和返回形状getType()的方法
定义一个Main类,并测试
Shape s1 = new Triangle("黑色", 3, 4, 5);
Shape s2 = new Circle("黄色", 3);
System.out.println(s1.getType());
System.out.println(s1.calPerimeter());
System.out.println(s2.getType());
System.out.println(s2.calPerimeter());
的返回结果。
public abstract class Shape {
public abstract double calPerimeter();
public abstract String getType();
}
public class Triangle extends Shape{
private String x;
private double a;
private double b;
private double c;
public Triangle(String x,double a,double b,double c) {
this.x=x;//颜色
this.a=a;//三条长
this.b=b;
this.c=c;
}
@Override//计算周长
public double calPerimeter() {
return a+b+c;
}
@Override//颜色加形状
public String getType() {
return x + "圆形";
}
}
public class Circle extends Shape {
private String x; //颜色
private double r; //圆的半径
public Circle(String x,double r) {
this.x=x;
this.r=r;
}
@Override//计算周长
public double calPerimeter() {
return 2*Math.PI*r;
}
@Override//颜色加形状
public String getType() {
return x + "圆形";
}
}
public class Main {
public static void main(String[] args) {
Shape s1 = new Triangle("黑色", 3, 4, 5);
Shape s2 = new Circle("黄色", 3);
System.out.println(s1.getType());
System.out.println(s1.calPerimeter());
System.out.println(s2.getType());
System.out.println(s2.calPerimeter());
}
}
2.接口与继承
中南民族大学计算机科学学院团委学生会体制有这样的现象:各学生会部门成员要坚持学生会主席团的领导和按照部长的指示开展部门学生会工作,请编写一个java应用程序描述上述的体制现象。要求如下:
该应用程序中有一个“学生会主席团”接口:
chairperson,该接口中有个“坚持部门部长领导”方法:void followLeader();该应用程序中有一个“学生会部门部长”抽象类:
minister,该抽象类中有个“开展部门学生会工作”的抽象方法:abstract void studentUnionWork();该应用程序中有一个“学生会部门成员”类:
studentUnion,该类继承minister抽象类并且实现chairperson接口;在实现followLeader()方法时输出“我们各学生会部门成员要坚持学生会主席团的领导!”;在重写studentUnionWork();方法时输出“我们各学生会部门成员按照部长的指示开展部门学生会工作!”。该应用程序应该有一个主类Main,在主类的main方法中创建学生会部门成员类对象,并测试其功能
studentUnion stu = new studentUnion();
stu.followLeader();
stu.studentUnionWork();
public interface Chairperson {
void followLeader();
}
public abstract class Minister {
public abstract void studentUnionWork();
}
public class StudentUnion extends Minister implements Chairperson{
@Override
public void studentUnionWork() {
System.out.println("我们各学生会部门成员按照部长的指示开展部门学生会工作!");
}
@Override
public void followLeader() {
System.out.println("我们各学生会部门成员要坚持学生会主席团的领导!");
}
}
public class Main {
public static void main(String[] args) {
StudentUnion stu = new StudentUnion();
stu.followLeader();
stu.studentUnionWork();
}
}
Date类与Calendar类Date类要熟悉getTime(),setTime(),compareTo()等方法的使用,和SimpleDateFormat这个工具类转换日期格式的方法
题目描述:使用SimpleDateFormat类,
- 获取当前时间并输出,格式为XXXX年XX月XX日 XX:XX:XX输出
- 从键盘输入字符串XXXX/XX/XX XX-XX-XX格式化为XXXX-XX-XX XX:XX:XX输出
public static void main(String[] args) throws ParseException {
Date d1 = new Date();
System.out.println(d1);// 当前系统时间
Calendar a = Calendar.getInstance();
int year = a.get(Calendar.YEAR);
int month = a.get(Calendar.MONTH)+1; //我国:1-12月 外国:0-11月
int day = a.get(Calendar.DAY_OF_MONTH);
int hour = a.get(Calendar.HOUR_OF_DAY);
int minute = a.get(Calendar.MINUTE);
int second = a.get(Calendar.SECOND);
System.out.println(year + "年" + month + "月" + day + "日" + " "
+ hour + ":" + minute + ":" + second);
Scanner b = new Scanner(System.in);
System.out.print("输入:");
String x = b.nextLine();
Date date = new Date();
//将输入字符串里的"-"全部转化成":";"/"全部转化成"-"
String time = x.replaceAll("-",":").replaceAll("/","-");
//实现日期的格式化
SimpleDateFormat c = new SimpleDateFormat(time);
String e = c.format(date);
System.out.print("输出:");
System.out.println(e);
b.close();
}
}