- 小数比较时使用BigDecimal.equal精确
- 逻辑与&&逻辑或|采取短路运算从左到右运算,确定值就不会往下运算
- long型定义后需要加L
- float型定义后需要加f
- 默认初始化int为0,boolean型为false,引用类型默认为null
- java中比较时两个变量是否相等有两种方法。其中 == 必须要求内存地址和内容完全相等才为真,而equal只要内容相等即为真,不用地址相同
- foreach循环用于读取数组元素的值,不能修改元素的值
- new返回的是对象地址
- import static package.* 将报名为。。下的静态方法或静态常量导入
- java不支持多继承(即一个类不能同时继承多个类)但是使用 implements 关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)。
- final 关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写。被声明为 final 类的方法自动地声明为 final,但是实例变量并不是 final
- final声明类:final class 类名 {//类体}
- final声明方法:修饰符(public/private/default/protected) final 返回值类型 方法名(){//方法体}
- instanceof是二元运算符,左边是对象右边是类,当对象是类的实例化时返回true,否则返回false
- Switch语句:case标签必须是整数(byte,short,char,int)或者枚举,不能是字符串(JDK7.0可以使用字符串)
- 高内聚:类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用,尽量方便外部调用。
- 标签outer用法,用于退出循环
内存分析
栈:
- 栈是方法执行的内存模型,每个方法调用创建一个栈帧(存储局部变量、操作数、方法出口)
- jvm为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量)
- 栈属于私有,不能实现线程间共享
- 栈是由系统自动分配的一块连续的内存空间
堆
- 堆用于存放创建好的对象和数组(数组也是对象)
- jvm只有一个堆,被所有线程共享
- 堆是一个不连续的内存空间,分配灵活但速度慢
方法区(静态区)
- jvm只有一个方法区,被所有线程共享
- 方法区实际也是堆,用于存储类、常量相关的信息
- 用来存储程序中永远不变或唯一的信息(类信息、静态变量、字符串常量)
1、构造器如果没有自己写系统会自动添加,但是写了系统便不会添加
2、方法调用时,匹配离得最近的类型
this用法
1、区别二义性:在构造函数中当给类的变量初始化时,构造函数中的参数名和这个变量相同时,可以用this使用类的变量。
2、在构造器中调用另一个构造器使用this(参数…)且必须放在第一句
3、this不能用于static方法中
super用法
- 可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类
- 子类的方法覆盖了父类的方法时可以通过super.function()调用父类的方法
- super 语句必须是子类构造方法的第一条语句。不能在子类中使用父类构造方法名来调用父类构造方法。 父类的构造方法不被子类继承。调用父类的构造方法的唯一途径是使用 super 关键字,如果子类中没显式调用,则编译器自动将 super(); 作为子类构造方法的第一条语句。
- 子类的所有构造方法内部, 第一行会(隐式)自动先调用父类的无参构造函数super();
如果子类构造方法第一行显式调用了父类构造方法,系统就不再调用无参的super()了。 - 子类不能直接继承父类中的 private 属性和方法,
static
- static修饰的成员变量、方法从属于与类
- static方法中不可以访问非static的成员
- static语句块比构造器的先执行,先加载类才会有构造函数。
- static方法中不能有this和super。
final
- final修饰类中的方法:可以被继承,但继承后不能被重写
- final修饰类:类不可以被继承
- 例如:类中有一个属性是 final Person p=new Person(“name”); 那么你不能对 p 进行重新赋值,但是可以改变 p 里面属性的值 p.setName(‘newName’);
访问权限修饰符
- private:私有,只有自己可以访问
- default:表示没有修饰符修饰,只有同一个包的类才能访问
- protected:表示可以被同一个包的类以及其他包的子类访问
- public:表示可以被项目的所有包的所有类访问。
造型
- 向上造型:把new出来的子类赋值给父类引用,不需要强制转换: Father f1 = new Son()
- 向下造型:把new出来的父类赋值给子类引用,需要强制转换:Father f2,Son s2 = (Son)f2