仓库
.java源文件通过编译形成 .class字节码文件,再通过在不同平台上的JVM执行字节码文件
JDK:development kit(开发包)
JRE:runtime environment(运行环境)
包名:字母都小写;
类名、接口名:多单词组成,首字母大写;
变量名、方法名:首字母小写,驼峰命名;
常量名:多单词下划线链接;
byte short int(默认) long(加L) char boolean float(加f) double(默认)
8 bit 16 32 64 16 1 32 64
自动转换的逆过程;
short short1= (short) aLong;
int int1= (int) aLong;
字符串通常不能直接转换为基本类型,但通过基本类型对应的包装类可以实现字符串转成基本类型(Integer.parseInt(“123”,Integer.valueOf(s),valueOf() 方法里先调用parseInt()));
boolean类型不能转成其他类型;
//静态初始化
int arr2[]=new int[]{1,2,3,4,4,2};
int[] arr3={1,2,3,4,4,2};
//动态初始化
int[] arr1=new int[10];
arr1[0]=1;
//静态初始化
int[][] arr4=new int[1][4];
//动态初始化
int[][] arr5=new int[3][];
最大、最小、平均、总计
复制
//1 clone()
int[] a1=arr.clone();
//2 System.arraycopy(原数组, 原数组的开始位置, 目标数组, 目标数组的开始位置, 拷贝个数)
int[] a2=new int[10];
System.arraycopy(arr, 0, a2, 0, 3);
//3 Arrays.copyOf(原数组,拷贝的个数)
//Arrays.copyOf底层其实也是用的System.arraycopy
int[] a3=Arrays.copyOf(arr,10);
//4 Arrays.copyOfRange(原数组,开始位置,拷贝的个数)
//Arrays.copyOfRange底层其实也是用的System.arraycopy,只不过封装了一个方法
int[] a4=Arrays.copyOfRange(arr,0,arr.length);
排序
Arrays.sort(arr);
类、接口、数组;
如果低级类型为char型,向高级类型(整型)转换时,会转换为对应ASCII码值
算术运算符 +,-,++,–,*,/,%,
赋值运算符 =,+=,-=,*=,/=,%=
比较运算符 ==.!=.<,>,>=,<=
逻辑运算符 & && | || ! ^
位运算符 >> << >>> & ~ | ^
"<<"左移 m<
">>"右移 m>>n => m*2^-n
“>>>” 无符号右移
“&”与 6&3=2
“|”或 6|3=7
“^”异或 6^3=5
"~"反码 ~6=-7
三元运算符
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NDYjROF6-1579225422411)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200106172403557.png)]
顺序
Java中定义成员变量时采用合法的前向引用;
分支
if-else和switch两种;
循环
while、do-while、for三种。jdk1.5后还有foreach循环。
面向对象的基本思想是,从现实世界中客观存在的事物出发构建软件系统,并在系统的构建中,尽量用人的思维。
面向过程强调的是功能行为;面向对象强调具备了功能的对象;
面向对象的三大特性
对象时计算机语言对问题域中的十五的描述,“属性”和“方法”对于事物的静态属性和动态属性;
类是用于描述同一类型对象的一个抽象概念,类中定义了这类对象的静态属性和动态属性;
类是一类对象的模板,对象可以看成该类的一个具体实例;
除了基本类型之外的变量类型都是引用类型。Java中的对象都是通过引用对其操作的。
注意:
private<缺省 ·不定义对象的句柄,直接调用该对象的方法。 同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同或顺序不同即可。 与返回值类型无关,只看参数列表,且参数列表必须不同; 可变参数:方法参数部分指定类型的参数个数是可变个数; 声明方式:方法名(参数类型名…参数名); 可变参数方法的使用和方法参数部分使用数组是一致的; 方法的参数部分有可变形参,需要放在形参声明的最后; 作用: 在子类中对从父类继承来的方法进行改造,也称方法的重置、覆盖; 要求: 注意: 初始化顺序:默认初始化——>显式初始化—— >构造函数初始化(没父类)看起来实际构造器是先加载的,先会进行父类的的初始化,在super对父类进行初始化完毕后,才会进行子类的成员变量显式初始化。 父类静态代码块 =》子类静态代码块 =》父类显式初始化(构造代码块)=》父类构造方法 =》子类显式初始化(构造代码块)=》子类构造方法 两种体现: 引用变量有两个类型:编译时类型和运行时类型。编译时类型有声明变量时使用的类型决定;运行时类型有实际赋给该变量的对象决定;由此不一致时就出现多态。 字符串与基本数据类型 在Java类中,可用static修饰属性、方法、代码块、内部类;由该类所有对象共享; static方法内部不能有this(或super); 被修饰后具备以下特点: 我们 JDK 中,java.lang.Runtime 就是经典的单例模式(饿汉式); 解决方案如下: 对Java对象进行初始化; 程序执行顺序: 声明成员变量的默认值》显式初始化、初始化块》构造器再对成员赋值; 静态代码块:初始化类的静态属性; 非静态代码块 用abstract关键字修饰类为抽象类; 用abstract关键字修饰方法为抽象方法; 含有抽象方法的类必须声明为抽象类,抽象类可以没有抽象方法; 抽象类不能被实例化,抽象类是用来被继承的;抽象类的子类必须重写父类的抽象方法,并提供方法体。若没有重写全部抽象方法,则仍为抽象类; 不能用abstract修饰属性、私有方法、构造器、静态方法、final方法; 抽象类是用来模型化那些父类无法确定全部实现,而是由其子类提供具体实现的对象的类; 为什么抽象类不可以使用final关键字声明? 抽象类不能实例化,是用来被继承的; 一个抽象类中可以定义构造器吗? 抽象类可以有构造方法,只是不能直接创建抽象类的实例对象而已; 抽象类体现的就是一种模板模式的设计,抽象类作为模板,子类在抽象类的基础上进行拓展、改造,但子类总体会保留抽象类的行为方式; 解决的问题: 有了接口可以得到多重继承的效果; 接口是抽象方法和常量值的定义的集合; 从本质上看,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现; 实现接口类: 一个类可以实现多个接口,接口也可以继承其他接口; FactoryMethod 模式是设计模式中应用最为广泛的模式; 它通过面向对象的手法,将所要创建的具体对象的创建工作延迟到了子类,从而提供了一种扩展的策略,较好地解决了这种紧耦合的关系; 参考blog 分类: 内部类作为类的成员 内部类作为类可以声明为abstract类,因此可以被其他的内部类继承; 变相实现多重继承; 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。 这些异常有的是因为用户错误引起,有的是程序错误引起的,还有其它一些是因为物理错误引起的。 要理解Java异常处理是如何工作的,你需要掌握以下三种类型的异常: Exception 类是 Throwable 类的子类。除了Exception类外,Throwable还有一个子类Error 。 所有的异常类是从 java.lang.Exception 类继承的子类。 异常类有两个主要的子类:IOException 类和 RuntimeException 类。 Java异常处理:Java采用异常处理机制,将异常处理的程序代码集中在一起。 如果一个方法没有捕获到一个检查性异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法签名的尾部。 也可以使用 throw 关键字抛出一个异常,无论它是新实例化的还是刚捕获到的。 使用 try 和 catch 关键字可以捕获异常。try/catch 代码块放在异常可能发生的地方。 try/catch代码块中的代码称为保护代码 Java集合框架主要包括两种类型的容器,一种是集合(Collection),另一种是图(Map)。 同collection接口; 按Hash算法来存储集合中的元素; 当向HashSet集合中存入一个元素时,会调用给对象的hashCode()方法来得到该对象的hashCode,然后根据hashCode决定该对象在HashSet中的存储位置; 如果两个元素的equals()方法返回true,但他们的hashCode()返回值不相等,hashSet将会把它们存储在不同的位置,但依然可以添加成功。 TreeSet是SortedSet接口的实现类,TreeSet可以确保集合元素处于排序状态。 TreeSet支持两种排序方法:自然排序和定制排序。默认为自然排序; 定制排序:在创建TreeSet集合对象时,提供一个comparator接口的实现类对象,由该对象负责集合元素的排序逻辑。其在类不可以修改时使用; 在使用定制排序或是自然排序时,在其用到的类中都要重写hashCode()与equals()方法。 区别: 例子: 同collection接口, 区别: 与HashSet一样不能保证key-value对的顺序; 类似TreeSet,存储时根据Key对键值对进行排序; 自然排序:要求所有Key实现java.lang.Comparable接口并重写compareTo(Object obj)方法。在此方法中,指明按照自定义类的哪个属性进行排序,然后将集合按升序排列; 定制排序:在创建TreeSet集合对象时,提供一个comparator接口的实现类对象,由该对象负责集合元素的排序逻辑。其在类不可以修改时使用; 在使用定制排序或是自然排序时,在其用到的类中都要重写hashCode()与equals()方法。 排序: 查找、替换: 同步方法: Collections类中提供了多个synchronizedXXX()方法,可使将指定集合包装成线程同步的集合; 只有指定类型才可以添加到集合中,类型安全; Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生classcatException异常。同时代码更加简洁、健壮。 Java中的泛型只在编译阶段有效。在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦除,并且在对象进入和离开方法的边界处添加类型检查和类型转换的方法。也就是说,泛型信息不会进入到运行时阶段。 一个类的对象是有限而且固定的 继承方式和实现方式的联系和区别: 实现方法的好处: 例子: Java.lang.Object提供的这三个方法只有在synchronized方法或代码块中才能使用,否则会报java.lang.illegalMonitorStateException异常; 使用wait()与notify()方法进行通信; java.io.File类的使用; IO原理及流的分类; 文件流(基于文件) FileInputStream / FileOutputStream / FileReader / FileWriter; 缓冲流(基于内存) BufferedInputStream / BufferedOutputStream / BufferedReader / BufferedWriter; 转换流 InputStreamReader / OutputStreamWriter 标准输入/输出 打印流(了解) PrintStream / PrintWriter 数据流(了解) DataInputStream / DataOutStream 对象流 ----涉及序列化、反序列化 ObjectInputStream / ObjectOutputStream 随机存取文件流 RandomAccessFile 通过程序把一个图放到一个文件夹,把图片转化为一个数据集(例如二进制),把这些数据一点一点传到文件夹,类似水的流动,称这个整体的数据集是一个数据流; 文件和目录路径名的抽象表示形式,与平台无关; File能新建、删除、重命名文件和目录,但不能访问文件内容本身;如果需要访问文件内容本身,需要使用输入输出流; File 对象可以作为参数传递给流的构造函数; File类的常见构造方法: public File(String pathname);//绝对路径或相对路径; public File(String parent,String child);//parent为父路径,child为子路径创建File对象; 文件字节输入流 文件字节输出流 字节流复制文件 BufferedInputStream和BufferedOutputStream; BufferedReader和BufferedWriter; 提供了在字节流和字符流之间的转换; InputStreamReader和OutputStreamWriter; 字节流中的数据都是字符时,转成字符流操作更高效; 构造方法: InputStreamReader(InputStream in); InputStreamReader(InputStream in,String charsetName); 反射机制,就是通过一个抽象的类名能够在加载类的内存中找到相匹配的类的具体信息。 Reflection是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能够直接操作任意对象的内部属性和方法; 在Object类中定义了以下方法,次方法将被所有子类继承: Class类是java反射的源头,可以通过对象反射求出类的名称;对随意的类进行高度的抽象,形成一个可以描述所有类的类; 通过类的class属性获取;Class c=String.class 调用实例的getClass()方法;Class c=p.getClass(); 已知类的全类名,Class.forName()方法;Class c2=Class.forName(“com.yty.demo._4_oop.Person”); 通过ClassLoader获取 ClassLoader cl=this.getClass().getClassLoader(); Class c=cl.loadClass(“全类名”); 实现的全部接口;Class[] superI=c.getInterfaces(); 所继承的父类;Class superC=c.getSuperclass(); 全部的构造器;Constructor[] constructor=c.getConstructors(); 全部的方法; Method[] methods1=c.getMethods(); Method[] methods2=c.getDeclaredMethods(); 全部的Field; Field[] fields1=c.getFields(); –自身及继承的public属性 Field[] fields2=c.getDeclaredFields(); –自身的所有属性 类所在的包 Package getPackage(); proxy:专门完成代理的操作类,是所有动态代理的父类。通过此类为一个或多个接口动态的生成实现类。 创建一个动态代理类所对应的Class的对象; 当代理对象调用真实对象的方法时,其会自动的跳转到代理对象关联的handler对象的invoke方法来进行调用。 1=c.getMethods(); Method[] methods2=c.getDeclaredMethods(); 全部的Field; Field[] fields1=c.getFields(); –自身及继承的public属性 Field[] fields2=c.getDeclaredFields(); –自身的所有属性 类所在的包 Package getPackage(); proxy:专门完成代理的操作类,是所有动态代理的父类。通过此类为一个或多个接口动态的生成实现类。 创建一个动态代理类所对应的Class的对象; 当代理对象调用真实对象的方法时,其会自动的跳转到代理对象关联的handler对象的invoke方法来进行调用。
成员变量和局部变量的区别
匿名对象
System.out.println(new Teacher().showInfo());
面向对象思想“落地”法则(一)
方法的重载(overload)
//函数重载
public int reload(){
System.out.println("reload 1");
return 0;
}
public void reload(int x,float f){
System.out.println("reload 2");
}
public void reload(float f,int x){
System.out.println("reload 3");
}
方法的可变个数形参
/**
* 可变个数形参,与数组的使用方式相同
*/
public void printInfo(int i,String...args){
for (String s:arg){
System.out.println(s);
}
}
方法的参数传递
package关键字
import 语句
JDK中主要的包
封装和隐藏
this关键字
JavaBean
static关键字
类的继承
方法的重写(override)
super关键字
this与super的区别:
简单类对象的实例化过程
子类对象的实例化过程
public class Children extends Father{
private String hobby="篮球";//显式初始化在父类构造方法执行结束后进行
// private Children children=new Children();//java.lang.StackOverflowError
static {
System.out.println("2-子类静态代码块");
}
{
System.out.println("5-子类构造代码块");
}
Children(){
System.out.println("6-子类构造方法");
}
public Children(String hobby) {
this.hobby = hobby;
}
public void show(){
System.out.println("7-子类show");
}
public static void main(String[] args) {
Children children=new Children();
children.show();
}
}
class Father{
int age=20;
static {
System.out.println("1-父类静态代码块");
}
{
System.out.println("3-父类构造代码块");
}
Father(){
System.out.println("4-父类构造方法");
}
public void show(){
System.out.println("父类show");
}
}
/*
1-父类静态代码块
2-子类静态代码块
3-父类构造代码块
4-父类构造方法
5-子类构造代码块
6-子类构造方法
7-子类show
* */
final关键字
多态
虚拟方法调用
Father children=new Children();
children.show();
x instanceof A
Object类
对象转型
== 与equals
包装类
int i=new Integer("123");
int i1=Integer.valueOf("123");//本身调用了paseInt()方法
int i2=Integer.parseInt("123");
String s1=String.valueOf(2.34f);
static关键字
单例设计模式
/**
* 饿汉式
*/
public class Singleton {
private static Singleton instance=new Singleton();
//private 只有内部可以实例化
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
/**
* 懒汉式 实例延迟加载
*/
class Singleton2{
private static Singleton2 instance=null;
private Singleton2(){}
public static Singleton2 getInstance(){
if(instance==null){
instance=new Singleton2();
}
return instance;
}
}
/**
* 双重加锁机制
*/
class Singleton3{
private static volatile Singleton3 instance=null;
private Singleton3(){}
public static Singleton3 getInstance(){
if(instance==null){
synchronized (Singleton3.class){
if(instance==null) {
instance = new Singleton3();
}
}
}
return instance;
}
}
/**
*静态内部类
*/
class Singleton4 {
private static class SingletonHoler {
/**
* 静态初始化器,由JVM来保证线程安全
*/
private static Singleton4 instance = new Singleton4();
}
private Singleton4() {}
public static Singleton4 getInstance() {
return SingletonHoler.instance;
}
}
破坏单例模式的三种方式:
1、防止反射
定义一个全局变量,当第二次创建的时候抛出异常
2、防止克隆破坏
重写clone(),直接返回单例对象
3、防止序列化破坏
添加readResolve(),返回Object对象main方法
final关键字 (类、属性、方法)
初始化块
/**
* 匿名内部类--没有类名的Person类的子类,也就是匿名的Person的子类;
* 这种类没有类名,就不能显式的new的方法创建对象,如果要是还有在构造器中
* 初始化属性就没有办法了,这样情况就要用代码{}初始化的工作;
*/
Person p=new Person(){
{//用代码块代替构造方法,父类构造代码块-父类构造方法-子类构造代码块-子类构造方法
super.setName("李四");
}
@Override
public void showName() {
super.showName();
}
};
p.showName();
抽象类
public abstract class AbstratTest {
private int anInt=0;
public abstract void method1();
public void method2(){
System.out.println("1");
}
}
class subTest extends AbstratTest{
@Override
public void method1() {
System.out.println("实现了抽象方法");
}
}
模板方法设计模式
接口
class SubClass implements InterfaceA
接口的特点
public interface InterfaceA {
int ID=0;//默认为 public static final 修饰
void start();//默认为 public abstract 修饰
}
//只能继承一个类,可以implements实现多个接口,接口也可以extends继承其他接口;
//类定义 先写继承后写实现
public class SubClass extends classA implements InterfaceA,InterfaceB {
public SubClass(int age) {
super(age);
}
@Override
public void start() {
System.out.println("subClass start");//继承自InterfaceA
}
@Override
public void show() {
System.out.println("subClass show");//继承自InterfaceB
}
@Override
public String getInfo() {
return "subClass getInfo";//继承自InterfaceC
}
}
interface InterfaceB extends InterfaceC{
void show();
}
interface InterfaceC{
String getInfo();
}
class classA{
public int age;
public classA(int age) {
this.age = age;
}
}
工厂方法
interface Shape {
void draw();
}
class Circle implements Shape{
@Override
public void draw() {
System.out.println("Circle-draw");
}
}
class ShapeFactory{
static Shape getShape(String className){
if(className==null){
return null;
}
switch (className){
case "Circle":
return new Circle();
default:
return null;
}
}
}
内部类
内部类特性
public class ClassWithInnerClass {
public static int aStaticInt;
public int anInt=0;
//普通内部类对象依赖外部类对象而存在,像外部类声明的一个属性字段一样
public class InnerClass1{
//非static内部类不可有static成员
//public static int anInt=0;
public int anInt=0;
public String name;
public void mb(){
anInt=100;
System.out.println("在内部类中 anInt="+anInt);
}
public InnerClass1(){
System.out.println("InnerClass1 构造函数");
anInt=InnerClass2.anInt;
}
}
public static class InnerClass2{
private static int anInt=2;
private String name;
public InnerClass2(){
System.out.println("InnerClass2 构造函数");
}
}
public static void main(String[] args) {
ClassWithInnerClass c1=new ClassWithInnerClass();
InnerClass1 innerClass1=c1.new InnerClass1();
}
}
内部类的最大作用
四、异常
Exception 类的层次
异常处理机制
throws/throw 关键字
public void deposit(double amount) throws RemoteException
{
// Method implementation
throw new RemoteException();
}
捕获异常
finally关键字
public static void main(String args[]){
int a[] = new int[2];
try{
System.out.println("Access element three :" + a[3]);
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("Exception thrown :" + e);
}
finally{
a[0] = 6;
System.out.println("First element value: " +a[0]);
System.out.println("The finally statement is executed");
}
}
try-catch-finally与return
public static int test(){
int a[] = new int[2];
try{
System.out.println("Access element three :" + a[3]);
return 0;
}catch(ArrayIndexOutOfBoundsException e){
return -1;
} finally{
return 1;
}
}//最终返回1;
五、集合
Java集合框架
collection接口
public interface Collection<E> extends Iterable<E>
int size();
boolean isEmpty();
boolean contains(Object o);
Iterator<E> iterator();
Object[] toArray();
<T> T[] toArray(T[] a);
boolean add(E e);
boolean remove(Object o);
boolean containsAll(Collection<?> c);
boolean addAll(Collection<? extends E> c);
boolean removeAll(Collection<?> c);
default boolean removeIf(Predicate<? super E> filter) {
Objects.requireNonNull(filter);
boolean removed = false;
final Iterator<E> each = iterator();
while (each.hasNext()) {
if (filter.test(each.next())) {
each.remove();
removed = true;
}
}
return removed;
}
boolean retainAll(Collection<?> c);
void clear();
boolean equals(Object o);
int hashCode();
@Override
default Spliterator<E> spliterator() {
return Spliterators.spliterator(this, 0);
}
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
default Stream<E> parallelStream() {
return StreamSupport.stream(spliterator(), true);
}
Set接口
HashSet
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
Set set=new HashSet();
set.add(1);
set.add("a");
set.add(1);
System.out.println(set.contains("a"));//是否包含
System.out.println(set.size());//大小
System.out.println(set.remove("A"));//false
set.remove("a");
//迭代器遍历
Iterator it=set.iterator();
while (it.hasNext()){
System.out.print(it.next()+" ");
}
//for each 遍历
for (Object object:set) {
System.out.print(object+" ");
}
//清空
set.clear();
TreeSet
public class TreeSet<E> extends AbstractSet<E>
implements NavigableSet<E>, Cloneable, java.io.Serializable
class Person implements Comparable
Comparator comparator=new Comparator() {
@Override
public int compare(Object o1, Object o2) {
Person p1= (Person) o1;
Person p2= (Person) o2;
if(p1.age>p2.age){
return -1;
}else if(p1.age
List接口
int size();
boolean isEmpty();
boolean contains(Object o);
Iterator
ArrayList与Vector
List
Map接口
HashMap
Map<Integer,String> m=new HashMap<>();
m.put(1,"111");
m.put(2,"2222");
Set<Integer> keys=m.keySet();
Set<Map.Entry<Integer,String>> entries=m.entrySet();
System.out.println(m.containsKey(1));//true
System.out.println(m.containsValue("111"));//false
System.out.println(keys);//[1, 2]
for (Map.Entry<Integer,String> e:entries) {
System.out.print("["+e.getKey()+","+e.getValue()+"]");
}
HashMap与HashTable
TreeMap
Collections工具类
List
Collections.max(l);
Collections.max(l, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return 0;
}
});
Collections.min(l);
Collections.frequency(l,"a");
Collections.replaceAll(l,"a","b");
六、泛型
泛型类
/**
* 泛型类
* 未传入泛型实参时,与泛型类的定义相同,在什么类的时候,需讲泛型的声明也一起加到类中;
*/
//class A implements IA
泛型接口
/**
* 泛型接口
*/
interface IA<T>{
T test(T t);
}
泛型方法
/**
* 泛型方法
*/
class Cc<E>{
private E e;
//在静态方法中,不能使用类定义泛型,如果要使用泛型,只能使用静态方法自己额外定义的泛型;
public static <T> void teset4(T e){
//System.out.println(this.e);//报错
}
// public static void teset5(E e){
// System.out.println(this.e);//报错
// }
public <T> void test1(T s){
T t=s;
}
public <T> T test2(T s){
return s;
}
public <T> void test3(T... s){
for (T t:s) {
System.out.println(t);
}
}
}
通配符
枚举类
手动实现枚举类
枚举类和普通类的区别
enum Season implements IA{//可实现接口
SPRING("春天","春暖花开"),//实例,相当于调用私有构造函数
SUMMER("夏天","炎炎夏日"),
AUTUMN("秋天","秋风萧萧"),
WINTER("冬天","大雪纷飞");
private final String name;
private final String desc;
private Season(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
}
实现接口的枚举类
注解
基本的Annotation
自定义注解
/**
* 1.访问修饰符必须为public,不写默认为public;
* 2.该元素的类型只能是基本数据类型、String、Class、枚举类型、注解类型(体现了注解的嵌套效果)以及上述类型的一位数组;
* 3.该元素的名称一般定义为名词,如果注解中只有一个元素,请把名字起为value(后面使用会带来便利操作);
* 4.()不是定义方法参数的地方,也不能在括号中定义任何参数,仅仅只是一个特殊的语法;
* 5.default代表默认值,值必须和第2点定义的类型一致;
* 6.如果没有默认值,代表后续使用注解时必须给该类型元素赋值。
*
* 即又有属性的特征(可以赋值),又有方法的特征(打上了一对括号)
*/
//注解的生命周期有三个阶段:1、Java源文件阶段;2、编译到class文件阶段;3、运行期阶段。
// 默认的情况下,自定义注解是使用的RetentionPolicy.CLASS
@Retention(RetentionPolicy.RUNTIME)
//限定某个自定义注解能够被应用在哪些Java元素上面的
@Target(value = {ElementType.TYPE})
//指定自定义注解是否能随着被定义的java文件生成到JavaDoc文档
@Documented
public @interface AnnotationTest {
public String name();
int age() default 18;
int[] array();
}
@AnnotationTest(name = "Test",array = {})
public class Test {
public static void main(String[] args) {
Test test=new Test();
Class c=test.getClass();
if(c.isAnnotationPresent(AnnotationTest.class)){
System.out.println("Test类上配置了AnnotationTest注解!");
AnnotationTest annotationTest= (AnnotationTest) c.getAnnotation(AnnotationTest.class);
System.out.println("name:"+ annotationTest.name()+
",array:"+annotationTest.array()+
",age"+annotationTest.age());
}else{
System.out.println("没有配置AnnotationTest注解!");
}
}
}
七、线程
Thread类的方法
void start();
run();
String getName();
void setName();
static currentThread();
setPriority();//设置线程的优先级
join(); // 常用方法,等待线程结束,调用线程阻塞直到join()线程执行完;
yield();// 常用方法,让出cpu时间片,暂停当前执行的线程,把执行机会让给优先级相同或更高的线程;
sleep(); // 常用方法,线程休眠,时间到后重排队;
interrupt(); // 常用方法,中断线程
boolean isInterrupted(); // 常用方法,返回线程是否被中断
static boolean interrupted(); // 常用方法,返回线程是否被中断,同时清空中断标记
boolean isAlive(); //判断是否还活着;
holdsLock(Object obj); // 常用方法,线程是否持有锁
setContextClassLoader(); // 常用方法,设置线程上下文类加载器
stop(); // 过期方法,停止线程的执行,强制结束;
suspend(); // 过期方法,暂停线程的执行
resume() // 过期方法,恢复线程的执行
Thread t1=new TestThread1();
System.out.println(t1.getPriority());
TestThread2 testThread2=new TestThread2();
Thread t2=new Thread(testThread2);
t2.setPriority(10);
t1.start();
线程的生命周期
线程的同步与死锁
Synchronized
死锁
线程通信
消费者和生产者
八、Java IO
8.1 主要内容
8.2 File类
访问文件名
文件检测
获取常规文件信息
文件操作相关
目录操作相关
递归遍历文件
/**
* 递归遍历文件
*/
public static void test(File file){
if(file.isFile()){
System.out.println(file.getAbsolutePath()+"是文件");
}else{
System.out.println(file.getAbsolutePath()+"是文件夹");
File[] fs=file.listFiles();
if(fs!=null&&fs.length>0){
for (File f : fs) {
test(f);
}
}
}
}
8.3 JavaIO原理
8.4 流的分类
8.4.1 文件流
文件字节流
try {
FileInputStream in=new FileInputStream("D:\\com\\yty\\demo\\_12_io\\test1.txt");
byte[] b=new byte[1024];
int len=0;
//read(byte b[]) //返回读取的数据的长度,如果读取到最后一个数据,还会向后读一个,返回-1;
while ((len=in.read(c))!=-1){
System.out.println(new String(b,0,len));
//String(byte bytes[], int offset, int length),参数1是缓冲数据的数组,参数2是从数组的那个位置开始转化字符串,参数3是
//总共转化;
}
in.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
FileOutputStream out=new FileOutputStream("D:\\IdeaProjects\\javaStudy-demo\\src\\com\\yty\\demo\\_12_io\\out.txt");
String s="aaaaaaaaddddd";
out.write(s.getBytes());
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrce();
}
public static void copy(String sourcePath,String targetPath){
try {
FileInputStream in=new FileInputStream(sourcePath);
FileOutputStream out=new FileOutputStream(targetPath);
byte[] b=new byte[1024];
int len=0;
while ((len=in.read(c))!=-1){
out.write(b,0,len);
}
out.flush();
out.close();
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
文件字符流
FileReader fileReader=new FileReader(path);
char[] c=new char[10];
int len=0;
System.out.println("-------fileReaderTest-------");
while ((len=fileReader.read(c))!=-1){
System.out.println(new String(c,0,len));
}
fileReader.close();
FileWriter fileWriter=new FileWriter(path);
fileWriter.write(txt);
fileWriter.flush();
fileWriter.close();
8.4.2 缓冲流
FileInputStream in=new FileInputStream(path);
BufferedInputStream bi=new BufferedInputStream(in);
FileOutputStream out=new FileOutputStream(path);BufferedOutputStream bo=new BufferedOutputStream(out);
8.4.3 转换流
//字节输入流转化为字符输入流
public static void testInputStreamReader(String path){
try {
FileInputStream fs=new FileInputStream(path);
InputStreamReader isr=new InputStreamReader(fs);
char[] c=new char[10];
int len=0;
while ((len=isr.read(c))!=-1){
System.out.println(new String(c,0,len));
}
isr.close();
fs.close();
} catch (Exception e) {
e.printStackTrace();
}
}
//转换字节输出流为字符输出流
public static void testInputStreamReader(String path,String txt){
try {
FileOutputStream out=new FileOutputStream(path);
OutputStreamWriter osw=new OutputStreamWriter(out);
String s=txt;
osw.write(s);//void write(byte b[])
osw.flush();
osw.close();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
8.4.4 标准输入输出流
InputStreamReader in=new InputStreamReader(System.in);//字节输入流转为字符输入流
BufferedReader br=new BufferedReader(in);//缓冲字符输入流
BufferedWriter out=new BufferedWriter(new FileWriter(tpath));//缓冲字符输出流
String line="";
while ((line=br.readLine())!=null){
if(line.equals("over")){
break;
}
out.write(line);
}
out.flush();
out.close();
br.close();
in.close();
8.4.5 打印流
8.4.6 数据流
8.4.7 对象流
8.4.8 RandomAccessFile类
九、反射
概述
java能够反射的前提
提供的功能
主要API
9.1 Class类
public final Class getClass()
Class类的常用方法
public static void main(String[] args) throws NoSuchFieldException, NoSuchMethodException, ClassNotFoundException, IllegalAccessException, InstantiationException {
Person p=new Person();
Class c=p.getClass();
System.out.println(c);
Class c2=Class.forName("com.yty.demo._4_oop.Person");//
Person p2= (Person) c.newInstance();//创建目标类对象
c.getName();//类的全名(包名+类名)
c.getSimpleName();//类名
Class superC=c.getSuperclass();//获取父类
Class[] superI=c.getInterfaces();//获取所有实现的接口
ClassLoader classLoader=c.getClassLoader();//类加载器
Constructor[] constructor=c.getConstructors();//构造器
//Field getField(String name)
// 自身及继承的public属性
Field field1=c.getField("hobby");
//自身的任何权限的属性
Field field2=c.getDeclaredField("yearsOld");
Field[] fields1=c.getFields();
Field[] fields2=c.getDeclaredFields();
//Method getMethod(String name, Class>... parameterTypes)
//获取当前类及所有继承的父类的public修饰的方法。仅包括public
Method method1=c.getMethod("setSex",int.class);
//获取当前类的所有方法,包括public/private/protected/default修饰的方法。但不包括继承的方法
Method method2=c.getDeclaredMethod("employee");
}
实例化Class类对象
9.2 通过反射调用类的完整结构
Field相关方法
String getName();//名称
int getModifiers();//修饰符
Class<?> getType()//类型
void setAccessible(boolean flag);///操作私有Field前先设置可被外部访问
void set(Object obj, Object value);
Object get(Object obj);
Method相关方法
String getName();
Class<?>[] getParameterTypes();
int getModifiers();//修饰符
Class<?> getReturnType();
void setAccessible(boolean flag);///调用私有方法前先设置可被外部访问
Object invoke(Object obj, Object... args);//(被调用的对象,方法参数);
9.3 Java动态代理
static Object newProxyInstance(classLoader,interfaces,Handler)
/**
* 在执行方法时需要加入一些东西
*/
InvocationHandler handler=new ProxyDemo(testDemo);
//Object newProxyInstance(classLoader,interfaces,Handler)
//创建动态代理对象
ITestDemo t= (ITestDemo) Proxy.newProxyInstance(handler.getClass().getClassLoader(),
testDemo.getClass().getInterfaces(),handler);
t.test1();
t.test2();
//实现接口InvocationHandler的类,实现invoke方法
public class ProxyDemo implements InvocationHandler {
Object obj;//被代理的对象
public ProxyDemo(Object obj) {
this.obj = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("========方法开始执行=======");
Object res=method.invoke(this.obj,args);
System.out.println("========方法执行结束=======");
return res;
}
}
//被代理对象
public class TestDemoImpl implements ITestDemo {
@Override
public void test1() {
System.out.println("执行方法 test1 ");
}
@Override
public void test2() {
System.out.println("执行方法 test2 ");
}
}
public interface ITestDemo {
void test1();
void test2();
}
Field相关方法
String getName();//名称
int getModifiers();//修饰符
Class<?> getType()//类型
void setAccessible(boolean flag);///操作私有Field前先设置可被外部访问
void set(Object obj, Object value);
Object get(Object obj);
Method相关方法
String getName();
Class<?>[] getParameterTypes();
int getModifiers();//修饰符
Class<?> getReturnType();
void setAccessible(boolean flag);///调用私有方法前先设置可被外部访问
Object invoke(Object obj, Object... args);//(被调用的对象,方法参数);
9.3 Java动态代理
static Object newProxyInstance(classLoader,interfaces,Handler)
/**
* 在执行方法时需要加入一些东西
*/
InvocationHandler handler=new ProxyDemo(testDemo);
//Object newProxyInstance(classLoader,interfaces,Handler)
//创建动态代理对象
ITestDemo t= (ITestDemo) Proxy.newProxyInstance(handler.getClass().getClassLoader(),
testDemo.getClass().getInterfaces(),handler);
t.test1();
t.test2();
//实现接口InvocationHandler的类,实现invoke方法
public class ProxyDemo implements InvocationHandler {
Object obj;//被代理的对象
public ProxyDemo(Object obj) {
this.obj = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("========方法开始执行=======");
Object res=method.invoke(this.obj,args);
System.out.println("========方法执行结束=======");
return res;
}
}
//被代理对象
public class TestDemoImpl implements ITestDemo {
@Override
public void test1() {
System.out.println("执行方法 test1 ");
}
@Override
public void test2() {
System.out.println("执行方法 test2 ");
}
}
public interface ITestDemo {
void test1();
void test2();
}