Java基础知识

一、基础知识,通过代码进行解释

package helloJava;//package 包的关键字,相当于整个代码的目录

public class helloMain {

	static String strr = "nihao";//全局变量//必须得用static定义,否则程序会出错 
	private static String str = "是我学习Java语言的最佳书籍";
	public static void main(String[] args) {//必须有该句,才能运行程序,且格式是固定的
		int s = 0;
		String str = "";//局部变量
		System.out.print("《Java入门到精通》!" + "\r\n" + str + strr);
	}

}

java中main()方法为主方法,是程序开始执行的地方,必须按照如下的方式进行定义

public static void main(String[] args)

//单行注释

/**/ 多行注释,但在多行注释中,不能嵌套多行注释

/** */ 为文档注释

二、数据基本类型

三、变量与常量

 1. 常量:final

final  数据类型   常量名称 =  值

final double PI = 3.1415926

2. 成员变量

成员变量又分为 实例变量和静态变量

例子中 String str = "";//局部变量 为实例变量, 

static String strr = "nihao"; 为 静态变量, 变量前加 static 即为 静态变量,可跨类

还可以使用 类名.静态变量 来调用

四、运算符

1. 等号=

int a,b, c;

c = 0;// 从 最右边的 = 的右边 开始处理

a = b = c = 4;//  c4赋值给c, c赋值给b, b赋值给a//但不建议这样用

2.自增自减

自增自减,必须是整型或者 浮点型(c++没这个),加减1的意思

int a = 4;

int b = a++;// 运算结果,a=4 b=5

3.逻辑运算符: 表达式结果为 boolean类型,真或假

&& 、 &  都表示 逻辑与

例子: boolean p1 = false; boolean p2 = true;

p1& p2必须把p1 p2两边表达式都算完后,才能算出整个表达式的结果;没有短路的功能

p1&& p2有短路的功能, 此处 p1为false,则后面就不用看p2了,表达式结果为false

4.位运算符

& 按位与

| 按位或

~ 按位取反

^ 按位异或

<< 左移(    --->>箭头)

>>右移

>>> 无符号右移    无论最高位是0还是1,左侧被移空的高位填 0

注意:移位运算只限于 整型类型

5.三元运算

boolean a = 20 > 0 ? true : false;

6.运算符的优先级

自增自减  > 算术运算  > 比较运算  > 逻辑运算 > 赋值运算

7.类型转换

 强制类型转换 

 五、流程控制

if for while 等就不在记录了。本文中只简单记录一下重点知识。

switch中 case中常量名称必须不相同。

foreach的增强语法:就是  for( : );;;实际上 是没有foreach这个关键词的,我在初学时一直用foreach,然后编译器却说foreach未定义,就是因为没有这个关键词,还是用for弄出来的

        int arr2[] = {1,2,3,4,5};//初始化
		for(int i : arr2)
		{
			System.out.print("元素:" + i+  "\r\n");
		}
		

六、字符串

String s;//声明的字符串必须初始化之后才能用,否则编译器会报错

1.创建字符串

(1) String(char [])

        char a[] = {'g','o','o','d'};
		String newSt = new String(a);
		//上面等价于
		//String newSt = new String("good"); 跟上句一个意思
		
		String newSt2 = new String(a, 1,2);//输出 oo

(2)String(char[], 开始位置, 截取长度)

        char a[] = {'g','o','o','d'};
		String newSt = new String(a);
		//上面等价于
		//String newSt = new String("good"); 跟上句一个意思
		
		String newSt2 = new String(a, 1,2);//输出 oo

(3)直接字符串赋值

String str = "是我学习Java语言的最佳书籍";

2.连接字符串

使用 + 即可

3.字符串常用属性

String str = "是我学习Java语言的最佳书籍";

(1)长度 str.length()

(2)查找

str.indexOf()    返回的是首次出现的位置

str.LastIndexOf 返回的是最后一次出现的位置

(3)获取指定位置的字符

char ch = str.charAt(int nindex)

(4)截取字符串 substring

	    String str = "";
		char a[] = {'g','o','o','d'};
		String newSt = new String(a);
		//上面等价于
		//String newSt = new String("good"); 跟上句一个意思
		
		String newSt2 = new String(a, 1,2);//输出 oo
		String str1 = newSt.substring(1);// str1=ood 从第1个开始,直到字符串结束
		String str2 = newSt.substring(1,3);// str1=ood 从位置1个开始,到位置3个结束
		String str3 = newSt.trim();//去除字符串前后的空格
		

(5)字符串 替换replace

(6)判断字符串的开始与结尾

	    boolean b1 = newSt.startsWith("go");//以XX为开头
		boolean b2 = newSt.endsWith("od");//XX为结尾

(7)判断字符串是否相等

不能以==进行简单的判断,即使字符串内容相同,但其内存地址也不同。

equals()//比较字符串,区分大小写----》返回值为 boolean
equalsIgnoreCase()//比较字符串,不区分大小写---》返回值为 boolean

int b5 = str1.compareToIgnoreCase(str2);//比较字符串,不区分大小写 ---》返回值为 int
int b6 = str1.compareTo(str2);//比较字符串,区分大小写  ---》返回值为 int

        

boolean b3 = str1.equals(str2);//比较字符串,区分大小写
boolean b4 = str1.equalsIgnoreCase(str2);//比较字符串,不区分大小写
		
//按照字典顺序进行比较,只有当字符串一样时,才返回0, 其他有正值,有负值
int b5 = str1.compareToIgnoreCase(str2);//比较字符串,不区分大小写
int b6 = str1.compareTo(str2);//比较字符串,区分大小写

(8)字符串分割 split

        String strCondext = "alsdj-shfh,sdhg=skdh";
		strCondext.split("-|=|,");//分割符号为- = , 三个分隔符进行分割//多个分隔符用 |
		String strCondextIP = "192.168.100.144";
		String[] fisrtSplit = strCondextIP.split("\\.");//使用.进行分割//数组 [192] [168][100][144]
		String[] secondSplit = strCondextIP.split("\\.", 2);//使用.进行分割//数组 [192] [168.100.144]
		

(9)字符串格式化Format

(10)正则表达式

 

(11)字符串生成器StringBuilder---创建不定长的字符串

程序中如果不断的添加字符串,则建议使用StringBuilder

七、数组

1.定义

下标从0开始的

        int arr[] = new int[5];//分配内存//数组中元素初始值为0
		int arr1[] = new int[]{1,2,3,4,5};//初始化
		int arr2[] = {1,2,3,4,5};//初始化
		int av[] = new int[]{1,2,3,4,5};	
		
		for(int i : arr2)
		{
			System.out.print("元素:" + i+  "\r\n");
		}

        int arr22[][] = {{1,2,3},{4,5,6}};//二维数组的初始化

2.操作

java.util包含了Array类的所有操作

(1)数组填充fill

fill(数组, 值);//对数组a 整个赋值为5

        int arr2[] = {1,2,3,4,5};//初始化
		Arrays.fill(arr2, 99);
		for(int i : arr2)
		{
			System.out.print("元素:" + i+  "\r\n");
		}

(2)数组排序sort

Array类的其他方法请参考书籍《Java从入门到精通》

(3)数组查询

binarySearch(Object[], Object key)

binarySearch(Object[],int fromindex,int tolndex,Object key)

使用数组查询之前必须先对数组排序sort, 返回结果为排序后的数组元素所在的位置

八、类和对象

类:封装、继承、多态,与c++类似,不在赘述

Java类的默认访问权限是包级私有(package-private)。Java类的默认访问权限是包级私有,它限制了类的访问范围仅限于同一个包中的其他类。这种访问权限的设定有助于实现封装和模块化,提高代码的可维护性和安全性。

this关键字: this引用的就是本类的一个对象 this.name = name;

类的构造方法(c++叫构造函数):与类名相同,没有返回值,函数自动调用;若没有定义构造方法,程序会自动创建一个不带参数的构造方法。

 1.静态成员

2.不能将方法中的局部变量声明为static类型

 3.类的主方法

主方法是类的入口点,定义了程序从何处开始,控制整个程序的流程。

4.对象

(1)对象的创建:

(2)访问对象的属性和方法

对象.类成员

(3)对象的引用

 (4)对象的销毁

自动回收机制,不需要手动释放,但只能回收由 new 创建的对象。

finalize()来实现非new创建的对象。

5.类中默认权限为 包级私有

九、包装类

十、数字处理类

导入库: import java.text.DecimalFormat;

DecimalFormat类,是NumberFormat的一个子类,用于格式化十进制数字。

1.随机数:

Math.Random

还有java.util.Random类 

Random r=new Random();

 2.大数字运算

在Java 中提供了大数字的操作类,即java.math.BigInteger 类与java.math.BigDecimal类。这两个类用于高精度计算,其中 BigInteger 类是针对大整数的处理类,而 BigDecimal类则是针对大小数的处理类.

下面为核心技术

十一、接口、继承(extend)、多态 

//父类
	class Testsc{
		public Testsc()
		{
			System.out.print("父类构造" );
		}
		
		protected void DoSomthing()
		{
			;
		}
		protected Testsc DoIdlt()
		{
			return new Testsc();
		}
	}
	
	//子类
	class Testsc_sub extends Testsc{ //extends关键字为继承
		public Testsc_sub()
		{
			super();//调用父类构造方法
			super.DoSomthing();//调用父类的成员函数
			System.out.print("子类构造" );
		}
		
		protected void DoSomthing()//重写父类方法
		{
			;
		}
		public void DoSomthingNew()//新增函数
		{
			;
		}
		public Testsc_sub DoIdlt()//重写父类方法//子类重写时,权限只能升级,不能降级,不能由protected变为private
		{
			return new Testsc_sub();
		}
	}

调用构造方法的顺序,首先是顶级父类,然后是上一级父类最后是子类。也就是说,实例化子类对象时首先要实例化父类对象,然后再实例化子类对象,所以在子类构造方法访问父类的构造方法之前,父类已经完成实例化操作。

instanceof  向下转型时需要使用

不定长参数

private int Add(int···a);//int···a 实际上是一个数组

抽象与接口

abstract定义抽象类的关键字,只要类中有一个抽象方法,此类就被标记为抽象类。抽象类被继承后,要重写所有的抽象方法。类不能同时继承多个父类,只能有一个父类,由此出现了接口。

使用interface定义接口类,必须为public,没有定义时默认为public,接口类中没有方法体,接口类中可以实现多重继承。

十二、java的高级特性

用package创建包,包的名称要使用小写字母。

1. import导入包

(1)import导入包

import com.lzw.Math//指定com.lzw包中的Math类在程序中可以使用

如果想使用包中更多的类,可以 加 * 

import com.lzw.*//

(2).import导入静态成员变量

import static java.lang.System.out;

 具体代码如下:

package helloJava;
import java.util.*;
import static java.lang.System.out;
public class helloMain {

	public static void main(String[] args) {

		System.out.print("《Java入门到精通》!" + "\r\n" );
		out.print("nihao!你好");
		//System.out.print(secondSplit);
	
	}

}

2.final 常量

final double PI = 3.1415926;

    private final int value_1 = 15;//声明一个final常量
	private static final int value_2 = 1455;//声明一个final、 static 常量
	private final Testsc_sub test = new Testsc_sub();//声明一个final引用
	private Testsc_sub test2 = new Testsc_sub();//声明一个不是final引用
	private final int a = {1,2,3,4,5,6};//声明一个定义为final的数组

注意下面a1与a2的值

package helloJava;

import static java.lang.System.out;
import java.util.*;
public class helloMain {

	String str = "";
	int au = 0;
	private final int value_1 = 15;//声明一个final常量
	private static final int value_2 = 1455;//声明一个final、 static 常量
	private final Testsc_sub test = new Testsc_sub();//声明一个final引用
	private Testsc_sub test2 = new Testsc_sub();//声明一个不是final引用
	private final int avu[] = {1,2,3,4,5,6};//声明一个定义为final的数组

    //必须加static 否则会报错
	public static class FinalStaticData{
		private static Random randm = new Random();//实例化一个randm对象
		//随机产生一个0-10的值给final a1
		private final int a1 = randm.nextInt(10);非static
		//随机产生一个0-10的值给static final a2
		private static final int a2 = randm.nextInt(10);static
	}

	public static void main(String[] args) {

		java.lang.System.out.print("nihao!你好");
		FinalStaticData fData = new FinalStaticData();//实例化一个对象
		out.print("1重新实例化对象调用a1的值: " + fData.a1 + "\r\n");
		out.print("1重新实例化对象调用a2的值: " + fData.a2 + "\r\n");
		
		//实例化另外一个对象
		FinalStaticData fData2 = new FinalStaticData();//实例化一个对象
		out.print("2重新实例化对象调用a1的值: " + fData2.a1 + "\r\n");
		out.print("2重新实例化对象调用a2的值: " + fData2.a2 + "\r\n");
	
	}

}

输出:注意看无论实例化哪个对象,其a2的值都是一样的

nihao!你好1重新实例化对象调用a1的值: 5
1重新实例化对象调用a2的值: 1
2重新实例化对象调用a1的值: 6
2重新实例化对象调用a2的值: 1

3.定义为final的方法不能被重写P206

防止子类重写该方法,且执行效率比非final效率高。

如果父类某些方法设置为private,则子类无法访问该方法,所以一个被定义为private的方法被指定为final类型。所以,不需要对private的方法设置为final类型。

4.定义为final的类不能被继承

如果类定义为final类,则类中方法和成员变量隐式的变成了final类型。

5.局部内部类

局部类是指定义在类内部的类。

//定义一个接口
	 interface parentCalss{
		
		}
	 
	 public parentCalss doit(final String x){
		 class innerClass implements parentCalss{
			 innerClass(String s)//innerclass为局部内部类
			 {
				 s = x;
				 System.out.print(s);
			 }
		 }
		 
		 return new innerClass("doit") ;
		 
	 }

6匿名类

//定义一个接口
	 interface parentCalss{
		
		}
	 
	 
	 
	 class OuterClass4{
		 public parentCalss doit()
		 {
			 //匿名类,类没有名称
			 return new parentCalss() {
				 private int i = 0;
				 public int getValue()
				 {
					 return i;
				 }
			};
		 }
	 }
	 

常用 的匿名类的规范

//	 //匿名类的规范
	 return new A()	{
		 ....;//内部类体
			 }

7.静态内部类

内部类之前加static就变成了静态内部类,静态内部类在开发中比较少。

静态类的特点:

1.静态内部类中可加static定义静态成员,但不允许在非静态类内部类中定义静态成员。

2.静态内部类不可以使用外部类的非静态成员

例子:

8.内部类的继承

十三、异常处理

1.基础知识

try catch finally 捕获异常,常用格式如下:

try{}

catch(ExceptionType1 e1){}

catch(ExceptionType2 e2){}

finally{}

2.自定义异常

 

3.方法中抛出异常throw 

4.使用关键字throw抛出异常

java.lang.ArithmeticException是Java中的一个运行时异常类,它继承自java.lang.RuntimeException类。该异常表示在数学运算中发生了算术错误或不合法的操作。

 5.运行时异常

RuntimeException异常。 Throwable类派生了两个子类,分别为Exception 和 error类。

Error类描述java运行系统中的内部错误以及资源耗尽的错误

Exception为非致命性类,可以通过捕捉处理是程序继续执行。

Exception根据错误发生的原因分为RuntimeException异常 和除RuntimeException之外的异常。

十四、swing程序设计

AWT抽象窗口工具箱  swing在不同平台上显示风格统一   GUI图形用户界面

1.JFrame窗体

JFrame窗体是一个容器它是Swing程序中各个组件的载体。在开发应用程序时可以通过继承java.swing.JFrame类创建一个窗体

例子:

package helloframe;
import java.awt.*;//导入awt包
import javax.swing.*;//导入swing包


//修改此处,改为extends继承类
public class Example1_frame  extends JFrame{//定义一个类继承JFrame

	public void CreateJFrame(String strtile) {//定义一个方法
		JFrame jFrame = new JFrame(strtile);//实例化一个JFrame对象
		Container container = jFrame.getContentPane();//获取一个容器
		JLabel jLabel = new JLabel("这事一个JFrame窗体");//创建一个标签
		jLabel.setHorizontalAlignment(SwingConstants.CENTER);//居中
		jLabel.setForeground(Color.red);//设置字体颜色
		container.add(jLabel);//将标签添加到容器中
		container.setBackground(Color.black);//设置容器背景色
		jFrame.setVisible(true);//可见
		jFrame.setSize(400, 250);//窗体大小
		jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);	
		
	}

	//执行体
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		new Example1_frame().CreateJFrame("hello world");

	}

}

2.JDialog:

从一个窗体中弹出另一个窗体

package helloframe;
import java.awt.*;//导入awt包
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;//导入swing包
import javax.swing.text.Position.Bias;


//修改此处,改为extends继承类
public class Example1_frame  extends JFrame{//定义一个类继承JFrame

	class myDialog extends JDialog{
		public myDialog (Example1_frame frame) {
			super(frame, "第一个Jdialog窗体", true);
			Container container = getContentPane();
			container.add(new JLabel("这事一个对话框2"));
			setBounds(20, 20, 300,300);
		}
		
	}

	public Example1_frame() {
		JFrame jFrame = new JFrame("主窗体");//要想有窗体,必须有这个frame否则看不到窗体
		Container container = jFrame.getContentPane();
		container.setLayout(null);
		JLabel jLabel = new JLabel("这是一个就frame窗体");
		jLabel.setHorizontalAlignment(SwingConstants.CENTER);
		container.add(jLabel);
		JButton bl = new JButton("弹出对话框");
		bl.setBounds(20, 20, 150,150);
		//为鼠标添加单击响应
		bl.addActionListener(new ActionListener() {		
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				new myDialog(Example1_frame.this).setVisible(true);
			}
		});
		
		container.add(bl);
		jFrame.setVisible(true);
		jFrame.setSize(400, 400);
		jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);	
		
	}
	
//	public void CreateJFrame(String strtile) {//定义一个方法
//		JFrame jFrame = new JFrame(strtile);//实例化一个JFrame对象
//		Container container = jFrame.getContentPane();//获取一个容器
//		JLabel jLabel = new JLabel("这事一个JFrame窗体");//创建一个标签
//		jLabel.setHorizontalAlignment(SwingConstants.CENTER);//居中
//		jLabel.setForeground(Color.red);//设置字体颜色
//		container.add(jLabel);//将标签添加到容器中
//		container.setBackground(Color.black);//设置容器背景色
//		jFrame.setVisible(true);//可见
//		jFrame.setSize(400, 250);//窗体大小
//		jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);	
//		
//	}

	//执行体
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		//new Example1_frame().CreateJFrame("hello world");
		new Example1_frame();

	}

}

十五、I/O技术

I/O技术可将数据存储到文本文件、二进制文件、甚至压缩文件中。相应的函数在java.io包中。

InputStream  OutputStream  处理字节

Reader   Writer      处理字符

File 文件类,跨平台, 创建、删除、重命名

FileInputStream  FileOutputStream  字节,带中文的可能会乱码

FileReader  FileWriter 字符,带中文也可以

带缓存的输入、输出流

BufferedInputStream  BufferedOutputStream  字节,带中文的可能会乱码

BufferedReader  BufferedWriter 字符,带中文也可以

十七、多线程

线程所在包:import java.lang.*;

1.多线程实现方式

(1)继承Thread类

定义新类:

public class ThreadTest extends Thread{
		private int ncount = 100;
		public void run()
		{
			while((ncount > 0))
			{
				System.out.print("ncount = " + ncount + "\r\n");
				ncount--;
			}
		}
		
	}

调用的地方:

new ThreadTest().start();

(2)实现Runnable类

定义新类

public class ThreadRuna implements Runnable{
		private int num = 10;
		
		public void run() {
			while(true)
			{
				if(num > 0)
				{
					try {
						Thread.sleep(100);
					} catch (Exception e) {
						// TODO: handle exception
						e.printStackTrace();
					}
					System.out.print("ticks: " + num-- + "\r\n");
					
				}
			}
		}
	}

调用的地方:

ThreadRuna t = new ThreadRuna();
				Thread t1 = new Thread(t);
				Thread t2 = new Thread(t);
				Thread t3 = new Thread(t);
				Thread t4 = new Thread(t);
				t1.start();
				t2.start();
				t3.start();
				t4.start();

实现方式2中会出现num=1有多个的情况,或者出现num有负数的情况

ticks: 9
ticks: 10
ticks: 7
ticks: 8
ticks: 6
ticks: 4
ticks: 5
ticks: 6
ticks: 3
ticks: 2
ticks: 3
ticks: 3
ticks: 1
ticks: 1
ticks: 1
ticks: 1

2.多线程的同步---synchronized同步块---效果不行,为什么不行啊????????

上面实现方式2添加线程的同步,实现多个线程访问同一个资源时保证数据安全有效

public class ThreadRuna implements Runnable{
		 int num = 10;
		
		public void run() {
			while(true)
			{
				if(num > 0)
				{
					//添加同步块
					synchronized ("") {
						try {
							Thread.sleep(100);
						} catch (Exception e) {
							// TODO: handle exception
							e.printStackTrace();
						}
						System.out.print("ticks: " + num + "\r\n");
						num--;
					}				
					
				}
			}
		}
	}

结果还是有负数

ticks: 10
ticks: 9
ticks: 8
ticks: 7
ticks: 6
ticks: 5
ticks: 4
ticks: 3
ticks: 2
ticks: 1
ticks: 0
ticks: -1
ticks: -2

3.方法同步 synchronized void f()

十八、网络通信

图片来自于书籍:《来自于: 《Java从入门到精通》》 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值