我总是临时 抱佛脚 临时抱佛脚!
干啥都临时 抱佛脚 临时抱佛脚!
🥹🥹🥹
———————————————————————————————————————————
一、基础
继承,Arrays集合类,String字符串,super语法,方法重写,多态(方法多态、对象多态),equals
二、进阶
static,继承的进阶,多态进阶,包和final,接口,内部类
三、常用api学习
Math,System,Runtime,Object,BigInteger,BigDecima
四、算法
二分,哈希查找,分块,冒泡排序,选择排序,递归算法,快速排序
———————————————————————————————————————————
一、继承
/* extends继承: 1.使用方法例如:public class student extends Person{} 2.java只支持单继承,不支持多继承(只能有一个父类),支持多层继承(子类的父类可以继承于父类的父类,这样递推) 3.java中有个最大父类,Object类,所有类直接或间接继承于Object 一、子类可继承的内容: 构造方法 完全不继承 成员变量 可完全继承 成员方法 可继承非私有 不可继承private (1)构造方法调用: ·可以认为extends父类是将父类的构造方法直接搬入子类中,其方法名仍旧是父类的名,若带参构造便会体现问题 (2)成员变量的使用: ·非私有可以直接使用,private不能直接使用,要通过get&set使用 ·从内存角度,子类在new创建后,继承父类,一同进入堆中,且用同一个地址标记。若以成员变量名直 接调用赋值的形式给private变量赋值,由于被private保护,变量只能被父类本体直接调用修改,所以会报错 所以建议用get&set调用 (3)成员方法的使用: ·首先明白,jvm会将最大父类(除了Object)的常用方法找到并填写进一个虚方法表中,并传承给子类,代代相传 ··虚方法表中,所谓常用方法,就是非private,非static,非final类方法 */ 二、java内存工具(这边配合代码学习) (1) ·打开下面idea的terminal,输入jps,获取当前运行的类的id ·输入内存分析工具jhsdb hsdb,打开 ·File->Atatch to xxxxx的,输入当前运行类的id,打开进程 ·然后打开Tools->Memory Viewer,输入获取到的16进制地址,下面这个代码有误导致不能获得16进制地址 ·然后就可以查询到地址对应的内容了 ··通过分析可以知道,其实private也被继承下来了 (2) ·在刚刚的HotSpotDeBug中Tools打开inspector,查看自解码文件中类的信息 ·将刚刚在memory viewer中查询到的类的具体内容的16进制码直接粘贴到inspector中 ·删掉前八位,并在最前面补一个8,可查询其c++形式的自解码文件 ·可查询到super父类,vtable虚方法表,_java_fields_count成员变量数量等信息
import java.io.IOException;
import java.util.Scanner;
public class MainDraft {
public static void main(String[] args) throws IOException{
Zi z = new Zi();
System.out.println(z);//打印z的地址
Scanner sc = new Scanner(System.in);
sc.next();
}
}
class Fu {
private int a = 0x111;
int b = 0x222;
public void fushow1(){
System.out.println("public Fushow");
}
private void fushow2(){
System.out.println("private Fushow");
}
}
class Zi extends Fu{
int c =0x333;
public void zishow(){
System.out.println("public Zishow");
}
}
三、继承的进阶及细节
/* 继承进阶: 一、语法特点 (1)子类的成员变量的访问特点 ·与往常相同,若无this关键字,则采用就近原则 ·有this关键字,则调用调用者的成员变量(即本类) ·有super关键字(如:super.name),则直接调用父类的成员变量 (2)子类的成员方法的访问特点 ·与往常相同,仍采用就近原则,先局部,再找本类,再找父类 ·this与super关键字仍适用 ·当子类与父类有同名方法时,可以用方法重写 ··用this调用子类方法,用super调用父类方法,称之为方法的重写 ··须用@Override重写注解标注,注解,用来给程序员和虚拟机检查用的,在每个重写前加上注解 ··重写的原理是子类覆盖父类继承下来的虚方法表中同名方法 ··重写注意事项: a.必须与父类的构造完全一致,访问权限必须大于等于父类(空着<protected<public) b.私有方法不能重写,因私有方法不能被虚方法表继承,static同理 (3)子类的构造方法的访问特点 ·父类中的构造方法完全不继承 ·子类的所有构造方法默认先访问父类的空参构造,再执行自己 ·子类的构造方法第一行语句默认是super();。不写虚拟机默认存在,且必在第一行 ·若调用父类的带参构造,必用手动super调用 */