JDK初步
其他方向基础
JAVA WEB编程
针对Web程序
J2EE
企业级应用
J2ME
移动设备
移动增值
SP运营商
heap:new出来的
stack:局部变量
data segment:静态变量 字符串常量
code segment:代码
1、boolean类型不能转换为其它数据类型
2、整形,字符型,浮点型的数据在混合运算中相互转换,转换遵循以下原则:
①容量小的类型自动转换为容量大的数据类型:
byte short(两个字节) char(两个字节)<int <long <float<double;
byte short char 不能相互转换,三者计算时首先转换为int类型
②容量大的数据类型转换为容量小的数据类型时,要加上强制转换符,但可能造成精度降低或者溢出
③有多种类型数据混合运算时,系统首先自动将所有数据转换成容量最大的类型,然后再计算
实数常量:1.2 默认double
整数常量:123 默认int
写方法:名字、参数类型、返回值
方法重载(OverLoad):①参数类型不一样②参数个数不一样(构造函数也可以重载)
this关键字:
①在类方法定义中使用的this关键字代表使用该方法的对象的引用
②当必须指出当前使用方法的对象是谁时使用this
③有时使用this可处理方法中成员变量和参数重名情况
④this可看作一个变量,值是当前对象的引用
static键字:(data seg)
①static变量为该类的公用变量,在第一次使用时被初始化,对于该类所有对象来说,static成员变量只有一份
②static方法为静态方法,调用时不会将对象引用传递给它,所以在static方法中不可访问非static成员
③可通过对象引用或类名(不需要实例化)访问静态成员
包:提供类的多重类命名空间
package com.hitwh.java //域名
①如果将一个类打包,则使用该类时,必须使用该类的全名(如:com.hit.MyClass),java编译器才会找到该类
②也可使用import在文件开头引入要使用的类
import com.hitwh.MyClass;
import java.util.*;//引入java.util包中所有类
MyClass myClass=new MyClass();//可以直接使用类
可以不需要使用import 语句直接用java.lang包中的类
③如果将一个类放入包中,在这个类源文件第一句话写package
④必须保证该类class文件位于正确目录下:该类源码可能会产生影响——删除或移到别的目录
⑤另外的类想访问的话:写全名、引入 *或者具体类名
⑥访问位于同一个包中的类不需要引入
⑦必须class文件的最上层包的父目录位于classpath下
⑧执行一个类需要写全包名
J2SDK主要包:
java.lang:包含一些java语言的核心类,如String,Math,Integer,System和Thread,提供常用功能。(只有此包不需要导入直接用)
java.awt:包含了构成抽象窗口工具集(abstract window toolkits)的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)。
java.applet:包含applet运行所需的一些类。
java.net:包含执行与网络相关的操作类。
java.io:包含能提供多种输入/输出功能的类。
java.util:包含一些实用工具类,如定义系统特性,使用与日期日历相关的函数
1、打包命令:jar -cvf test.jar *.*
2、打成jar包之后用时候直接把jar包路径设到classpath里
访问控制: 类内部 同一个包 子类 任何地方
①private: 1
②default: 1 1
③protected: 1 1 1
④public: 1 1 1 1
public类可以在任意地方访问
default类只可以被同一个包内部的类访问
方法的重写(OverWrite):(从父类copy防止写错)
①在子类中可根据需要对从基类继承来的方法重写
②重写方法必须和被重写方法具有相同方法名称、参数列表和返回类型
③重写方法不能使用比被重写方法更严格的访问权限
super关键字:在java类中使用super来引用基类的成分
继承中的构造方法:
①子类构造过程中必须调用其基类构造方法
②子类可以在自己构造方法中调用super(arument_list)调用基类构造方法
使用this(argument_list)调用本类其它构造方法
如果调用super,必须写在子类构造方法的第一行
④如果子类的构造方法中没有显式调用基类构造方法,则系统默认调用基类无参数的构造方法
⑤如果子类构造方法中既没有显式调用基类构造方法,而基类中又没有无参的构造方法,则编译出错
this():调用自身另一个构造方法
Object类是所有java类的根基类
如果在类的什么中未使用extends关键字指明其基类,则默认基类为Object类
public class Person{... } <=> public class Person extends Object{... }
toString方法:
①object类中定义有public string toString()方法,其返回值是string类型,描述当前对象的有关信息
②在进行string与其它类型数据的连接操作时,如System.out.println(“hit”+var);将自动调用该对象类的toString()方法
③可以根据需要在用户自定义类型中重写toString()方法
哈希编码:记录每个对象独一无二的位置(java实现有问题 内容不同的对象hash编码一样)
public boolean equals(object obj)方法:提供定义对象是否“相等”的逻辑
①object的equals方法定义为:x.equals(y)当x和y是同一个对象的应用时返回true否则返回false
②J2SDK提供一些类如String,Date等,重写了object的equals方法,调用这些类的equals方法,x.equals(y),当x和y所引用的对象是同一类对象且属性内容相等时(并不一定时相同对象)返回true否则返回false
③可根据需要在用户自定义类型中重写equals方法
对象转型:
①一个基类的引用类型变量可以“指向”其子类的对象(动物参数 传狗)
②一个基类的引用不可访问其子类对象新增加的成员(属性和方法)
③可以使用 引用 变量 instanceof 类名 来判断该引用型变量所“指向”的对象是否属于该类或该类的子类
④子类的对象可以当做基类的对象来使用 称作向上转型(upcasting)反之称为向下转型(downcasting)
instanceof探测实际整个对象是什么类型 不是看引用什么类型
动态绑定(迟绑定):
①动态绑定是指在执行期间而非编译期间判断所引用对象的实际类型,根据其实际的类型调用其相应方法 new的是谁就找谁的方法
②多态条件:继承+重写+父类引用指向子类对象
抽象类:
①用abstract关键字来修饰一个类时叫抽象类;用abstract来修饰一个方法时,该方法叫做抽象方法
②含有抽象方法的类必须被声明为抽象类,抽象类必须被继承,抽象方法必须被重写
③抽象类不能被实例化
④抽象方法只需声明而不需实现
final关键字:
①final变量的值不能够被改变(final的成员变量、final的局部变量形参)
②final的方法不能被重写
③final的类不能被继承
接口:是抽象方法和常量值的定义的集合。从本质上讲,接口是一种特殊抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现
接口特性:
①接口可以多重实现 一个类可以实现多个接口 多继承
②接口中声明的属性默认为 public static final的;也只能是public static final的;
③接口中只能定义抽象方法,而这些方法默认是public也只能是public
④接口可以继承其它接口,并添加新的属性和抽象方法
⑤多个无关的类可以实现同一接口
⑥与继承关系类似,接口与实现类之间存在多态性
classpath
G:\java;.;
C:\ProgramData\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;G:\JDK1.8\bin
接口接口之间继承 类和类继承
类总结:内存分析贯穿始终
1、对象和类的概念
2、类(对象)之间的关系
3、面向对象设计思想
4、class
5、new 引用的概念 构造方法的概念(无返回值)
6、方法重载(参数类型个数不一样)构造方法重载
7、this
8、static成员变量属于所有类 放在data seg 类名.变量名访问
9、package & import 解决类重名问题
10、private default protected public
11、extends
12、overwrite
13、final
14、object toStrig、equals
15、upcasting(向上转型 父类引用指向子类对象或者接口引用指向实现了接口的类的对象) downcasting
16、多态 polymorphism/dynamic bindig/late new哪个类找哪个方法
17、abstract class
18、interface implements
四、Java异常处理:运行期出现的错误 观察错误名字和行号最重要
1、Java异常概念
2、Java异常的分类
3、异常的捕获和处理
①Java异常是Java提供的用于处理程序中错误的一种机制
②所谓错误是指在程序运行中发生的一些异常事件(如 除0溢出、数组下标越界、读取文件不存在)
③设计良好的程序应该在异常发生时提供处理这些错误的方法,使得程序不会因为异常的发生而阻断
或者发生不可预见的结果
④Java程序的执行过程中如出现异常事件,可以生成一个异常类对象,该异常对象封装了异常事件的信息并将被提交给Java运行时系统,该过程叫抛出throw异常
⑤当Java运行时系统接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获catch异常
1、try里写有可能异常的语句 每个try伴随一个或多个catch语句,用于处理可能产生不同类型的异常对象
2、catch里写处理异常语句 catch(SomeException e)封装了异常事件发生的信息 在catch语句块中可以使用这个对象一些方法获取这些信息
如:getMessage()方法用来得到有关异常事件的信息
printStackTrace()方法,用来跟踪异常事件发生时执行堆栈的内容
finally语句为异常处理提供一个统一的出口,使得在控制流程转到程序的其它部分以前,能对程序状态作统一管理
无论try所指定的程序块中是否抛出异常,finally所指定代码都要执行
通常finally语句中可以进行资源的清除工作,如 关闭打开的文件、删除临时文件
runtimexception可处理也可不处理
Error:称为错误,由Java虚拟机生成并抛出,包括动态链接失败,虚拟机错误等,程序对其不做处理
Exception:所有异常类的父类,其子类对应了各种各样可能出现的异常事件,一般需要用户显式的声明和捕获
Runtime Exception:一类特殊的异常,如被0除,数组下标超范围等,其产生比较频繁,处理麻烦,如果显式声明或捕获将会对程序可读性和运行效率影响很大。因此由系统自动检测并将它们交给缺省的异常处理程序(用户可不必对其处理)
五个关键字:try catch finally throw throws
自定义异常:
1、继承java.lang.exception类声明自己的异常类
2、在方法适当位置生成自定义异常的实例,并用throw语句抛出
3、在方法的声明部分用throws语句声明该方法可能抛出的异常
重写方法需要抛出与原方法所抛出异常类型一致(子类可以覆盖父类)或者不抛出异常
五、数组
数组变量属于引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量
数组中的元素可以是任何数据类型,包括基本类型和引用类型
int a[];int[] a;
Java中声明数组时不能指定其长度(数组中元素的个数)如int a[5];
元素是引用数据类型的数组中每一个元素都需要实例化
动态初始化:数组定义与数组元素分配空间和赋值操作分开进行 int a[]=new int[2];a[1]=1,a[2]=2;
静态初始化:定义数组同时就为数组元素分配空间并赋值 int a[]={1,2,3} Day d[]={new date(),new date()}
数组是引用类型,它的元素相当于类的成员变量,因此数组分配空间后,每个元素也被按照成员变量的规则被隐式初始化
使用java.lang.System类的静态方法 arraycopy
搜索建立在排好序之上
Java中多维数组的声明和初始化应按从高到低维顺序进行 如 int a[][]=new int[3][]; a[0]=new int[2];a[1]=new int[4];a[2]=new int[3];
静态初始化:int intA[][]={
{1,2},{2,3},{3,4,5}};
int intB={
{1,2},{2,3},{4,5}};//非法
动态初始化:int a[][]=new int[3][5];
int b[][]=new int[3][];
b[0]=new int[2]; b[1]=new int[3]; b[2]=new int[5];
六、常用类
1、字符串相关类(String,StringBuffer)
2、基本数据类型包装类
3、Math类
4、File类
5、枚举类
String类
①java.lang.String类代表不可变字符序列
②"xxxx"为该类一个对象
③string类的常见构造方法
String(string original)//创建一个string对象original的拷贝
String(char[] value)//用一个字符数组创建一个string对象
String(char[] value,int offset,int count)//用一个字符数组从offset开始的count个字符序列创建string对象
string类常用方法:
public char charAt(int index)//返回字符串中第index个字符
public int length()//返回字符串长度
public int indexOf(string str)//返回字符串中出现str的第一个位置
public int indexOf(string str,int fromIndex)//返回字符串中从fromIndex开始出现str的第一个位置
public boolean equalsIgnoreCase(string another)//比较字符串与another是否一样(忽略大小写)
public string replace(char oldChar,char newChar)//在字符串中用newChar字符替换oldChar字符
startwith、endwith、touppercase、tolowercase、substring、trim
public static String valueOf()可以将基本数据类型转换成string
public string[] split(string regix)
java.lang.StringBuffer代表可变的字符序列
StringBuffer和String类似,但StringBuffer可以对其字符串进行改变
StringBuffer类常见构造方法:
①StringBuffer()创建一个不包含字符序列的空的stringbuffer对象
②StringBuffer(string str)创建一个stringbuffer对象,包含与String对象Str相同的字符序列
基础数据类型包装类:
public static final int MAX_VALUE//最大int值
public static final int MIN_VALUE//最小int值
public long longValue() //返回封装数据的long型值
public double doubleValue() //返回封装数据的double值
public int intValue() //返回封装数据的int值
public static int parseInt(String s) throws NumberFormatException //将字符串解析成int数据,返回该数据
public static Integer valueOf(string s) throws NumberFormatException//返回integer对象,其中封装的整形数据为字符串s所表示
Math类
java.lang.Math提供了一系列静态方法用于科学计算:其方法的参数和返回值类型一般为double型
abs绝对值
acos,asin,atan,cos,sin,tan
sqrt平方根
log自然对数
exp e为底指数
max(double a,double b)
min(douoble a,double b)
random() 返回0.0到1.0的随机数
long round(double a) double型的数据a转换为long型(四舍五入)
toDegrees(double angrad) 弧度->角度
toRadians(double angdeg)角度->弧度
File类
java.io.File类代表系统文件名(路径和文件名)
1、public File(string pathname)//以pathname为路径创建file对象,如果pathname是相对路径,则默认的当前路径在系统属性user.dir中存储
2、public File(string parent,string child)//以parent为父路径,child为子路径创建File对象
File静态属性String separator存储了当前系统的路径分隔符
canRead\canWrite\exists\isDirector\isFile\isHidden\lastModified\length\getName\getPath
通过File对象创建空文件或目录(在该对象所指的文件或目录不存在的情况下)
createNewFile() throws IOException
delete()
mkdir()
mkdirs()//创建在路径中的一系列目录
注意:Windows/linux下均可用正斜杠 ‘/’
java.lang.Enum枚举类型
①只能取特定值中的一个
②用enum关键字
③java.lang.Enum类型
容器:1136
容器API
Collection接口
Iterator接口
增强的for循环
set接口
list接口和comparable接口
collections类
Map接口
自动打包和解包
泛型
Collection:接口-定义了存取一组对象的方法,其子接口Set和List分别定义了存储方式
Set中数据对象:没顺序,不可重复
List。。。。:有顺序,可重复
Map接口定义了存储“键key”-“值value”映射对的方法
两个对象相等,它们的hashCode相等;
Collection:
①容器类对象在调用remove,contains等方法时需要比较对象是否相等,这会涉及到对象类型的equals方法和hashCode方法;对于自定义的类型,需要重写equals和hashCode方法以实现自定义的对象相等规则
注意:相等的对象应该具有相等的hash codes
!!!重写equals方法应该重写hashcode方法,两个对象equals它们hashcode相等
iterator遍历时只能调用自己的remove方法 (锁定)
增强的for循环:
数组:不能方便访问下标值
集合:与使用iterator相比,不能方便删除集合中的内容,在内部也是调用iterator
总结:除了简单遍历并读出其中的内容外,不建议用for
Set接口:set接口是collection子接口,set接口没有提供额外的方法,但实现set接口容器类中元素是没有顺序的,而且不可重复
set容易可以与数学中的“集合”概念对应
J2SDK API所提供的set容器类有HashSet,TreeSet等
List接口:是collection的子接口,实现List接口的容器类中的元素是有顺序的,而且可以重复
List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素
J2SDK提供的list容器类有arraylist,linkedlist等
get()/set()/add/remove/indexOf/lastIndexOf(Object o)
1136:1个图1个类
java.util.collections提供了一些静态方法实现了基于List容器的一些常用算法
sort/shuffle/reserve/fill/copy/binarySearch
comparable接口
根据什么确定容器中对象的“大小”顺序?
所有可以“排序”的类都实现了java.lang.comparable接口,comparable接口中只有一个方法
public int compareTo(object obj)
返回0 表示this=obj
返回正数 表示this>obj
返回负数 表示this<obj
实现了comparable接口的类通过实现compareTo方法从而确定该类对象的排序方式
如何选择数据结构:
array读快改慢
linked改快读慢
hash两者之间
Map接口:
①实现Map接口的类用来存储键-值对
②Map接口的实现类有HashMap(哈希表做索引)和TreeMap(二叉树做索引)等
③Map类中存储的键-值对通过键来标识,所以键值不能重复(之间互相equals 效率低 直接比较对象的hashcode返回int 所以重写equals必须重写hashcode)
Auto-boxing/unboxing
在合适的时机自动打包、解包
自动将基础类型转换为对象
自动将对象转换为基础类型
线程:
是一个程序里面不同的执行路径
进程是一个静态概念
在一个时间点只能执行一个线程
优先级越高 分配的时间片越多
run方法一结束 线程就结束
一个方法被锁定之后另外一个线程不可能再执行这个方法,但还可以执行其它没有锁定的方法
保证同一时间只能一个线程访问此方法
wait是object类的方法,wait时别的线程可以访问锁定对象
sleep是thread类方法,sleep时别的线程不能访问锁定对象
网络:
子网掩码中为1的表示网络id 为0表示有多少主机
端口号用1024以下的 以上可能被系统征用
TCP端口 UDP端口分开的 每一个65536个端口
UDP本身没server,client之分
GUI:
flowlayout是panel默认布局管理器
borderlayout是frame默认布局管理器
能在编译时出错就不要在运行时候出错!!!!!!!!!
frame是顶级窗口 panel无法单独显式必须添加某个容器中
使用布局管理器时,布局管理器负责设置各个组件大小和位置用户无法设置除非setLayout(null)取消布局管理器
反射:
ClassLoader的类加载机制 把类加载到内存
①并非一次性加载
②需要时候加载(运行期间动态加载)
③-verbose:class 观察类的具体加载过程
④static语句块在加载后执行一次
⑤dynamic语句块每次new新对象都会执行 等同于构造方法中的语句 用的少
bootstrap class loader:本地语言写出来的 load the core class of jdk
extension class load:loader the class from jre/lib/ext 即jdk扩展类
application clas loader:ClassLoader.getSystemClassLoader().getClass().getName()
otherclassloader
一个类访问另一个类里的局部变量:
①局部变量设置为成员变量(或者不设置,然后在这个类写构造方法时候设置参数,这样局部变量可传入类中
②持有对方的引用!!! 即直接传整个对象的引用 不具体传对象的属性
③内部类 可以直接访问包装类(外面的类)的成员变量或方法 可以更清楚组织逻辑 防止不应该被其它类访问的类进行访问 ???何时使用:该类不允许或不需要其它类进行访问时
假如A接口里有F() B接口也有F()(返回值不同) 则可以外面包装类实现一个F() 内部类再实现一个F()
Graphics paint 画在哪就看画笔在哪个类里
drawLine是abstract类型 说明重画时传递的画笔是graphics的子类 重写了drawLine方法
repaint->update()->paint()
接受请求处理数据:
①异步方式:uil包
②传统解决办法:多线程 把接收客户端进来(主线程) 和 来回传数据(每个客户端一个线程)的分开
静态类new不出来动态的内部类,解决办法:将该类写在单独一个函数里 在main函数里调用
Chat:停止线程考虑 join
JDBC:jar包、mysql connectors
日期处理:
simpledateformat
calendar
获取当前日期:
正则表达式:
Pattern p = Pattern.compile("[a-z]{3}");// 先编译之后匹配快一些
Matcher m = p.matcher("fgh");// 匹配器
System.out.println(m.matches());
[]里面的字符 取得其中某一个字符
//^在[]外表示开头 在[]内表示取反
\\b单词边界:空格 空白字符 特殊字符 换行
//matches find lookingAt
Pattern p=Pattern.compile("\\d{3,5}");
String s="123-34545-234-00";
Matcher m=p.matcher(s);
System.out.println(m.matches());//找到第4个字符发现不合适 再找直接从第5个开始
m.reset();
System.out.println(m.find());//找匹配的子串 找到之后正则引擎会把找到的子串去掉从剩下的子串接着找
System.out.println(m.find());//找匹配的子串 找到之后正则引擎会把找到的子串去掉从剩下的子串接着找
System.out.println(m.find());//找匹配的子串 找到之后正则引擎会把找到的子串去掉从剩下的子串接着找
System.out.println(m.find());//找匹配的子串 找到之后正则引擎会把找到的子串去掉从剩下的子串接着找
System.out.println(m.lookingAt());//每次找时候从开始位置找
System.out.println(m.lookingAt());
System.out.println(m.lookingAt());
System.out.println(m.lookingAt());