Java基础——Day10
简要回顾:
1. 包
①使用:域名倒置
②访问权限控制
③导包, import ,顺序 package 位于第一行,紧接着可以有多个 import 语句,然后才是我们的类
若有多个重名的类,都需要使用的话,需要使用全类名
2. 封装
好处:不能对属性随意赋值,保护作用----安全
使用:属性私有化、setXxx和getXxx方法,对属性进行操作以及加入必要的逻辑控制
3. 继承
好处:抽取共性,简化代码;提高代码的扩展性和维护性
用法:定义父类,建立子父关系 extends
特点:①只有一个直接父类,即只支持单根继承;②可以多层继承
方法重写/覆盖 vs 重载
super vs this
用法一样,在哪个地方使用
4. 抽象类
它是一个类,用于继承【抽取共性】
若有些方法,只定义方法签名,具体如何实现,父类不知道,此时需要将此方法定义为抽象 方法,若一个类中有抽象方法,该类要定义为抽象类
在框架中,抽象类用的还是的蛮多的
特点:
不能实例化
普通类中有什么,它就可以有什么,甚至多于普通类
5. ctrl + p :可以查看方法有哪些参数
今日内容:
1. Object
2. static
3. final
4. 抽象类:模版方法设计模式
1.Object
1.1 是什么
是所有类的祖宗类,即父类。若某个类没有显示通过super去继承,默认父类就是Object Class Object is the root of the class hierarchy. Every class has Object as a superclass. All objects, including arrays, implement the methods of this class
1.2 常用的方法
1.2.1 toString
System.out.println(admin);
System.out.println(admin.toString());
//上面两行代码等效
我们后面就不在写showInfo,全部换成 toString()
//Object中的源码显示的内容,这里就明确了为什么我们打印对象名称的时候,显示的是一个地址值 public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
为什么字符串打印的是内容?因为字符串重写了 toString() 方法
/**
* This object (which is already a string!) is itself returned.
*
* @return the string itself.
*/
public String toString() {
return this;
}
1.2.2 equals
//Object源码
public boolean equals(Object obj) {
return (this == obj);
}
//String重写后的源码
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
需求:假定我们的学生对象,若stuNo和name都一样的话,我们认为是同一个人。此时我们需要重写 equals方法
equals与==的区别
1. ==,可以比较基本类型和引用类型,对于基本类型比较是指,引用类型比较是地址值
2. equals:用于比较引用类型,若没有重写的话,跟==没有区别,根据自己的需求重写之后, 比较内容
2.final
1. 变量:就是常量
2. 方法:最终的方法,子类不能重写,如果你觉得你的这个方法已经非常非常完善
3. 类:最终类,不能被继承,比如我们的 String 、 Math
3.static
静态是跟着类的模版信息,一并加载出来;而非静态,当成是对象这块的使用
3.1 为什么要使用
有些成员变量,它的值都是一样的,若在多个对象中进行维护,没有问题,此时可能有如下几个问题:
1. 浪费空间(资源)
2. 每个都要维护,维护性可能不太好
我们能否对其统一维护,只保存一份(类似大家共用的饮水机一样),此时我们可以使用 static 进行 修饰
3.2 可以修饰什么
1. 成员变量:类变量
静态修饰的成员变量跟类的模板信息一样,在方法区中维护一份
问题:
①在类变量的时候,虽然使用对象名也可以调用,IDEA就不建议,你使用对象调用的时候,可能 出问题,即可能不安全,IDEA直接推荐是也是通过类名调用
② 一只老鼠坏一锅汤 :若某个对象修改了类变量的值,大家拿到的都是修改后的值,一般结合 final + public 一起使用,即 public final static String natition = "国籍"; ,我们称之为 全 局常量
作用:用于共享数据,在实际中用的比较多的地方,比如用于定义写系统的参数配置【比如数据库 的连接、比如分页参数。。。。。】
2. 方法 一般用于工具类中,可以通过类名调用,比如 Arrays 、 Math
注意:静态方法只能调用静态方法,类变量
非静态方法中可以调用非静态方法、静态方法、类变量
3. 修饰代码块
静态代码块、普通代码块、构造方法的执行顺序
静态先行,只行一次,紧接着普通代码块,最后构造方法,而且普通代码块、构造方法,创建 几个对象,就执行几次。静态代码块使用的还是蛮多的!!!
需求:村委会搞选举,所有的选民都可以投一票,假定最大值为100票,若投票次数达到100,则不再 投票。设计一个类Voter(name),MAX_COUNT=100
目前类的成员:
1. 变量:静态变量[类变量] 、非静态变量
2. 方法:普通方法、静态方法、构造方法
3. 代码块:普通代码块、静态代码块
4.模板方法设计模式
小参考:https://www.cnblogs.com/throwable/p/9315318.html
模板:就是实现定义好了一些东西,直接拿过来,有些需要改动,有些不需要改动。
设计模式:可以看成是隐性知识,即可以看成是一种经验。好处:可以对我们的代码进行优化,然后一 种更加高效、逼格更高的方式体现出来。
在Java中有23种设计模式,每个模式都有自己的应用场景。
比如:我们要计算某个代码逻辑执行的时间。
优点:
模板方法模式把不变的内容进行了封装,将可变部分的部分由子类实现。在上个例子中如果我们要 添加转帐的业务模式,只需要继承业务抽象类就可以了。
抽象父类提取了公共部分代码,便于维护。
行为统一由父类控制,子类只负责某些方法的细节实现,符合开闭原则。
缺点:
如果模板方法中的骨架需要改变时需要修改抽象类,会牵一发动全身。
实现的子类数目的增多会增加阅读代码的难度。