java类中仅有5大成分:
成员变量 成员方法 构造器 代码块 内部类
this关键字:
当前对象引用
访问兄弟构造器
super关键字:
父类对象引用
访问父类构造器
继承:
子类不能继承父类的构造器,子类有自己的构造器
子类不能继承父类的静态成员,因为静态成员只有一份
子类可以继承父类的私有成员,但无法直接访问
继承后的同名情况:
成员变量同名,子类优先访问自己对象中的成员变量
用super访问父类成员变量
成员方法同名,子类优先调用自己的方法
用super访问父类成员方法
方法重写:
需要返回值类型(或者是父类方法返回值类型的子类),方法名,参数列表都相同
子类重写方法的修饰符权限>=父类方法权限
子类重写方法抛出的异常应与父类一样或者是父类抛出异常的子类
super与this:
子类构造器的第一行默认有无参的super()调用父类构造器
super()与this()都必须是在构造方法的第一行,不能同时出现
super(…)根据参数匹配确定调用哪个构造器
构造器中用this(…)也是利用参数匹配调用其他兄弟构造器
抽象方法:
只有方法形式,但没有方法体的方法
抽象类:
拥有抽象方法的类就是抽象类
抽象类本身也需要abstract修饰,作用是让子类继承重写抽象方法
有得有失:
得到了拥有抽象方法的能力
失去了创建对象的能力
接口:
更彻底的抽象
接口中全是抽象方法和常量
接口中的抽象方法默认自动加上public abstract,程序员无需自己手写
接口中的常量默认会加上public static final(接口中定义的成员变量实际是一个常量)
jdk1.8后接口新增了三个方法(静态方法,默认方法)
jdk1.9后增加了私有方法
实现类中若没有重写所有的抽象方法,则该类必须被定义为抽象类
接口与接口之间可以多继承,也就是把其他接口抽象方法与本接口进行了合并
接口的默认方法(实例方法):
default修饰,不可以省略,供子类调用或者子类重写
接口的静态方法:
static修饰,供接口本身直接调用
接口的私有方法:
供接口中的默认方法或静态方法调用
静态代码块与实例代码块:
静态代码块当程序启动时先执行一次
实例代码块与对象初始化一起加载(提取到构造器中执行)
final修饰类,方法,变量:
修饰类:不能被继承
修饰方法:不能被重写
修饰变量:有且只能被赋值一次
单例模式的实现步骤:
构造方法私有化
在类的内部产生一个唯一的实例化对象,并封装为private static类型
定义一个静态方法返回这个唯一对象
饿汉式单例模式:
使用类的时候对象已经创建完毕,先创建再说
懒汉式单例模式:
调用getInstance()方法时实例才被创建,不着急
枚举类:
枚举类的本质是一个类;
枚举类定义的是static final类型的对象
枚举类构造器默认是私有的,不能在外部创建对象
多态:
编译看左边(引用的方法是不是父类定义了的)
运行看右边(子类重写同名方法)
引用类型转换:
父类的引用不能调用子类的特有方法
解决方法:向下转型
注意:多态的本身是向上转型的,是一个默认的过程;
为了避免类型转换的问题,使用instanceof关键字
A true
AA – aa true
AAA false
(A AA AAA 是爷 父 孙的关系 aa是AA对象)
if(aa instanceof x) :结果看上面
内部类:
静态内部类:定义在成员位置
有static修饰,属于外部类本身,用法与其他类完全一样,
访问时候加上 外部类.内部类
静态内部类可以直接访问外部类的静态成员
创建对象:
外部类.内部类 变量 = new 外部类.内部类构造器
实例内部类:
定义在成员位置
无static修饰,属于外部类对象
使用格式 外部类.内部类
创建对象:
外部类.内部类 变量 = new 外部类().new 内部类构造器
注意:
实例内部类不能定义静态成员
实力内部类可以直接访问外部类的私有和静态成员
内部类访问外部类对象的格式:外部类名.this
局部内部类:定义在方法中的类
匿名内部类:一般定义在方法或者可执行代码
本质是一个带具体实现的父类或者父接口的匿名子类对象
要定义一个只要使用一次的类,考虑匿名内部类
权限修饰符:
public:不同包的无关类可以访问
protected:不同包的子类可以访问
缺省:同一个包中的类
private:同一个类
Object类:
public String toString():返回该对象的字符串表示
public boolean equals(Object obj):指示其他某个对象是否与此对象相等
默认是比较对象的地址
要根据成员变量相同判定对象相等,需要重写equals方法
public static boolean equals(Object a, Object b):
优化了空指针异常问题
static boolean isNull(Object obj):
快捷键:alt+insert
Date()与DateFormat()类:
DataFormat:时间格式化子类的抽象类
可以在Date与String之间来会转换
public SimpleDateFormat(String pattern):
用给定的模式构造
y–年 M–月 d–日 h–时 m–分 s–秒
常用方法:
public String format(Date date):Date对象格式化为字符串
public Date parse(String source):字符串解析为Date对象
Calendar类
抽象类
用子类GregorianCalendar()创建对象
方法:
直接创建GregorianCalendar对象
通过Calendar的静态方法getInstance()获取对象
public int get(int field):
用Calendar定义的常数表示
Calendar.YEAR
public void set(int field,int value):
设置某个字段的值
public void add(int field,int value):
为某个字段增加或者较少值
正则表达式:
语法:
[abc]:代表a或者b或者c中的一个
[^abc]:代表除了a,b,c以外的任何字符
[a-z]:代表a-z所有小写字符中的一个
[A-Z]:代表A-Z所有大写字符中的一个
[0-9]:代表0-9之间的某一个数字字符
[a-zA-Z0-9]代表a-z或者A-Z或者0-9中的任意一个字符
逻辑运算符:
&&:并且
|:或者
预定义字符:
. 匹配任何字符
\d 任何数字0-9的简写
\D 任何非数字的简写
\s 空白字符简写
\S 非空白字符简写
\w 单词字符简写
\W 非单词字符
str.matchs(reg):判定字符串是否满足正则表达式
数量词
X?:0次到1次
X*:0次到多次
X+:1次到多次
X{n}:恰好n次
X{n,}:至少n次
X{n,m}:n到m次
String中的String[] split方法就是以正则表达式作为分隔符
包装类:
Integer类与int的转换
Integer.valueOf(int i)
i.intValue()
String与基本数据类型的转换
String.valueOf()
String.parsexxx()
泛型:
定义含有泛型的类:
class ArrayList[HTML_REMOVED]{
(E e)
}
创建对象时候确定类型
含有泛型的方法:
public [HTML_REMOVED] void show(E a)
{
}
调用方法时确定
含有泛型的接口:
interface JIekou [HTML_REMOVED]{
}
1.定义类时确定泛型
2.创建对象时候确定
泛型通配符:
传递数据过程中,泛型类型不确定,通过通配符<?>表示。
Java泛型可以定义上限和下限!
<? extends 类> 表示接受该类型及其子类
<? super 类> 表示只能接受该类型及其父类
Collection集合:
基本方法
add(E e)
remove(E e)
contains() inEmpty() size() toArray()
iterator():获取集合对应的迭代器
常用方法:
next() hasNext()
List接口
有序
可以随机存储!
get set方法
Set接口保证数据不重复
TreeSet可以根据Comparator比较器进行排序
正序规则:比较者 > 被比较者 为正
Collections集合工具类
shuffle sort
Map 键唯一 不重复
HashMap不保证存取一致
LinkedHashMap 存取一致
常用方法:
put() remove(key) get() keySet() entryset()(getkey getvalue) containKey()
多线程:
Thread构造器可以接受空参或者Runnable接口参数
方法:
getName() start() run() sleep() currentThread()
实现多线程的方式:
一.继承Thread
二.实现Runable接口,并将Runnable对象传递给Thread
三.实现Callable接口
Synchronized可以锁代码块,方法
Lock lock = new ReentrantLock();
lock.lock() lock.unlock()
线程池:
ExecutorService(接口)
静态方法:newFixedThreadPool(int nThreads):
submit(Runnable task):获取线程池中的某一个线程对象
字节输出/入流与字符输出/入流:
注意其中的关系
反射获取类对象:
类名.class
对象名.getClass()
Class.forName(“类全名”)
常用方法:
getSimpleName():获取类名字符串
getName():获取类全名