8个基本数据类型:byte short int long char float double boolean
switch的参数类型:byte\short\int\char\string\enum
java注释:单行// 多行/* */ 文档/** **/
访问修饰符:private 类内可见 default 同包可见 protected 同包+子类可见 public 所有类可见
final: 修饰类-不可继承 修饰方法-不可重写 修饰变量-引用指向地址不可变,但内存保存的内容是可变的
finally:异常捕捉的一部分,一般和try/catch一起使用,用来放无论是否报异常,都会执行的代码
finallize:object类的方法,由垃圾收集器调用,作为垃圾是否可以回收的最终判断
this: 相当于指向本身的指针 1、调用自身的属性和方法 2、形参名称和属性名相同时,用this进行区分 3、this()执行构造方法
super 相当于指向父类的指针 1、调用父类的属性和方法 2、子类和父类属性和方法名称相同时,用super区分 3、super()执行父类构造方法
static 创建独立于类对象实例的属性,可以修饰变量、方法、代码块、内部类、静态导包。 在类加载时就进行内存分配和初始化,并只分配和初始化一次。因此可以用来提高程序效率,一般只需要执行一次的代码,可以用static修饰(*util类等)。 独立于类对象存在,可以直接通过类名.静态变量的方式调用。
流程控制 break 跳出当前循环,不再继续循环 continue 跳过本次循环,继续下一次循环 return 方法结束,返回调用方法的地方
面向对象: 面相对象有封装、继承、多态等特点,可以实现程序的低耦合,因此便于维护、复用和扩展。 效率比面相过程低
封装:把一个类的属性进行私有化,并对外提供给属性赋值和获取的方法
继承:通过子类对父类的继承,可以实现父类代码的复用,同时子类可以根据需要进行扩展
多态:多态分为重写和重载,重写是子类继承父类,可以对父类的方法重写;重载是同一个类中,允许存在方法名相同,方法参数不同的方法,参数不同包括参数个数、类型和顺序。
抽象类与接口
相同点: 1、都不能实例化 2、都含有抽象方法 3、都位于程序的顶端,提供给子类继承或者实现
不同点:
抽象类 接口
abstract修饰 interface修饰
属性定义任意 默认staticfanal修饰
方法访问修饰符任意 默认public,不能用private和protected
可以有抽象方法和非抽象方法 所有方法必须是抽象的
子类继承抽象类用extends 子类实现接口用implement
只能继承一个抽象类 可以实现多个接口
普通类和抽象类:普通类不能有抽象方法,可以实例化 抽象类可以用抽象方法,不能实例化
成员变量与局部变量
成员变量 局部变量
1、定义在类中,方法外 定义在类的方法内部
2、作用域为整个类 作用域为方法内部
3、生命周期,随对象的创建而创建,对象的回收而回收 随着方法的执行而创建,方法执行完销毁
4、存在堆中 存在栈中
5、初始值:有初始值 无初始值,调用的时候必须赋值
无参构造函数的作用: 子类继承父类,在执行子类初始化方法时,如果没有明确通过super调用父类的指定构造函数时,会默认调用无参的构造函数,如果父类没有无参构造函数,此时会有问题。
构造方法的左右 初始化 当没有写构造函数时,会默认有无参构造函数
构造函数的特点 1、名称和类名相同 2、没有返回值,但是不能用void修饰 3、生成对象时自动执行,不需要调用
内部类
成员内部类、局部内部类、静态内部类、匿名内部类
成员内部类:定义在类中,方法外的非静态的内部类 可以访问外部类的所有属性和方法、包括静态与非静态、公有和私有。 创建方式:外部类实例.new 内部类()
局部内部类:定义在类内部的方法内部的类 非静态局部内部类,可以访问外部类所有属性和方法;静态的局部内部类,只能访问静态属性和方法。 创建方式,在方法内 new 内部类();
匿名内部类:没有类名的内部类 1、必须继承抽象类或实现接口 2、不能有静态变量和方法 3、参数必须用final修饰 4、不能是抽象类,必须实现继承的类或实现的接口的所有方法
创建方式:new 抽象类\接口{ 具体实现 } 不能有静态变量和方法(调用静态类和方法,是通过类名.静态属性或方法,内部类没有类名,无法调用) 参数必须是final(主要是生命周期的问题,局部变量存在栈中,随着方法的创建和执行完而生成和销毁,当方法执行完,局部变量销毁时,如果此时内部类调用局部变量,就会有问题,因此将局部变量用final修饰。JDK1.8之后,会自动提我们把匿名内部类用到的参数用final修饰。)
静态内部类:用static修饰的内部类,静态内部类只能访问外部类的静态变量 创建方式:new 外部类.内部类()
内部类的优点 1、内部类可以访问外部类的内容,包括私有属性和方法 2、内部类具有封装性 3、内部类可以实现“多继承” 4、匿名内部类方便定义回调
内部类的场景 1、多算法的场合 2、解决一些非面相对象的语句 3、当一个类只需要被外部类所使用时 4、适当的内部类,使得代码更加灵活和富有可扩展性
重写与重载 构造方法不能被继承,所以不能被重写,但可以重载
==和equals的区别 ==是比较的内存地址,用来判断两个比较对象是否为同一个对象 equals分两种情况:
1、类没有重写equals方法时,equals等同于==;
2、类重写了equals方法是,一般通过比较两个对象的内容是否一致来判断是否equals,重写了equals必须重写hashcode方法。
什么是hashcode:hashcode是在object定义的方法,所以所有的java类都有hashcode方法。hashcode方法是用来获取hash码也叫散列码的方法。实际返回的是一个int类型的数字,用来记录对象在hash表中的索引位置。hash表是通过键值对的方式存储的,可以 通过key快速的找到对应的值。
为什么要用hashcode:以hashset为例,往hashset里添加元素时,会先获取对象的hashcode,并判断hashcode所在位置是否已存了对象,当没有存在对象时,即可将对象存入hashset中,当hashcode已存在时,再进行equals判断 对象是否真的已存在,如果equals为false时,将对象散列到别的位置,当equals为true时,加入失败。通过这种方式,可以大大的减少equals的次数,从而提高加入hashset的效率。
hashcode和equals的规定 1、如果两个对象相等,则hashcode相同 2、如果两个对象相等,则equals返回true 3、两个对象的hashcode相同,对象不一定相等
为什么重写了equals必须重写hashcode:java规定,两个对象相等时,hashcode必须相同。当我们重写了equals,假如改成了通过比较对象的内容来判断equals是否返回true,当equals返回true时,表示两个对象相等,但是由于hashcode没有重写,计算的还是对象所在内存的hashcode,则此时在两个对象相等的情况下,hashcode不同,违反了java的规定。
值传递 java只有值传递,当对象实例作为参数时,实际传入的为对象引用的拷贝。方法可以修改参数的指向,但因为是操作的副本,因此不会影响方法调用者中的引用。
JAVA 常用包
java.lang 基础类
java.io 输入输出
java.nio java.io的 补充
java.util 工具类
java.net 网络相关
java.sql 数据库相关
反射:java可以在运行时,动态地获取类的所有属性和方法,并且调用这些属性和方法,这种动态获取的机制就叫反射机制
静态编译,是指编译时,确定类型绑定对象 动态编译,是指运行时,确定类型绑定对象
反射的优点,可以动态的获取类的所有属性和方法,包括私用属性和方法,编程更为灵活
场景: 1、反射机制是框架的灵魂 2、jdbc通过class.forName获取驱动 3、spring读取xml或者properties的信息,通过反射机制获取类信息 4、可以动态地配置实例的属性 5、JDK反向代理
创建方式 1、对象实例.getClass() 2、Class.forName(XXX.类名) 3、类名.class
获取私有方法:instance获取目标类实例,getDeclaredMethod获取方法,setAccessible(true)取消访问检查,invoke执行方法
String:
字符串常量池:字符串常量池是堆内存中的一块区域,用来保存字符串。当创建一个字符串对象时,会先在常量池中,寻找该字符串是否已创建,如果已创建 则将已创建的字符串的引用返回,若未创建,则创建一个字符串,并返回引用,通过这种方式,可以节省内存空间 string的特点: 1、不可变,对string的任何操作,实际是生成新的string对象,并将新的对象的引用返回 2、字符串常量池优化,即创建时会先判断字符串常量池中是否已存在 3、final修饰,不可继承(原因:1、实现字符串常量池;2、线程安全问题;3、实现hashcode的不可变性)
string a = new String("aaa");会生成两个对象,一个是字符串常量池的aaa,另外一个是堆中的aaa,并返回堆中aaa的地址
字符串反转:reverse()
常用方法:indexOf trim splite equals tolowercase touppercase substring replace
hashMap的key用string的好处: hashMap的实现是通过hashCode作为KEY来确定value存储位置,因为字符串是不可变的,所以在计算hashCode的之后,可以进行缓存而不需要重新计算,因此效率比别的对象快。