黑马程序员——JAVA菜鸟修炼记之天下大势:Java体系鸟瞰

------- <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



JVM、JRE、JDK的关系一目了然,作为开发人员,选择JDK8下载并安装,然后下载Eclipse,Eclipse不需要安装,第二步配置成功后可以直接打开。
经验:JDK8已经不支持XP系统,如果一定要在XP系统上安装,要么去下载7,要么用7z软件解压安装包进行配置(参照网上经验文章),另外我在XP系统上安装最新版的Eclipse时也出现了“JVM安装错误”的问题,根据网友的经验博文更改Eclipse的配置文件中的相关信息可解决问题。

第二步:配置环境变量


在配置环境变量之前,需要先了解一些最基本的DOS命令,除了上图所示的内容之外,还有dir(directory)、cls(清屏)、echo(创建文件)等命令。

组合使用DOS命令的小任务:
        在桌面上创建一个文件夹A,再在该文件夹中创建一个子文件夹AA。在AA中创建trash1.doc和trash2.doc两个文件,然后退到A中,创建trash.txt、trash2.txt、trash3.doc三个文件。然后再进入到AA中,删除该目录下所有文件,然后删除AA文件夹,然后删除A中后缀名为txt的所有文件,再删除其他文件,最后删除A文件夹并退出。

配置环境变量的方法:右击我的电脑—> 属性—>高级—>环境变量—>path,把javac.exe的目录路径添加到path变量里,用分号”;”与其他值分隔开。
配置环境变量的目的:环境变量配置包括path与classpath配置,是用来告诉操作系统编译器运行的路径和生成的类路径。
配置环境变量的技巧:可以先创建一个环境变量JAVA_HOME保存JDK的路径,然后在path中通过%%动态获取JAVA_HOME的值。

经验:在cmd中执行javac时,出现了乱码,主要是由于下载的是中文版的javaSE,需要把cmd的编码默认值改成GBK编码,就能正常显示。

第三步:写下第一个程序并运行,大功告成

/**
 * 
 * @author Woo
 *分析:这是我的第一个Java程序,只有一个输出语句
 *
 */

/*
 * 在java中处处都是类,所以即使是有main的方法,也需要在一个类中实现
 * main是一个静态的方法,返回值为空类型
 */
class My1stJava{
	public static void main(String[] args){
		System.out.println("This is my first Java program!");//调用系统的输出函数,在屏幕上输出语句
	}
}


以上便是创建一个java程序的最基本的过程图示,在Eclipse中可以直接编译运行,在DOS中可以先输入javac + 类名,会生成一个.class的文件,然后再输入java + 类名,得到结果。

JAVA编程基础

关键字、注释、标识符、常量变量、数据类型、运算符

从我个人的角度来理解,以上这些内容都是一种人为的划分,有些是在对内存空间的分配方法进行划分(比如常量变量、数据类型),有些是对代码块的划分(注释就是把代码和代码的解释给分开),有些是对处理方式的划分(运算符),通过这些人为定义的规则,原本只能表示0和1的高低电平被赋予了无穷无尽的强大新能力。

流程控制:顺序、选择、循环:一个小小的猜数游戏

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.关闭资源,关客户端,关服务端


GUI图形化编程

GUI组件关系图


布局管理器


事件监听















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值