-
变量
-
基本数据类型
-
类似C的define声明的常量
- 用final实现 例如:double PI=3.14159
-
按作用域划分的变量
-
局部变量
- 代码块中声明,作用域为代码块
-
类变量
- 类中声明,而不是类的方法中声明,作用域为整个类
-
方法参数
- 传递给方法,作用域是这个方法
-
例外处理参数
- 传递给例外处理代码,作用域为例外处理部分
-
按数据类型划分变量
-
整形数据
- 常量
- 十、八、十六进制
- 123, 0123, 0x123
- 变量
- byte, short, int, long
-
字符型数据
- 常量
- ‘A’, 'a'
- 变量
- char a = 'a';
- 字符串常量
- "This is a string.\n"
-
布尔型数据
- ture, false
- boolean a = ture;
-
浮点型(实型)数据
- 常量
- 十进制实型
- 1234123.123f
- 科学计数法
- 123e3
- 变量
- float, double
-
各类数值型数据间的混合运算
- 自动类型转换(向上转)
-
强制类型转换
- int i; byte b = (byte) i;
-
引用数据类型
- 类
- 接口
- 数组
-
关键字
-
this
-
使用this调用成员变量和成员函数
- class A {
int a;
A(int age) {
this.a = age;
}
void intro(){
System.out.println("I'm " + this.a + " old");
}
}
- this代表了调用这个函数或者变量的当前对象
-
使用this调用本类中的其他构造函数
- class A{
int a;
int b;
A (int age){
this.a = age;
}
A (int age, int telNumber) {
this(age);
b = telNumber;
}
}
- 对this的调用必须是构造函数中的第一个语句
- 不能在一个构造函数中同时使用本类中的其他两个构造函数
-
static
-
静态成员变量
- class A {
static int a;
}
- 可以直接用类名来调用
- 所有由这个类生成的对象,都使用同一个静态变量
-
静态成员函数
- class A {
static void func(){
xxx;
}
}
- 可以直接用类名来调用
- 静态函数中,只能使用类的静态变量,不能使用非静态变量
-
静态代码块
- class A {
static {
xxx;
}
}
-
装载这个类的时候,会执行静态代码块
- 类的操作步骤,装载->解释->执行
- 一般用来初始化静态变量
-
extends
-
继承父类
- class child extends parents {
xxx;
}
-
super
-
在子类的构造函数中,使用super调用父类的构造函数
- class A{
A();
}
class B extends A{
B(){
super();
}
}
-
使用super调用父类的成员函数
- class A{
funA(){
xxx;
}
}
class B extends A{
funB(){
xxx;
super.funA();
xxx;
}
}
- 代表父类
-
abstract
-
抽象类
- abstract class A {
xxx;
}
-
抽象方法
- abstract void fun();
-
package
-
用于将类封装成包
- javac -d [dir] 需要编译java文件
- package bob_package_name;
-
public
-
将类或者成员设定为没有任何限制,自由访问的权限
- public String s;
- public void func(){};
- public class A {}
-
private
-
用于限定成员或者类为私有、只能在本类中使用
- private class A {}
- private void func(){};
- private String s;
-
protected
-
定义一个包中的父类的成员可以被其他包的子类所继承
-
package A
class A{
protected int a;
}
- package B
import A.A
class B extends A{
this.a = 1;
}
-
import
-
包含java软件包
- import bob.package
-
import bob.*
- 偷懒的做法
-
interface
-
定义一个接口
- interface A{
void fun();
xxx;
}
-
implements
-
实现一个接口
- class B implements A{
xxx;
}
-
try..catch...finally
-
用于异常的捕捉、处理、善后
- try{
xxx;
}
catch (Exception e) {
e.xxx();
}
finally{
xxx;
}
-
throw
-
抛出异常
- RuntimeException e = new RuntimeException("xxx");
Exception e = new Exception("xxx");
throw e;
-
throws
-
声明这个函数可能会出现异常
- public void func(xxx) throws Exception{
if (age < 0) {
Exception e = new Exception("xxx");
throw e;
}
this.age = age;
}
-
final
-
final用来声明一个常量,在程序中不能改变它,一般都用大写字母
- final int CONSTANT = 50;
-
synchronized
-
同步代码块
- synchronized(this){
xxx;
}
-
instanceof
-
判断全面的对象是不是后面这种类型
- boolean b = obj instanceof User
-
面向对象
-
面向对象的思维方式
- 首先确定谁来做,其次确定怎么做
- 首先考虑整体,其次考虑局部
- 首先考虑抽象,其次考虑具体
-
构造函数的作用
-
特征
- 构造函数没有返回值
- 构造函数的名称必须和类名相同
- 如果没有自己定义构造函数,编译器会在编译时加一个参数为空,函数体为空的构造函数
如果有自己定义的构造函数,编译器则什么也不做
- 构造函数也可以重载
-
继承
-
什么是继承
- 一个类得到了另一个类的成员变量和成员方法
- 为什么要使用继承
- 继承的基本语法点
- 生成子类的过程
-
使用super调用父类构造函数的方法
- super必须是第一条语句
- 子类无法继承父类的构造函数
- 在子类的构造函数当中,必须调用父类的构造函数
- 使用super调用父类的成员函数
- 如果子类和父类不再同一个包当中,则子类无法访问到父类当中的default权
限的成员变量和成员函数,但可以找到对应的成员变量和成员函数
-
封装
- 对象:变量和方法组成
-
类:是组成Java程序的基本要素。它封装了一类对象的状态和方法, 是这一类对象的原型
-
类声明
- class className {
……
}
- 类所实现的接口以修饰符public, abstract, final
-
类体
- class className {
memberVariableDeclarations
methodDeclarations
}
- 对类的成员(变量和方法)可以限定其它对象对它的访问权限,有以下几种: private, protected, public, friendly
- 实例成员
- 类成员
- 成员变量
- static限定成员变量为类变量
- final用来声明一个常量,在程序中不能改变它,一般都用大写字母
- class FinalVar{
final int CONSTANT = 50;
……
}
-
消息:实现对象之间的交互, 同时, 处于不同处理过程甚至不同主机的对象间都可以通过消息实现交互
- 消息的接收者
- 接收对象应采用的方法
- 方法所需要的参数
-
多态
-
对象的转型
-
对象向上转型
- 将子类的对象赋值给父类的引用
- Student是Person的子类;
Student s = new Student();
Person p = s;
- 向上转型是不会失败的
-
对象向下转型
- 将父类的对象赋值给子类的引用
- Student是Person的子类;
Student s1 = new Student();
Person p = s1;
Student s2 = (Student)p;
- Student是Person的子类;
Person p = new Person();
Student s = (Student)p;
- 向下转型的前提:必须先向上转型
- 必须用强制类型转换
-
函数的重载(overload)
- 在同一个类中,成员函数名相同,参数列表不同,与返回值无关
-
函数的复写(override)
- 在具有父子关系的两个类中,父类和子类各有一个函数,
这两个函数的定义(返回值类型,函数名和参数列表)完全相同
-
抽象类
-
抽象函数的语法特征
-
只有函数定义,没有函数体的函数
- abstract void fun();
- 抽象函数必须存在于抽象类中
-
抽象类的语法特征
-
使用abstract类定义的类
- 抽象类不能够生成对象
- 如果一个类中包含有抽象函数,那么这个类必须被声明为抽象类
- 如果一个类中没有抽象函数,那么这个类也可以声明为抽象类
- 抽象类中可以有构造函数,在生成子类的时候被调用
-
抽象类的作用
- 抽象类就是用来被继承的
-
子类继承抽象类后,需要override抽象类中的抽象方法
- 这个特性可以避免漏掉有些必要的override,可以在语意与
语法上达到一致,不至于出现,编译可过,但逻辑不对的情况
- 可以用在设计模式的"模板"中
- 目的:减少重复代码
-
异常
-
什么是异常
- 异常是中断了正常指令流的事件
- 异常有JVM产生
- 异常是一个对象
-
异常的分类
-
Throwable
-
Exception
- RuntimeException
- ........
- 运行时异常,Uncheck exception
- 编译时异常,Check exception
-
Error
- JVM在运行时产生的错误,一旦产生错误,JVM就会立即关闭
-
try..catch...finally结构的使用方法
- try{
int i = 1 / 0;
}
catch (Exception e) {
e.printStackTrace();
}
finally{
System.out.println("finally");
}
- 将可能出现异常的代码放在try{}中,如果出现异常,则程序将会跳
到catch里面去执行异常处理,无论出不出异常都会执行finally,
一般称finally为异常的出口,执行收尾工作
-
throw抛出异常
-
抛出自定义异常
- //RuntimeException e = new RuntimeException("年龄不能为负数");
Exception e = new Exception("年龄不能为负数");
throw e;
-
throws用于声明这个函数可能会出现异常
-
谁调用谁处理Exception
- public void setAge(int age) throws Exception{
if (age < 0) {
Exception e = new Exception("年龄不能为负数");
throw e;
}
this.age = age;
}
-
设计模式
-
工厂方法模式
-
将new这样用于生成对象的操作封装在Factroy中,
好处是对于使用者来讲,他不用去关心Factory内部操作
- PinterFactory.rar
-
装饰者模式
-
被装饰者
- 被装饰者实现最基本的功能
-
装饰者
- 在基本功能由被装饰者实现后,对其再进行装饰。
并将被装饰者作为装饰者的一个参数传递过去
-
代码
- Decorator.rar
-
接口
-
什么是接口
- 接口就是标准,调用对象的标准
-
接口的基本语法
-
使用interface定义
- 比较纯粹的抽象类,也就是说所有成员都是抽象的
- 接口当中的方法都是抽象方法
- 接口当中的方法都是public权限
-
实现接口使用implements关键字
- 实现是特殊的继承
-
一个类可以实现多个接口
- class Phone implements USB,WIFI{
xxx;
}
-
一个接口可以继承多个接口
- interface C extends A,B{
xxx;
}
- 接口支持向上转型
-
为什么要使用接口
- 用在规则一致,但实现不同的需求中
-
零散知识点
- java引用与C语言指针的区别
- 一个引用能够调用哪些成员(变量和函数),取决于这个引用的类型
- 一个引用调用的是哪一个方法,取决于这个引用所指向的对象
-
匿名对象
- new Dog().jump();
- 因为没有对象名,所以只能用一次
-
现代编程思想
- 如果一段代码在语意上有错误的话,那么在语法上也应该有错误
- 一个类,一个成员变量,一个成员函数,尽量将权限限制到最小
- 用"=="比较两个对象的作用是:查看被比较的两个对象的引用是不是相同
-
内部类
-
什么是内部类
- 一个类定义在另一个类的里面
-
内部类的使用方法
- _外部类的名字_&_内部类的名字_
-
内部类可以任意使用外部类的成员变量和成员函数
- 内部类仅仅可以使用外部类的资源,但不是拥有内部类的资源,这是它与继承之间的区别
-
匿名内部类的使用方法
- 在一个类中定义一个内部类(包括实现一个接口),用这个类生成一个对象,然后直接使用这个对象,这样做省去了为这个内部类起一个名字
在编译这样一个含有匿名内部类的类时,会生成类似Test$1.class这样的一个class文件
-
例子
- TestInternalClass.rar
-
例子
- TestNamelessInternalClass.rar
-
多线程
-
进程和线程
-
多进程
- 在操作系统中能同时运行多个任务(程序)
-
多线程
- 在同一个应用程序中有多个顺序流同时执行
- 多线程程序运行模式
-
定义线程的方法
-
创建线程
-
定义一个线程类,它继承类Thread并重写run()方法,run()称为线程体
- TestThreadStart.rar
-
实现Runnable这个接口,在初始化一个Thread类或者子类的对象时,
把目标对象传递给这个线程实例,由该目标对象提供线程体
- TestThreadRunable.rar
-
控制线程的常用函数
-
中断线程
- Thread.sleep()
- Thread.yield()
-
设置线程的优先级
- getPriority()
- setPriority()
- 最大优先级 10: Thread.MAX_PRIORITY
- 最小优先级 1: Thread.MIN_PRIORITY
-
多线程数据安全
- 数据完整性
-
同步线程的方法
-
同步代码块
- TestThreadSynchronized.rar
-
例子
- TestThreadFunc.rar
-
包和访问权限
-
java包
-
什么是java中的软件包
- 把类放在不同的文件夹下
-
为什么要用软件包
- 避免重名文件
-
如何给一个类打包
- 将类放置到一个包当中,需要使用package "包名",编译时
javac -d [dir],该参数用来依照包名生成相应的文件夹
-
命名空间
-
包名的命令规范
- 要求包名所有的字母都小写
- 包名一般情况下,是你的域名倒过来写
- 域名:marsdroid.org
包名:org.marsdroid
- 一个类的全名应该是["包名"+"."+"类名"]
- 包名中不能有"-"
- 导入包
-
访问权限
-
public(共用权限)
- 如果一个类是public的,那么它的文件名就必须和类名是相同的
- 在不同的几个包中,如果一个类/变量/方法是public的,那么它可以被外部包调用
-
private(私有权限)
-
修饰变量和方法
- 只能在当前的类中使用,不能用在生成的对象中
-
修饰类
- 内部类
-
default (包级别访问权限)
- 在同一个包中,不同的default class可以访问
- 不在同一个包中,不同的default class不可以访问
-
protected权限与继承有关
- protected拥有和default一样的功能,但是该权限只能修饰成员变量和成员函数
- 用protected声明的成员函数和成变量所在的类作为父类,可以被不同包中的子类所继承
- 与public的不同:protected被限制只能在子类中使用,而public是可以被任何类使用
- public > protected > default > private
- 没有任何限制,自由访问
- 只能在本类中使用
- 在同一个包中,可以自由访问
-
开发工具
-
Notepad++
- 官网
-
SubLime
- 官网
-
Eclipse
-
什么是Eclipse
- 官网
-
Eclipse的基本概念
- workspace
- project
- Eclipse界面简介
-
Object中的重要方法
-
equals()
-
equals函数在什么地方
- 在Object类中,Object在JDK中,所有类都继承了equals函数
-
equals函数的作用
-
用来比较两个对象的内容是不是相同
- 对象的类型相同(可以使用instanceof操作符进行比较)
- 两个对象的成员变量的值完全相同
-
复写equals函数的方法
- TestEquals.rar
-
hashCode()
-
hashCode的作用
- 如果两个对象用equals相比是一样的,那么他们各自的hashCode也应该是一样的,
hashCode与类集框架有关,用于做一些数据的索引
- hashCode的实现方法
-
toString()
-
toString的作用
- 用于打印对象的信息,方便调试
- toString的实现方法
-
例子
- TestHashCodeToString.rar
- 这三个函数,可以用eclipse自动生成
-
类集框架
-
什么是类集框架
- 一组类和接口
- 位于java.util包当中
- 主要用于用于存储和管理对象
-
类集的种类
-
三大类集合、列表和映射
-
集合(Set)
- 集合中的对象不按特定的方式排序,并且没有重复对象,如果有重复元素,那么Set会忽略重复元素
-
列表(List)
- 集合中对象按照索引位置排序,可以有重复对象
-
映射(Map)
- 集合中的每一个元素包含一个键值对,键不可以重复,值可以重复
-
类集框架的基础结构
-
3个层次
-
INTERFACE: Literator, Collection
- Collection接口
- boolean add(Object o)
- void clear()
- boolean isEmpty()
- remove(Object o)
- int size()
- Literator
- hasNext()
- next()
- INTERFACE: List, Set, Map
-
各种实现类
- HashSet
- TestHashSet.rar
- ArrayList
- TestList.rar
- HashMap
- TestHashMap.rar
-
程序入口
- public main(String[] args)
- 作为applet的子类
-
运算符和表达式
-
运算符
-
算术运算符 (+,-,*,/,%,++,--)
-
与C/C++不同, 对取模运算符%来说, 其操作数可以为浮点数
- 37.2%10=7.2
-
关系运算符 (>,<,>=,<=,==,!= )
- 返回布尔类型的值 true 或 false?
-
布尔逻辑运算符 ( !,&&,|| )
- 表达式1&&表达式2,如果表达式是false,那么表达式2不会运算,同理'||'
- 位运算符 (>>,<<,>>>,&,|,^,~ )
- 赋值运算符 (=,及其扩展赋值运算符如+=)
- 条件运算符 ( ?:)
- 其它 (包括分量运算符 · ,下标运算符[],实例运算符 instance of,内存分配运算符 new,强制类型转换运算符(类型),方法调用运算符()等 )
-
流控制
- 分支语句: if-else, break, switch, return
- 循环语句: while, do-while, for, continue
- 例外处理语句: try-catch-finally, throw
-
三种注释方式
- // 单行注释
- /* … */ 用于多行注释
- /** … */ 是Java所特有的doc注释
-
数组
-
一维数组
-
定义
- type arrayName[]
- arrayName = new type[arraySize]
- type arrayName = new type[arraySize]
-
引用
- arrayName[index]
-
初始化
- int a[] = {1,2,3,4,5}
-
多维数组
-
定义
- type arrayName[][]
- int a[][] = new int[2][3]
- int a[][] = new int[2][];
a[0] = new int[3];
a[1] = new int[3];
-
引用
- arrayName[index1][index2]
-
初始化
- int a[][]={{2,3},{1,5},{3,4}}
- 数组的类型
-
例子
- Fibonacci.tgz.gz
- HelloWorld.tgz.gz
- HelloWorld_applet.tgz.gz
- HelloWorld_jni.tgz.gz
- LeapYear.tgz.gz
- MatrixMultiply.tgz.gz
- RelationAndConditionOp.tgz.gz
- SimpleTypes.tgz.gz
-
I/O流
- I/O操作的目标
-
I/O的分类方法
-
第一种分法
- 输入流
- 输出流
- 输入和输出是针对Java的程序而言
-
第二种分法
-
字节流
- 核心类
- InputStream
- FileInputStream
- fis = new FileInputStream("./from.txt");
- int read(byte[] b, int off, int len)
- OutputStream
- FileOutputStream
- fos = new FileOutputStream("./to.txt");
- void write(byte[] b, int off, int len)
- 无缓冲
- 字节流是最基本的
- 所有的文件在硬盘或在传输时都是以字节的方式进行的
- 主要用在处理二进制数据
-
字符流
- 核心类
- Reader
- FileReader
- fr = new FileReader("./from.txt");
- int read(char[] c, int off, int len)
- Writer
- FileWrite
- fw = new FileWriter("./to.txt");
- int write(char[] c, int off, int len)
- 有缓冲
- 当执行写入操作时,需要用flush()或者close()操作,
将缓冲中的数据放入到文件中
- 字符是只有在内存中才会形成
- 主要用在处理文本
- 这其中涉及到了Java的编码格式问题
- 实际开发中出现的汉字问题实际上都是
在字符流和字节流之间转化不统一而造成的
-
字节流和字符流之间的相互转化
- 字节流转化为字符流
- 实际上就是byte[]转化为String
- public String(byte bytes[], String charsetName)
charsetName是用来设置字符编码的,当指定时,
会采用操作系统的lang来设定
- 字符流转化为字节流
- 实际上是String转化为byte[]
- byte[] String.getBytes(String charsetName)
charsetName是用来设置字符编码的,当指定时,
会采用操作系统的lang来设定
-
第三种分法
-
节点流
- 核心类
- FileReader
- fileReader = new FileReader("./user.txt");
-
处理流
- 核心类
- BufferedReader
- BufferedReader in = new BufferedReader(FileReader实例对象);
- public String readLine() throws IOException
-
节点流与处理流的关系
- 节点流是被装饰者,它实现了最基本的读写文件操作;
处理流是装饰者,它在节点流的基础上添加了新的功能
- 处理流不仅仅只装饰节点流,还可以装饰
别的Reader,接受来自键盘或者网络的输入
-
读取文件和写入文件的方法
-
字节流
-
基本读写方法
- TestByteIO.rar
-
大文件的读写方法
- BigFileFileIO.rar
-
字符流
-
基本读写方法
- TestCharIO.rar
-
处理流
-
基本使用方法
- TestBufferedReaderIO.rar