Java内存分析:
栈;堆;方法区(方法区属于堆); 对象:数据管理方式,本质是内存块,包含很多数据。
1. 栈: 后进先出,方法执行的内存模型;
2. 堆: 存储创建好的对象和数组(也是对象) new ;
3. 方法区: 存储类代码信息、常量等。
命名规范:
1)、 项目名全部小写
2)、 包名全部小写
3)、 类名首字母大写,如果类名由多个单词组成,每个单词的首字母都要大写。
如:public class MyFirstClass{}
4)、 变量名、方法名首字母小写,如果名称由多个单词组成,每个单词的首字母都要大写。
如:int index=0;
public void toString(){}
5)、 常量名全部大写
this 是当前对象(但是还没有创建呢 一旦创建就赋值给他)。 创建对象过程如下:
Java包(package)机制作用:
管理类的手段,遇到同名的类,但是不同作用,可以用不同的包(类似Python的库机制)包含,再调用。
常用包:
Java.lang: 核心包,包含Math,String,System,Thread等,不需要导入,直接使用。
Java.awt: 窗口包。
Java.net: 网络包。
Java.util: 普通工具包。
Java.io: IO流,输入输出包。
面向对象三大特性: 继承、封装、多态。
方法重载: 类内实现;
方法重写(覆盖):不同类(继承)的实现。
类构造函数里面 首句必定是 super()
封装: 高内聚,低耦合。尽量将细节在内部,然后外部调用简单些。(类似电视,内部电路,外部遥控器)
多态:
多态: 必须有方法重写,继承,父类引用指向子类对象【父类类型 a = 子类对象】若父类没有这个方法,则不是方法重写,就没有多态了。
static:不可以修饰局部变量;表示强调属性只有1个,与对象无关。
final:表示只能赋值1次,若是数组对象,则地址不可变,元素值可变。(局部 or 全局,全局需要创建类对象才可以使用)
Java:值传递,没有地址传递;但是本质和其他语言有相同之处。例如对于数组对象,值传递的是它的地址。变相地址传递。
声明数组: type[] arr;(推荐使用) type arr[]。
type[] arr = new type[长度];
多态内存分析:
包含抽象方法的类 一定是 抽象类。不可以new 抽象类。
接口 最抽象:只包含 常量、抽象方法。一个类允许多个接口实现,接口允许多继承。
接口中:【常量 默认就是public static final 前缀 】【方法 默认就是 public abstract】【接口需要全部重写方法】
与类设置一样,只有第一个 同文件名的 接口是public的。
callback / hook 【前面知道怎么写,后面知道怎么写,但是中间不知道怎么写】
1. 写入一个父类实现,通过不同的子类重写,从而实现不同的功能。
2. 写入一个抽象类,抽象方法,来实现。抽象类继承必须实现抽象方法(必须实现抽象方法)。
3. 写入一个接口,接口继承实现,必须重写。
内部类:
1. 成员类: 静态内部类 非静态内部类(从属于外部的对象,需要先new创建外部对象,再 new内部类;内部类没有静态函数等 因为非静态内部类从属于外部对象)。
2. 匿名类: 定义创建一起。 new classname(){ ... }
非静态内部类
静态内部类 : 在外部类内,调用静态类,只需要new 就可以调用静态内部类实例。
在外部类外,需要划红线 形式;而与非静态内部类区别,非静态内部类从属于外部实例对象。
try catch finally
在catch这里,越是父类的异常越往后放。
泛型作用:<> 属性各按各的;方法按照父类的。
泛型有4种: 泛型擦除(即父与子都没有泛型object类型)、父类擦除(父没有泛型,子有泛型 object类型)、子类指定类型(子无泛型,父是指定类型;并且必须是父指定类型,子指定类型无所谓)、泛型(子泛型>=父泛型)。
只有这4个,其他的没有,完全按照这个标准来,其他的包含其中,or 子类擦除 没有XXX因为 子类泛型 >= 父类泛型
泛型没有多态【父类引用指向子类对象,子类型继承父类型】; 擦除(泛型擦除/父类擦除,引用对象时,如果不写object类型,则警告,若写了object类型,则其他类型不可以,即:“擦除不会类型检查”)。
=》 泛型擦除
泛型继承:子类类型(泛型) >= 父类类型(泛型,不是具体类型) ###############重要核心##########################
三个点 表示可变参数
子类泛型需要大于等于 父类泛型(不是具体类型)
泛型中 ? 的使用:【实现类似多态的功能】