第四周:内存和指针和Java快速上手
CSDN学习小组–第四周
内存和指针
内存划分
内存是一段连续的地址空间用于CPU进行快速访问的物理存储器件,但每个内存地址的大小由机器字长指定,一个32位操作系统最多只能处理32位地址,所以可管理的空间大小为 2 32 2^{32} 232B,可换算成4GB,所以字长为32位的操作系统,最多可操纵的内存为4GB,而64位操作系统可管理的空间大小为 2 64 2^{64} 264B,这样,64位操作系统可管理的空间就很大了。
其内存结构图为:
一般我们将内存分为:堆区、栈区、全局区、代码区、常量区,各个区域存放的内容:
栈区:在程序中所创建的局部变量、参数、数组、指针等,当程序执行完后,将释放所占用的该块内存。
堆区:该片区域中存放着我们手工申请的内容,如:Malloc、new所创建。
全局区:全局变量、静态变量,在我们程序执行完之后将自动释放所占用的内存。
代码区:存放着函数体的二进制代码。
常量区:包含着整形常量、字符串常量,该区域内容不能被修改。
指针
Java快速上手
Java不同于一般的编译语言或直译语言。它首先将源代码编译成字节码,然后依赖各种不同平台上的虚拟机来解释执行字节码,从而实现了“一次编写,到处运行”的跨平台特性。在早期JVM中,这在一定程度上降低了Java程序的运行效率。但在J2SE1.4.2发布后,Java的运行速度有了大幅提升。
Java语言特性:
- 简单的
- 面向对象
- 分布式
- 健壮
- 安全
- 体系结构中立
- 可移植
- 解释型
- 高性能
- 多线程
- 动态
Java三个体系
Java 3个体系:
- JavaSE (Java Platform Standard Edition,java平台标准版)
- JavaEE (Java Platform,Enterprise Edition,java平台企业版)
- JavaME (Java Platform Micro Edition,java平台微型版)
注释和命名
单行注释://
多行注释:/* */
类是Java当中所有源代码的基本组织单位

// 这是一行注释
public class HelloWorld {
//单行注释
public static void main(String[] args) {
//main方法为程序执行入口
/*
多行注释
多行注释
多行注释
*/
System.out.println("Hello, World!");
}
}
标识符
命名规则:(硬要求)
- 可以包含英文26个字母(大小写)、0-9数字,$(美元符号) 和 _(下划线)
- 不能以数字开头
- 不能是关键字
命名规范:(软建议)
- 类名:首字母大写,后面每个单词首字母大写(大驼峰)HelloWorld
- 变量名:首字母小写,后面每个单词首字母大写(小驼峰)helloworld
- 方法名:同变量名
常量:Java程序运行期间固定不变的数据
分类:
类型 | 数据举例 |
---|---|
整数常量 | 0,1,567,-9 |
小数常量 | 0.0,-0.1,2.55 |
字符常量 | ‘a’,‘好’ |
字符串常量 | “A”,“HELLO”,“你好” |
布尔常量 | true,false |
空常量 | null,没有任何数据 |
示例:
public class Demo01Const {
public static void main(String[] args) {
//字符串常量
System.out.println("ABC");
System.out.println("");//字符串两个双引号中间的内容为空
// 整数常量
System.out.println(30);
System.out.println(-500);
// 浮点数常量(小数)
System.out.println(3.14);
System.out.println(-2.5);
// 字符常量
System.out.println('A');
System.out.println('6');
// System.out.println('');必须要又且仅有一个字符,没有不行
// System.out.println('AB');必须要又且仅有一个字符,有两个不行
//布尔常量
System.out.println(true);
System.out.println(false);
//空常量,空常量不能直接用来打印输出
// System.out.println(null);
}
}
运行结果:
ABC30
-500
3.14
-2.5
A
6
true
false
数据类型分类:
基本数据类型:整数、浮点数、字符、布尔
引用数据类型:字符串、类、数组、接口、Lambda
基本数据类型
数据类型 | 关键字 | 内存占用 | 取值范围 | 默认值 |
---|---|---|---|---|
字节型 | byte | 1个字节 | -128~127 | 0 |
短整型 | short | 2个字节 | -32768~32767 | 0 |
整型 | int(默认) | 4个字节 | -231~231-1 | 0 |
长整型 | long | 8个字节 | -263~263-1 | 0L |
单精度浮点数 | float | 4个字节 | 1.4013E-45~3.4028E+38 | 0.0f |
双精度浮点数 | double(默认) | 8个字节 | 4.9E-324~1.7977E+308 | 0.0d |
字符型 | char | 2个字节 | 0~65535 | ‘u0000’ |
布尔类型 | boolean | 1个字节 | true、false | false |
4种访问权限:
修饰符 | 当前类(我自己) | 同一包内(我邻居) | 子孙类(同一包)(我儿子) | 子孙类(不同包)(陌生人) | 其他包 |
---|---|---|---|---|---|
public | Y | Y | Y | Y | Y |
protected | Y | Y | Y | Y/N(说明) | N |
default | Y | Y | Y | N | N |
private | Y | N | N | N | N |
类和对象
-
类:一组相关属性和行为的集合,可以看成是一类事物的模板,使用事物的属性等特征和行为特征来描述该类事物
-
属性:该事物的状态信息
行为:该事物能够做什么
举例:小猫
属性:名字、体重、年龄、颜色
行为:走、跑、叫
- 对象:一类事物的具体体现,类的一个实例
//成员变量
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
File类
java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作
重点:记住3个单词
- file:文件
- directory:文件夹/目录
- path:路径
路径:
绝对路径:完整的路径,以盘符(C:,D:)开始的路径,例如:c:\a.txt
相对路径:简化路径
相对值得是相对于当前项目的根目录,如果使用当前项目的根目录,路径可以简化书写
注意:
- 路径不区分大小写
- 注意文件分隔符
/*
*@文件名:DemoFIle.java
*@创建时间:2020年3月5日下午6:54:40
*@作者:Fang
*@注释:
*/
package File类;
import java.io.*;
public class DemoFile {
public static void main(String[] args) {
//static String pathSeparator 与系统有关的路径分隔符,为了方便,它被表示为一个字符串。
//static char pathSeparatorChar 与系统有关的路径分隔符。
String pathSeparator=File.pathSeparator;
System.out.println(pathSeparator);//路径分隔符 windows:分号;Linux:冒号
//static String separator 与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。
//static char separatorChar 与系统有关的默认名称分隔符。
String separator=File.separator;
System.out.println(separator);//文件名分隔符 windows:反斜杠\;Linux:正斜杆/
}
}
目录的遍历:
public String[] list():File目录中的所有子文件或目录
public File[] listFiles():File目录中的所有子文件或目录
注意:
list方法和listFiles方法遍历的是构造方法中给出的目录
构造方法中目录路径不存在和给出的目录不是一个目录,都会抛出空指针异常
/*
*@文件名:IteratorFile.java
*@创建时间:2020年3月6日下午4:26:25
*@作者:Fang
*@注释:对D盘下的文件输出遍历打印
*/
package File类;
import java.io.File;
import java.util.*;
public class IteratorFile {
public static void main(String[] args) {
String path="D:\\";
getAllFile(new File(path));
}
public static void getAllFile(File fir) {
System.out.println(fir);//打印被遍历的目录名称
File[] files=fir.listFiles();
for (File fil : files) {
//对遍历得到的File对象f进行判断
if(fil.isDirectory()) {
//f是一个文件夹,继续遍历
//递归调用getAllFile
getAllFile(fil);
}else {
//f是一个文件,直接打印
System.out.println(fil);
}
}
}
}
文件过滤器:
java.io.FileFilter接口:用于抽象路径名(File对象)的过滤器
作用:用来过滤文件(File对象)
抽象方法:
boolean accept(File pathname)
java.io.FilenameFilter接口:实现此接口的类实例可用于过滤器文件名
作用:用于过滤文件名称
抽象方法:
boolean accept(File dir,String name)
参数:
File dir:构造方法中转换的被遍历的目录
String name:使用ListFiles方法遍历目录,获取每一个文件/文件夹的名称
注意:两个过滤器接口是没有实现类的,需要我们自己写实现类,重写过来吧方法accept
/*
*@文件名:FileFilter过滤.java
*@创建时间:2020年3月6日下午5:53:53
*@作者:Fang
*@注释:
*/
package File类;
import java.io.*;
import java.util.*;
public class FileFilter过滤 {
public static void main(String[] args) {
String path="D:\\NET";
getAllFile(new File(path));
}
public static void getAllFile(File fir) {
System.out.println(fir);//打印被遍历的目录名称
File[] files=fir.listFiles(new FileFilter过滤().new FileFilterImpl());//传递过滤器对象
for (File fil : files) {
//对遍历得到的File对象f进行判断
if(fil.isDirectory()) {
//f是一个文件夹,继续遍历
//递归调用getAllFile
getAllFile(fil);
}else {
//f是一个文件,直接打印
System.out.println(fil);
}
}
}
class FileFilterImpl implements FileFilter {
@Override
public boolean accept(File pathname) {
System.out.println(pathname);
// return true;
return pathname.getName().toLowerCase().endsWith(".pptx");
}
}
}
TCP编程
TCPClient客户端类代码:
/*
*@文件名:TCPClient.java
*@创建时间:2020年3月16日上午10:58:06
*@作者:Fang
*@注释:
*/
package TCP通信;
import java.io.*;
import java.net.*;
//TCP通信客户端:向服务器发送连接请求,给服务器发送数据,读取服务器回写的数据
//表示客户端的类:
// java.net.Socket:此类实现客户端套接字,套接字是两台机器之间通信的端点
// 套接字:包含了IP地址和端口号的网络单位
/*构造方法:
* Socket(String host,int port)
*成员方法:
* OutputStream getOutputStream()
* InputStream getInputStream()
* void close()
*
*/
public class TCPClient {
//使用方法
public static void main(String[] args) {
try {
// 1. 创建一个客户端对象Socket,构造方法绑定服务器的IP地址和端口号
Socket sk=new Socket("127.0.1",8888);
// 2.使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象
OutputStream ops=sk.getOutputStream();
// 3.使用网络字节输出流OutputStream对象中的方法write,給服务器发送数据
ops.write("你好服务器".getBytes());
// 4.使用Socket中的方法getInputStream()获取网络字节输入流InputStream对象
InputStream ls=sk.getInputStream();
// 5.使用网络字节输入流InputStream对象中的方法read,读取服务器回写的数据
byte[] bytes=new byte[1024];
int len=ls.read(bytes);
System.out.println(new String(bytes,0,len));
// 6.释放资源
sk.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
TCP服务端类示例:
/*
*@文件名:TCPServer.java
*@创建时间:2020年3月16日下午12:34:05
*@作者:Fang
*@注释:
*/
package TCP通信;
import java.io.*;
import java.net.*;
import java.util.*;
/* TCP通信的服务器端:接收客户端的请求,读取客户端发送的数据,给客户端回写数据
* 表示服务器的类:
* java.net.ServerSocket:此类实现服务器套接字
* 构造方法:
* ServerSocket(int port)
* 服务器端必须明确一件事情,必须知道是哪个客户端请求的服务器
* 所以可以使用accept方法获取到请求的客户端对象Socket
* 成员方法:
* Socket accept()
*
*
*/
public class TCPServer {
public static void main(String[] args) {
try {
// 1.创建服务器ServerSocket对象和系统要指定的端口号
ServerSocket server=new ServerSocket(8888);
// 2.使用ServerSocket对象中的accept方法,获取到请求的客户端对象Socket
Socket socket=server.accept();
// 3.使用Socket对象中的方法getInputStream()获取网络字节输入流
InputStream ls=socket.getInputStream();
// 4.使用网络字节输入流InputStream对象中的方法read,读取客户端发送的数据
byte[] bytes=new byte[1024];
int len=ls.read(bytes);
System.out.println(new String(bytes,0,len));
// 5.使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象
OutputStream os=socket.getOutputStream();
// 6.使用网络字节输出流OutputStream对象中的方法write,给客户端回写数据
os.write("收到谢谢".getBytes());
// 7.释放资源,注意是两个!!!
socket.close();
server.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}