------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
引言
我比较喜欢以一种居高临下的方式先来鸟瞰整个JAVA的知识体系,这样不至于在无边无际的“细节森林”中迷失。当然,刚开始不可能也不需要对每一处知识点都面面俱到,我就以一个初学者的视角,把我所认为的在JAVA中的一些最基础的内容罗列出来,今后再对其中的细节慢慢逐层深入,精雕细琢,这也许和画家作画的方式比较类似。不足之处肯定是在所难免,希望未来我的能力得到进一步提升之后,能够回过头来发现之前在理解上的偏差和缺失。学习一门编程语言,最重要的就是动手做,看老师打再多的代码,还不如自己写一遍来得深刻。所以,我之后博文的主体是亲手实现的代码,而不是一段又一段冗长而又乏味的理论。
挣扎吧,写出第一个JAVA程序
第一步:下载并安装JDK和Eclipse
第二步:配置环境变量
第三步:写下第一个程序并运行,大功告成
/**
*
* @author Woo
*分析:这是我的第一个Java程序,只有一个输出语句
*
*/
/*
* 在java中处处都是类,所以即使是有main的方法,也需要在一个类中实现
* main是一个静态的方法,返回值为空类型
*/
class My1stJava{
public static void main(String[] args){
System.out.println("This is my first Java program!");//调用系统的输出函数,在屏幕上输出语句
}
}
JAVA编程基础
关键字、注释、标识符、常量变量、数据类型、运算符
流程控制:顺序、选择、循环:一个小小的猜数游戏
import java.util.Scanner;
public class GuessingGame {
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
boolean keepPlaying = true;//用来控制游戏的总开关
System.out.println("我们来玩一个猜数游戏");
while(keepPlaying){
boolean validInput;//用来控制do-while循环的开关
int number,guess;//相同的数据类型可以放在一起初始化
String answer;
//随机生成一个数,用于用户的猜测
number = (int)(Math.random() * 10) + 1;
//提示用户输入
System.out.println("\n我想了一个从1到10之间的数字,你觉得是多少");
//以下do-while块用于处理不是1-10范围内的猜测,直到输入正确,才结束循环
do
{
guess = sc.nextInt();
validInput = true;//打开开关
if ((guess < 1) || (guess > 10)){
System.out.println("1到10中间的数字哦!");
validInput = false;
}
}while(!validInput);
//检测猜测的数字
if (guess == number)
System.out.println("结棍,运气噶好!");
else
System.out.println("猜得不对哦" + "正确的数字是" + number);
//以下do-while用于判断用户是否重玩游戏
do
{
System.out.println("\n还想再猜一次吗?(Y or N)");
answer = sc.next();
validInput = true;
if (answer.equalsIgnoreCase("Y"));//如果选Y不做任何处理, 因为游戏总开关开着
else if (answer.equalsIgnoreCase("N"))
keepPlaying = false;//关掉总开关
else
validInput = false;//其他任何不合要求的输入都要重新在这个do-while循环体内进行yes or not的选择
}while(!validInput);//注意:do-while语句的结尾处有分号
}
System.out.println("\n谢谢,再见");//这句句子要放到游戏结束后使用,所以要放在最外面的while(keepPlaying)结束之后
}
}
Methods:使用Methods的猜数字游戏
/**
* 在main中定义了四个方法,提高程序的复用性
* 1.playARound:玩一局游戏,没有返回值
* 2.getRandomNumber:返回1~10之间的随机数(int类型)
* 3.getGuess:得到用户的正确输入后,返回guess的数值(int类型)
* 4.askForAnotherRound:返回一个boolean value来判断是否要重玩游戏
*/
import java.util.Scanner;
public class GuessingGameMethod {
static Scanner sc = new Scanner(System.in);
//由于使用了Method,主函数只负责调用其它函数
public static void main(String[] args) {
System.out.println("我们来玩一个猜数游戏");
do
{
playARound();
} while(askForAnotherRound());
System.out.println("\n谢谢,再见");
}
//方法1:playARound()
public static void playARound()
{
boolean validInput;//用来控制do-while循环的开关
int number,guess;//相同的数据类型可以放在一起初始化
String answer;
//随机生成一个数,用于用户的猜测
number = (int)(Math.random() * 10) + 1;
//提示用户输入
System.out.println("\n我想了一个从1到10之间的数字,你觉得是多少");
//得到用户输入
guess = getGuess();
//检测猜测的数字
if (guess == number)
System.out.println("结棍,运气噶好!");
else
System.out.println("猜得不对哦" + "正确的数字是" + number);
}
//方法2:getRandomNUmber
public static int getRandomNUmber()
{
return (int)(Math.random() * 10) + 1;
}
//方法3:getGuess()
public static int getGuess()
{
for( ; ; ){
int guess = sc.nextInt();
if ((guess < 1) || (guess > 10)){
System.out.println("1到10中间的数字哦!");
}
else
return guess;//输入正确才返回guess的值
}
}
//方法4:askForAnotherRound()
public static boolean askForAnotherRound()
{
while(true)
{
String answer;
System.out.println("\n还想再猜一次吗?(Y or N)");
answer = sc.next();
if (answer.equalsIgnoreCase("Y"))
return true;
else if(answer.equalsIgnoreCase("N"))
return false;
}
}
}
Strings:类提供的方法汇总
1.获取
//获取长度
int length()
//位置->字符
char charAt(int index)
//字符->位置
int indexOf(int ch)//返回的是ch在字符串中第一次出现的位置。
int indexOf(int ch, int fromIndex) //从fromIndex指定位置开始,获取ch在字符串中出现的位置。
int indexOf(String str)//返回的是str在字符串中第一次出现的位置。
int indexOf(String str, int fromIndex) //从fromIndex指定位置开始,获取str在字符串中出现的位置。
int lastIndexOf(int ch)//返回的是ch在字符串中最后一次出现的位置。
//获取子串
String substring(begin)
String substring(begin,end)
2.判断
//是否包含某一子串
boolean contains(str)
//是否有内容
boolean isEmpty()
//是否以指定内容开头
boolean startsWith(str)
//是否是以指定内容结尾
boolean endsWith(str)
//内容是否相同。复写了Object类中的equals方法。
boolean equals(str)
//内容是否相同,并忽略大小写。
boolean equalsIgnoreCase()
3.转换
字符串与字符数组的互换
//字符数组->字符串
//构造函数:
String(char[])
String(char[],offset,count)//将字符数组中的一部分转成字符串。
//静态方法:
static String copyValueOf(char[])
static String copyValueOf(char[] data, int offset, int count)
static String valueOf(char[])
//字符串->字符数组
char[] toCharArray()
字符串与字节数组的互换
//字符串->字符数组
char[] toCharArray()
//字节数组->字符串
String(byte[])
String(byte[],offset,count)//将字节数组中的一部分转成字符串。
//字符串->字节数组
byte[] getBytes()
基本数据类型转换成字符串
//基本数据类型->字符串
static String valueOf(int)
static String valueOf(double)
4.替换
String replace(oldchar,newchar)
5.切割
String[] split(regex)
6.处理与比较
7,转换,去除空格,比较。
//大写<->小写。
String toUpperCase()
String toLowerCase()
//去除两端的多个空格
String trim()
//对两个字符串进行自然顺序的比较。
int compareTo(string)
Arrays:类提供的方法汇总
1.复制
copyOf()
copyOfRange()
2.赋值
fill()
3.相等判定
equals()
deepEquals()
4.返回hashcode
hashCode()
deepHashCode()
5.转换成字符串
toString()
deepToString()
6.排序
sort()
7.查找
binarySearch()
面向对象
一个完整的类
1.Fields
2.Methods
3.Constructors
4.Initializers
5.Other classes and Interface
Static:属于类本身
1. Static fields and methods
2. Static Initializers
3. Signleton pattern
Subclasses and Inheritance:子父类关系
1. Overriding Methods:长江后浪推前浪
2. default、public、private、protected:什么给你什么不给你
3. this and super:要啃老尽管伸手要
4. Constructors的继承:老子的将来都是你的
5. final: methods、classes:有些原则是不容更改的
6. Casting Up and Down:扔来扔去是为何
7. Polymorphism:棒子管他叫多形成
Abstract Classes and Interfaces:玩的是概念,定的是标准
1. Abstract Factory pattern
2. The Marker Interface pattern
Inner Classes and Anonymous Classes:不要问我从哪里来,我的故乡在里向
1. The Observer pattern
2. Static Inner Classes
3. Anonymous Inner Classes
Object和Class类: 老婆,别打了,快和牛博王出来看上帝
1. toString()方法
2. euqals()方法
3. clone()方法
4. getClass()方法
5. 用于线程处理的方法
Packaging and Documenting
1. Working with Packages
2. Putting classes in a JAR File
3. Using JavaDoc to Document Classes
Exceptions:不怕一万,就怕万一
1. Checked Exception and Unchecked Exception
2. 关键字:try、catch、finally、throws、throw
3. Displaying the Exception Message: getMessage()、StackTrace()、toString()
4. 自定义异常
Programming Threads 多线程
线程状态图
线程的创建
1. Extending the Thread class
2. Inplementing the Runnable Interface
线程的同步
1. 同步代码块
2. 同步函数
3. 多线程下的单例模式
线程的死锁
线程的通信
Collection集合
集合的体系结构
Collection接口常用方法:
Collection接口通用方法:
1. 添加: add, addAll
2. 删除: remove, removeAll, clear
3. 判断: contains, containsAll, isEmpty
4. 获取: size, iterator
5. 其他: retainAll, toArray
List接口常用方法
1. 添加:add, addAll
2. 删除:remove
3. 修改:set
4. 获取:get, indexOf, lastIndexOf, subList
Map接口常用方法
1. 添加:value put(key,value):返回前一个和key关联的值,如果没有返回null。
2. 删除:void clear():清空map集合。 value remove(Object key):根据指定的key删除这个键值对。
3. 判断:boolean containsKey(key);boolean containsValue(value); boolean isEmpty();
4. 获取:value get(key):通过键获取值,如果没有该键返回null。int size():获取键值对个数。
Collections工具类常用方法
1. 排序:sort, shuffle
2. 查找:binarySearch, max
3. 替换:replace, replaceAll, fill, swap
4. 反转:reverse, reverseOrder
5. 同步:synchronizedList
Generic Collection Classes
自定义泛型
1. 自定义泛型类
2. 自定义泛型方法
3. 自定义泛型接口
泛型限定
1. ?extends E: 可以接收E类型或者E的子类型。上限。
2. ? super E: 可以接收E类型或者E的父类型。下限.
Input and Output
数据流的行程图
字符流
字节流
File类
1. 文件/目录名操作:
String getName(), String getPath(), String getAbsolutePath(),String getParent(), boolean renameTo(File new Name)
2. 获取常规文件信息操作:
long lastModified(), long length(), boolean delete()
3. File测试操作:
boolean exists(), boolean canWrite(), boolean canRead(), boolean isFile(), boolean isDirectory(), boolean isAbsolute()
4. 目录操作:
boolean mkdir(), String[] list()
Properties集合
IO包中的其他类
1. 打印流:PrintWriter、PrintStream
2. 序列流:SequenceInputStream
3. 文件切割器
4. 文件合并器
5. 操作对象:ObjectInputStream、ObjectOutputStream
6. RandomAccessFile
7. 管道流:PipedInputStream和PipedOutputStream:输入输出可以直接进行连接,通过结合线程使用。
8. 操作基本数据类型:DataInputStream、DataOutputStream
9. 操作字节数组: ByteArrayInputStream、ByteArrayOutputStream
网络编程
网络的层次结构
底层网络通信的实现
1. UDP连接:
UDP发送端:
1.建立UDP的socket服务、2.将要发送的数据封装到数据包中、3.通过UDP的socket服务将数据包发送出去、4.关闭socket服务。
UDP接收端:
1.建立UDP的socket服务(必须明确一个端口号)、2.创建数据包(用于存储接收到的数据)、3.使用socket的receive方法将接收的数据存储到数据包中、4.通过数据包的方法解析数据包中的数据、5.关资源
2. TCP连接:
客户端发数据到服务端:
1.建立 TCP客户端Socket服务、2.如果连接建立成功,说明数据传输通道已建立、3.使用输出流,将数据写入、4.关闭资源服务端接收客户端发送过来的数据,并打印到控制台上:
1.创建服务端socket服务(服务端必须对外提供一个端口,否则客户端无法连接)、2.获取连接过来的客户端对象、3.通过客户端对象获取socket流读取客户端发来的数据,并打印、4.关闭资源,关客户端,关服务端