Java 其它基础知识

一、Java内存

1、内存概述

内存是计算机中的重要原件,临时存储区域,作用是运行程序。
我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存。
Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。

2、JVM的内存划分:

  • 寄存器,给CPU使用,和我们开发无关。
  • 本地方法栈:JVM在使用操作系统功能的时候使用,和我们开发无关。
  • 方法区:存储可以运行的class文件。
  • 堆内存:存储对象或者数组,new来创建的,都存储在堆内存。
  • 方法栈:方法运行时使用的内存,比如main方法运行,进入方法栈中执行。

在这里插入图片描述
3、一个数组的内存图
在这里插入图片描述
4、两个数组的内存图
在这里插入图片描述5、两个变量指向一个数组
在这里插入图片描述

二、类与对象

1、创建一个对象的内存图
在这里插入图片描述

方法区:保存所有编译后的类的信息
栈:运行时遇到哪个方法,就将那个方法压进栈中运行
堆:创建的对象实例就在堆中开辟一片空间,将空间地址赋值给变量

2、创建两个对象的内存图

在这里插入图片描述3、参数类型为类对象(在内存中)的运行模式

在这里插入图片描述4、成员变量和局部变量区别

  • 在类中的位置不同(本质)
    • 成员变量:类中,方法外
    • 局部变量:方法中或者方法声明上(形式参数)
  • 作用范围不一样
    • 成员变量:类中
    • 局部变量:方法中
  • 初始化值的不同
    • 成员变量:有默认值
    • 局部变量:没有默认值。必须先定义,赋值,最后使用
  • 在内存中的位置不同
    • 成员变量:堆内存(对象实例在堆中)
    • 局部变量:栈内存 (方法在栈中运行)
  • 生命周期不同
    • 成员变量:随着对象的创建而存在,随着对象的消失而消失(对象的消失,不依赖于方法,取决于垃圾回收机制
    • 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失

三、String类对象

1、概述

java.lang.String 类代表字符串。
Java程序中所有的字符串文字(例如 “abc” )都可以被看作是实现此类的实例。

2、特点
  1. 字符串不变:字符串的值在创建后不能被更改。
String s1 = "abc"; 
s1 += "d"; 
System.out.println(s1); 	// "abcd" 
// 内存中有"abc","abcd"两个对象,s1从指向"abc",改变指向,指向了"abcd"。

String s1 是一个类对象
它指向内存中开辟的"abc"空间地址
拼接(改变值)会重新开辟空间,再重新指向新的地址


多个对象的值相同只会开辟一个空间,共用一个地址

  1. 因为String对象是不可变的,所以它们可以被共享。
String s1 = "abc"; 
String s2 = "abc"; 
// 内存中只有一个"abc"对象被创建,同时被s1和s2共享。
  1. 字符串等效于字符数组
例如: 
String str = "abc";

相当于: 
char data[] = {'a', 'b', 'c'}; 
String str = new String(data); 
// String底层是靠字符数组实现的。
3、使用
构造方法
public String() :初始化新创建的 String对象,以使其表示空字符序列。
public String(char[] value) :通过当前参数中的字符数组来构造新的String。 
public String(byte[] bytes)
4、常用方法
public boolean equals(Object anObject) :将此字符串与指定对象进行比较。 
public boolean equalsIgnoreCase(String anotherString) :将此字符串与指定对象进行比较,忽略大小写。
				
public int length() :返回此字符串的长度。 
public String concat(String str) :将指定的字符串连接到该字符串的末尾。 
public char charAt(int index) :返回指定索引处的 char值。 
public int indexOf(String str) :返回指定子字符串第一次出现在该字符串内的索引。

public static String copyValueOf(char[] data): 返回指定数组中表示该字符序列的字符串。
public char[] toCharArray():将字符串转换为字符数组。

public String[] split(String regex):注意: '.''|''*' 等转义字符,必须得加 \\。
									注意:多个分隔符,可以用 | 作为连字符。
public String substring(int beginIndex, int endIndex):返回字符串的子字符串。
public String trim():用于删除字符串的头尾空白符。

四、static关键字

1、概述

static ,它可以用来修饰的成员变量和成员方法,被修饰的成员是属于类的,而不是单单是属于某个对象的。
也就是说,既然属于类,就可以不靠创建对象来调用了。

2、类变量:使用 static关键字修饰的成员变量

该类的每个对象都共享同一个类变量的值。
任何对象都可以更改该类变量的值,
也可以在不创建该类的对象的情况下对类变量进行操作。

定义格式: static 数据类型 变量名; 
举例:static int ID;
3、类方法:使用 static关键字修饰的成员方法,即静态方法。

静态方法在声明中有 static ,建议使用类名来调用,而不需要创建类的对象。

定义格式: 修饰符 static 返回值类型 方法名 (参数列表){ // 执行语句 } 
举例:在类中定义静态方法 
public static void showNum() { 
	System.out.println("num:" + numberOfStudent);
 }

静态方法调用的注意事项
静态方法可以直接访问类变量和静态方法。
静态方法不能直接访问普通成员变量或成员方法。
反之,成员方法可以直接访问类变量或静态方法。
静态方法中,不能使用this关键字。
静态方法只能访问静态成员

// 访问类变量 
	类名.类变量名; 
// 调用静态方法 
	类名.静态方法名(参数)
4、静态原理

static 修饰的内容:
是随着类的加载而加载的,且只加载一次存储于一块固定的内存区域(静态区),
所以,可以直接被类名调用。
它优先于对象存在,所以可以被所有对象共享。

在这里插入图片描述

5、静态代码块

定义在成员位置,使用static修饰的代码块{ }。

  • 位置:类中方法外。
  • 执行:随着类的加载而执行且执行一次,优先于main方法和构造方法的执行。

格式:
作用:给类变量进行初始化赋值

public class Game { 
	public static int number; 
	public static ArrayList<String> list; 
	static { 
		// 给类变量赋值 
		number = 2; 
		list = new ArrayList<String>(); 
		// 添加元素到集合中 
		list.add("张三"); 
		list.add("李四");
	} 
}
6、应用

在使用的过程中,其主要目的还是想在不创建对象的情况下,去调用方法。

public static String toString(int[] a) :返回指定数组内容的字符串表示形式。

public static void main(String[] args) { 
	// 定义int 数组
	int[] arr = {2,34,35,4,657,8,69,9}; 
	// 打印数组,输出地址值 
	System.out.println(arr); // [I@2ac1fdc4 
	// 数组内容转为字符串 
	String s = Arrays.toString(arr); 
	// 打印字符串,输出内容 
	System.out.println(s); // [2, 34, 35, 4, 657, 8, 69, 9] 
}

public static double abs(double a) :返回 double 值的绝对值。

double d1 = Math.abs(5);	 //d1的值为5 
double d2 = Math.abs(5);	 //d2的值为5

public static long round(double a) :返回最接近参数的 long (四舍五入)

long d1 = Math.round(5.5); 	//d1的值为6.0 
long d2 = Math.round(5.4); 	//d2的值为5.0

多线程

一个进程中有多个线程:Thread类

GUI编程

要想在桌面应用创建一个窗口,首先要有一个面板的概念,也就是说我们的按钮、文本框之类都需要放到一个面板上

Frame类就相当于是面板

		Frame frame=new Frame();
		
		//默认情况下,面板是不显示的
		frame.setVisible(true);		//显示面板
		
		//设置面板的长度和宽度
		frame.setSize(500,500);
		
		//默认情况下,我们的组件铺满整个容器,所以需要设置浮动
		frame.setLayout(new FlowLayout());		
		
		//创建一个按钮
		Button btn=new Button();
		btn.setLabel("我是一个按钮");
		btn.setSize(50,50);
		
		//我们需要将按钮放进面板中才会显示
		frame.add(btn);
		
		//点击按钮,可以执行什么命令,绑定什么事件;

网络编程

针对网络上的内容传输和接收

Socket类
网络传输或者接收,一定要有两端
因为只有服务器启动后,客户端才能连接上

									//服务端
try {
			ServerSocket ss = new ServerSocket(10000);	//服务端既然是一个应用程序,那么肯定要有一个端口号
				
			System.out.println("服务端正在连接...");
				
			Socket s=ss.accept(); //等待客户端连接,一旦连接上,客户端的套接字就拿到了,也就是拿到一个Socket对象
				
		//将客户端传来的东西放到缓冲区中
			BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
				
		//写出去我们传给客户端的内容
			PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
				
		//将客户端的内容打印到我们屏幕上
			String line = br.readLine();
			System.out.println(line);
			pw.println("客户端传来的内容是:"+line);
				
			br.close();
			pw.close();
				
			} catch (Exception e) {
				e.printStackTrace();
			}
										//客户端
//创建一个Socket套接字
try {
			//关联到对应主机对应端口号
				Socket s=new Socket("127.0.0.1",10000);
				
			//写东西给服务端
				PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
				
				BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
				
			//具体写什么内容给服务端
				pw.println("hello net");
			//读取到服务端发来的内容
				String line = br.readLine();
				System.out.println(line);
				
				br.close();
				pw.close();
						
			} catch (Exception e) {
				e.printStackTrace();
			} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值