- -------------------------基础知识
- main
- main方法是程序执行的入口.无法直接调用在main方法外声明的变量(但可以通过创建对象调用),所以会编译时出错。
- 注释
- 注释是给程序员看的,不会被编译
- 注释的多少不影响代码的尺寸
- 注释是给程序员看的,不会被编译
- 数组
- 数组不是原生类
- 字符串求长度的方法是.length()
- 数组求长度的是.length
- 区别:字符串有(),数组没有
- Object oa = new float[20];
- 任何类的父类都是 Object,数组属于引用类型,Object oa = new float[20];这种写法相当于父类的引用指向子类的实例。
- 数组一旦创建长度不能改变。就算是改变了也只是底层创建了一个新数组,新数组发生改变再把你原数组复制过去罢了!这种情况本质上是创建了一个新数组。
- 声明一维数组还可以这样:int[ ] a
- 插入排序
- 演示图
-
* 位运算符
-
- 演示图
- 左移运算符相当于 结果 = 原数x2
- 例:10 << 1 = 20
- 右移运算符相当于 结果 = 原数/2(余数不用管,取整数)
- 例:10 >> 1 = 5
- java语言基本知识
- Java虚拟机解释执行字节码文件
- Java的类是对具有相同行为对象的一种抽象
- java中的垃圾回收机制是一个系统级的线程
- JDK的库文件目录是lib
- 支持跨平台(Windows,Linux,Unix等)
- GC(自动垃圾回收),提高了代码安全性
- java没有指针的概念,但是有一个空指针的异常
- 支持与其它语言书写的程序进行通讯
- Java是从(C++)语言改进重新设计
- java技术体系
- java Me
- java Se
- java EE
- java Card
- java语言以类为基本单位
- java基本数据类型
- 三目运算符中:第二个表达式和第三个表达式中如果都为基本数据类型,整个表达式的运算结果由容量高的决定。
- char c=74
- char类型可以传值整型数字74,不能传’74’
- 1个字节空间占8个位
- 比例1:8
- 默认值
- char
- ‘\u0000’
- char
- java基本运算符
- && 短路与 和 ||短路或 是属于与和或的分支
- 若a为整型变量,a=12,则表达式:a * =2+3的值为
- 此题的计算结果a=(2+3)*12,即a=60.
- ^表示异或 就是相同是0 不同是1
- 例:14^3
- 14是1110
- 3是 0011
- 所以14^3=1101,即13
- 例:14^3
- ==
- 当用于基本类型时候,是比较值是否相同
- 当用于引用类型的时候,是比较对象是否相同。
- 如果"=="两边的类型不匹配,那么无法比较,表达式就是是错误的。
- 字符串
- 在字符串前面加上(\)符号,则字符串中的转义字符将不被处理
- main
- -------------------------面向对象
- Object
- 在根类Object中包含以下方法:
- clone();
- equals();
- finalize();
- getClass();
- notify(),
- notifyAll();
- hashCode();
- toString();
- wait();
- 在根类Object中包含以下方法:
- 存储空间
- 接口是一种只含有抽象方法或常量的一种特殊的抽象类,因为接口不包括任何实现,所以 接口与存储空间没有任何关系。
- 栈是一种存取受限的线性结构
- Java语言中,程序为对象动态分配内存。Java中内存分配的运算符是new
- 修饰符
- implements 实现多个接口,implements 只用写一次
* 示例:class A implements B,C - interface的修饰接口只能是public和默认
- 属性的可见性有四种:公有的(public)、保护的(protected)、默认的(default)、私有的(private)
- abstract不能修饰变量
- private不能修饰类
- 方法内的变量(局部变量)不能被修饰符修饰
- 不同包子类的关系, 可以访问到父类protected 成员变量
- implements 实现多个接口,implements 只用写一次
- 类
- private不能用于修饰顶层类(外部类)
- 抽象类中可以存在private方法和变量,但是其中的抽象方法不能被private修饰
- 继承
- 继承中的执行顺序
- A.父类的静态代码块
- B.子类的静态代码块
- C.父类的构造代码块
- D.父类的构造函数
- E.子类的构造代码块
- F.子类的构造函数
- 继承中的执行顺序
- 对象
- 程序中的对象是一种数据信息,并非现实中的实际物体
- 在创建对象时,先声明对象,为对象分配内存空间,对对象初始化,然后才能使用对象
- instanceof 是 Java 的一个二元操作符,它的作用是测试它左边的对象是否是它右边的类的实例,返回 boolean 类型的数据。
- 方法
- 成员方法可以访问静态变量
- 静态方法只能访问静态变量
- 静态方法可以通过对象调用和类名直接调用
- 成员方法只能通过对象来调用
- 本类成员方法不可以调用其他类的私有成员方法
- 本类成员方法不可以直接通过方法名调用其他类的成员方法
- 在静态方法中不能使用 this 关键字
- 在静态方法中可以调用其它类中的静态方法
- 静态方法可以被私有化
- 静态方法不能被重写
- 本类成员方法可以调用其他类的静态方法,但不调用被私有化的静态方法
- public修饰的方法可被其它类访问或引用
- 重写要求方法签名完全相同,返回值类型如果是基本类型或无返回值时必须一致。
- 重载要求方法名相同且参数列表必须不同,与返回值类型无关。
- 重写也称为覆写
- 抽象方法不能有方法体,哪怕是只带着{}也不行
- 抽象方法不可以是静态的
- 抽象方法可以在接口中和抽象类中定义,并不是只能存在抽象类中
- 变量常识
- 实例变量也叫对象变量、成员变量
- 类变量也叫静态变量
- 局部变量方法中或者某局部块中声明定义的变量或方法的参数被称为局部变量
- 抽象方法用abstract修饰的方法
- 方法常识
- **类方法(或静态方法)**被static 修饰的方法
- 最终方法用final修饰的方法
- 本地方法用native修饰的方法
- 同步方法用synchronized(同步锁)修饰的方法,用于保证多线程之间的同步
- 类继承抽象类,类实现接口
- 抽象
- 抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public;
- 抽象类必须有子类,使用extends继承,一个子类只能继承一个抽象类
- 子类(如果不是抽象类)则必须覆写抽象类之中的全部抽象方法(如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。)
- 虽然一个类的子类可以去继承任意的一个普通类,可是从开发的实际要求来讲,普通类尽量不要去继承另外一个普通类,而是去继承抽象类。
- 由于抽象类里会存在一些属性,那么抽象类中一定存在构造方法,其存在目的是为了属性的初始化。并且子类对象实例化的时候,依然满足先执行父类构造,再执行子类构造的顺序。
- 抽象类可以用final声明么?
- 不能,因为抽象类必须有子类,而final定义的类不能有子类;
- 外部抽象类不允许使用static声明,而内部的抽象类运行使用static声明。
- 任何时候,如果要执行类中的static方法的时候,都可以在没有对象的情况下直接调用,对于抽象类也一样
- 接口
- 接口中不可以有 private 的方法
- 接口中不可以有 final 的方法
- 接口中的方法默认是 public abstract 的。
- 接口中的方法不可以有实现
- Runnable接口的实现类中必须定义public void run()
- 抽象类可以定义普通成员变量而接口不可以,但是****抽象类和接口都可以定义静态成员变量,只是接口的静态成员变量要用static final public 来修饰。
- 接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
- 接口的使用原则
- 接口必须要有子类,但此时一个子类可以使implements关键字实现多个接口
- 接口的子类(如果不是抽象类),那么必须要覆写接口中的全部抽象方法
- 接口的对象可以利用子类对象的向上转型进行实例化
- 对于子类而言,除了实现接口外,还可以继承抽象类。
- 语法格式:
- class子类 [extends父类] [implemetns 接口1,接口2,…] {}
- 语法格式:
- 对于接口,里面的组成只有抽象方法和全局常量
- 接口中的访问权限只有一种:public,即:定义接口方法和全局常量的时候就算没有写上public,那么最终的访问权限也是public,注意不是default。
- 在Java中,一个抽象类只能继承一个抽象类,但一个接口却可以使用extends关键字同时继承多个接口(但接口不能继承抽象类)。
- 在Java中,接口的主要功能是解决单继承局限问题
- 静态
- 静态块是类加载的时候就会被执行到的,静态执行顺序是按照在类中出现的先后顺序执行。
- java 8的新特性
- 在接口中可以添加使用 default 关键字修饰的非抽象方法。即:默认方法(或扩展方法)
- 接口里可以声明静态方法,并且可以实现。
- java7以后(包括java7),switch新增了String类型可以使用
- java旧版本特性
- java8之前,接口中只能定义常量和抽象方法
- java8以前,接口只能被类实现,类不能继承接口,遵循单继承多实现原则
- java7以前(不包括java7),switch只能使用int,short,char类型:题海中碰到问switch的问题,都是指的java7版本,不能作用于String类型上
- this
- 普通的直接引用:this 相当于是指向当前对象本身。
- 形参与成员名字重名,用 this 来区分
- 引用构造函数:this(参数):调用本类中另一种形式的构造函数(应该为构造函数中的第一条语句)。
- super
- 普通的直接引用:与 this 类似,super 相当于是指向当前对象的父类,这样就可以用 super.xxx 来引用父类的成员。
- 子类中的成员变量或方法与父类中的成员变量或方法同名
- super(参数):调用父类中的某一个构造函数(应该为构造函数中的第一条语句)。
- 语句的位置
- main方法可以放在类里任意一个地方。
- 文件名
- 如果在源文件中声明了一个public接口,则其名称必须和源文件名一致。
- 装箱、拆箱
- 操作发生在:
- 引用类型与值类型之间
- 操作发生在:
- Object
- -------------------------API
- java常识
- java不支持goto语句。
- GC是垃圾收集器,程序员不用担心内存管理
- 类
- Object类
- hashcode
- 两个对象如果hashCode值相同,则两个对象可能相同。
- 两个对象如果hashCode值不同,则两个对象必定不同。
- hashcode
- Object类
- 集合
- foreach高效循环只适用于数组和集合
- Collection
- ArrayList是线程不安全的
- HashSet集合里面存储的元素是无序的且不重复的
- Set中存放的对象是唯一的
- ArrayList的底层是数组
- Map
- HashMap底层是数组 + 链表
- HashMap对象的key、value值均可为null。
- HashSet子类依靠 hashCode(),equals()方法区分重复元素
- HashSet内部使用Map保存数据,即将HashSet的数据作为Map的key值保存,这也是HashSet中元素不能重复的原因。而Map中保存key值前,会去判断当前Map中是否含有该key对象,内部是先通过key的hashCode,确定有相同的hashCode之后,再通过equals方法判断是否相同。
- 链表
- 链表具有的特点是
- 不必事先估计存储空间
- 插入删除不需要移动元素
- 所需空间与线性表长度成正比
- 不能随机访问,查找时要从头指针开始遍历
- java.util.Queue 是链式存储并快速顺序(不需要随机访问)访问的集合类型
- 链表具有的特点是
- 其他
- 如果要保证元素唯一,且按照存放顺序读取,可以选用LinkedHashSet
- 文件流
- Java中,"目录"被看作是“文件”
- 计算机中的流是流动的数据缓冲区
- 流,最早从C语言中引入的。其可以看成是一个流动的数据缓冲区。数据从数据源方向经过缓冲区流向数据的目的地。
- 在传送的过程中,其传送方式是串行的。
- 在Java中的java.io包中定义了Java中常见流的接口与类。其中包括两个最基本的流的抽象类,它们分别是OutputStream与InputStream。其余的流都分别从这两个基本类中继承而来。
- InputStream是一个抽象类,不是接口
- 异常
- FileNotFoundException是检查型异常,需要在编写程序时声明
- 如果某异常继承 RuntimeException,则该异常可以不被声明
- 运行异常,可以通过java虚拟机来自行处理。非运行异常,我们应该捕获或者抛出
- 在JAVA的异常处理模型中,能单独和finally一起使用的块是 try
- final、finally、finalize
- final是修饰符(关键字)可以修饰类、方法、变量
- finally在异常处理的时候使用,提供finally块来执行任何清除操作
- finally是关键字不是方法
- finalize是方法名,在垃圾收入集器将对象从内存中清除出去之前做必要的清理工作
- 线程
- new 时新建状态(新生状态)
- s.start()时进入就绪状态(可运行状态),并不会马上启动线程,而是等待CPU调度
- 在得到CPU的时间片后线程自动调用自己的run(),就进入运行状态
- 线程执行时,所执行的内容是其执行计划中的内容,也就是run方法中所定义的逻辑。
- notify方法不能确切唤醒某个正处于等待状态的线程,而是需要通过其他线程来调用该等待线程中的notify方法来唤醒该线程;
- wait方法会释放掉锁。
- 线程安全
- 简单记忆线程安全的集合类: 喂!SHE! 喂是指vector,S是指stack, H是指hashtable,E是指:Eenumeration
- 同步锁
- 普通资源,锁对象任意,只要是同一个锁对象就行
- 普通方法的锁对象是默认是 this,不需要自己写
- 静态方法的锁对象是默认是 类名.class(反射知识),不需要自己写
- 因为静态方法是随着类加载而加载,用this锁时机太晚了,只能用类名.class,因为它是最先加载的。
- run方法线程执行体.
- start方法开启多线程
- 方法 resume()负责恢复 通过调用 suspend()方法而停止的线程的执行
- 一个线程可能因为不同的原因停止并进入就绪状态。
- new 时新建状态(新生状态)
- java集合之间相互关系
- 单例设计模式
- 注解
- XML
- <!– –>
- 像无语的表情
- <!– –>
- java常识