JAVA笔记(一)---语法

前言

要学MJ的数据结构,怎奈MJ大神是用JAVA写的,虽然之前自己学过JAVA,但也基本忘完了,学过,没有笔记,忘的干净。网上找了视频课,想学一遍,可并不想3、5年之后,脑子还是一片空白。
学了,不做笔记,还是什么都不会。
学了,做下记录,再翻看笔记,再复习时间就快了很多。
那么,开始学习吧!!!


第一节

绝对路径: 表示该路径是从某个磁盘的盘符下作为出发点的路径
相对路径: 表示该路径从当前所在的路径下作为出发点的路径

举个例子:
绝对路径:中国-北京-朝阳-XX小区-7号楼-1601
相对路径:隔壁邻居

Java的加载与执行

Java程序的运行,包括两个非常重要的阶段:

  • 编译阶段
  • 运行阶段
编译阶段:

主要任务是检查Java源程序是否符合Java语法
如何符合Java语法,则可以生成字节码文件(xxx.class)
若不符合Java语法,则无法生成字节码文件

字节码文件(.class)不是纯粹的01二进制码。因为,01二进制码可以直接与操作系统进行交互,然而,字节码.class文件是运行在JVM虚拟机上的。

源文件: 程序员写的代码,都是在.java文件里面,该文件被称为源文件

.java通过javac.exe命令进行java编译,然后生成.class字节码文件,字节码文件在虚拟机上运行。

一个.java源文件可以编译出多个.class文件

字节码文件.class,是最终要执行的文件,因此,编译生成.class文件后,就可以删除.class文件(不建议这么做)

.class字节码文件可以被拷贝到其他操作系统上进行运行,这就是Java的跨平台,可移植性

运行阶段:

运行阶段,有个重要的工具/命令 java.exe
假如有个类A.class,那么,执行java A,其过程大致是:

  1. java.exe命令会启动Java虚拟机JVM,JVM会启动类的加载器classLoader
  2. classLoader会去硬盘上搜索A.class文件,找到该文件,并将该字节码文件装载到JVM当中
  3. JVM将.class文件解析成二进制码
  4. 操作系统执行二进制码

JDK:软件开发包
JRE:runtime environment,运行时环境
JVM:虚拟机

JDK拥有JRE,JRE拥有JVM

让我们尝试写一个小例子:

新建一个HelloWorld.java文件

public class HelloWorld{
	public static void main(String[] args)
	{
		System.out.println("Hello World!!!");
	}
}

在当前目录下,使用编译命令:javac HelloWorld.java,可以生成一个HelloWorld.class字节码文件

使用运行命令:java HelloWorld得到了:
Hello World!!!

注意:java 后面跟的是类名,而不是路径名,也不需要带文件后缀名。

//public公开的
//class表示定义一个类
//HelleoWorld类名
public class HelloWorld{//表示定义一个公开的类,类名叫HelleoWorld

/**
	public 公开的
	static 静态的
	void 空
	main 方法名
	(String[] args) main方法的形式参数列表
*/
	public static void main(String[] args)//定义一个公开的,静态的,主方法。程序的入口
	{
		System.out.println("Hello World!!!");
	}
}
  • 一个Java源文件可以定义多个class

  • 一个Java源文件中public class不是必须的

  • Java源文件中定义的每一个class,都会对应生成一个.class文件

  • 使用public class name{},则该name必须与.java源文件name一致。
    换句话说
    一个.java源文件中定义public class(公开类)的话,public class 只能有一个,并且public class的类名必须和源文件名一样

例如:
在k.java中有以下代码:

public class H
{
	
}

编译:javac k.java
报错:
错误: 类H是公共的, 应在名为 H.java 的文件中声明
public class H
^
1 个错误

  • 每一个class当中,都可以编写main方法(程序的入口),并且执行main方法

java中都是方法,不叫函数

举个例子:
k.java 中有:

class A
{
	public static void main(String[] args){
		System.out.println("A");
	}
	
}

class B
{
	
	public static void main(String[] args){
		System.out.println("B");
	}
}

通过编译命令:javac k.java可以生成A.class B.class
通过运行命令:java A
运行结果:A

举个例子:
k.java 中有:

class B
{

}

通过编译命令:javac k.java可以生成B.class
通过运行命令:java B
运行结果:报错

错误: 在类 B 中找不到 main 方法, 请将 main 方法定义为:
public static void main(String[] args)

也就是说,在命令行窗口,class中必须有main方法。

注意,是命令行窗口,class必须有main方法


第二节

标识符包括:类名、方法名、变量名、接口名、常量名

标识符的命名规则:
一个合法的标识符,只能由 数字、字母、下划线、美元符组成。

  • 标示符不能以数字开头
  • 标示符不能是关键字

标识符的命名规范:
驼峰命名
类名、接口名:首字母大写,后面每个单词的首字母大写
变量名、方法名:首字母小写,后面每个单词的首字母大写

关于变量的分类:
局部变量:在方法体之内,不赋值会报错
成员变量:在方法体之外,类体之内,不赋值则默认为0

在不同的作用域内,变量名可以相同。
在相同的作用域内,变量名不可以重名。

public class k//类体
{
	static int a = 10;

	public static void main(String[] args){//方法体
		int a = 20;
		System.out.println(a);
	}

	/*
	System.out.println("OOO");

	k.java:4: 错误: 需要<标识符>
	System.out.println("OOO");
	                  ^
	k.java:4: 错误: 非法的类型开始
	System.out.println("OOO");
	                   ^
	2 个错误

	*/
}

数据类型

不同数据类型的数据,占用内存空间的大小不同。
数据类型的作用是:指导JVM给该数据类型的数据分配多大的内存空间

数据类型分为:

  • 基本数据类型
  • 引用数据类型:类、接口、数组、字符串

基本数据类型包括:四大类、八小种
四大类:
整型:byte、short、int、long
浮点型:float、double
布尔型:boolean
字符型:char

各个类型所占用字节大小:
byte1 short2 int4 long8
float4 double8
boolean1(true\false,默认false)
char2

数字是有正负之分,因此,在01二进制中,有一位专门来表示该数组为正还是负。
该位位于最左边,0代表正数,1代表负数

十进制二进制转换小技巧

问:97转换为二进制是多少?

2的0次方 2的1次方 2的2次方 2的3次方 2的4次方 2的5次方 2的6次方
1		2		4		8		16		32		64

97 = 64 + 32 + 1
因此,十进制97转换为二进制是1100001

7 = 4+2+1 = (二进制)111
17 = 16+1 = (二进制)10001
29 = 16+8+4+1 = 11101

(二进制)11111 = 1+2+4+8+16 = 31

在8种类型中,前7中计算机都好表示,因为数字在二进制与十进制之间可以有规律的转换。
而最后一种:char字符,跟0101之间不好转换。
因此,存在ASCII码,对应字符与0101之间的关系。

’a’ = 97
‘A’ = 65
‘0’ = 48


第三节

System.out.println 具有自动换行功能
System.out.print 没有自动换行功能
println:输出之后换行

十进制前不需要加特殊符,默认就是十进制 10 10
八进制0开头 010 转换为十进制是8
十六进制0x开头0x10 转换为10进制是16

public class k//类体
{
	static int a = 10;

	public static void main(String[] args){//方法体
		int a = 10;
		int b = 010;
		int c = 0x10;
		//默认输出十进制
		System.out.println(a+b+c);//16+8+10
	}
}

结果:34

计算机的二进制有三种表示形式:原码、反码、补码
计算机在任何时候的存储数据都是 补码

  • 在数字为正数的时候:
    原码 = 补码

  • 在数字为负数的时候:
    补码 = 负数的绝对值所对应的二进制码的所有二进制位取反+1

浮点型数据,默认被当做double类型
如果想做float处理,数字后面加上f/F

public class k//类体
{
	public static void main(String[] args){//方法体
		float b = 5.3;
		System.out.println(b);
	}
}

错误: 不兼容的类型:double转换到float可能会有损失
		float b = 5.3;
		          ^
1 个错误

解决方法:
float b = (float)5.3;
float b = 5.3f;或者float b = 5.3F;
基本数据类型之间的相互转换:转换规则
  1. 八种基本数据类型,除了布尔类型之外,其余七种类型之间都可以相互转换

  2. 小容量向大容量转换,称为自动类型转换,容量从大到小排序:
    byte < short(char) < int < long < float < double

    注:
    浮点型不管占用多少字节,都比整型容量大
    char和short可表示的种类数量相同,但是char可以取更大的正整数

  3. 大容量转小容量,称为强制类型转换,需要加强制类型转换程序才能编译过。但运行期间会损失精度,因此,谨慎使用

  4. 当整型字面值没有超过byte、short、char的取值范围,可以直接赋值给byte、short、char类型的变量。例如:byte a = 127;

  5. byte、short、char混合运算的时候,各自先转换成int类型再做运算

  6. 各种数据类型混合运算,先转换成容量最大的那种类型再做运算。


位运算符 异或^
不同为真,相同为假(类比男女,不要搞基- -)


第四节

int i = 10;
i += 10;等同于i = (int)(i + 10)
前面有一个强转操作

关于Java中的+号运算符:

  • 加法运算,求和
  • 字符串的连接运算符

数字 + 数字 加法运算
+号左右,有一个是字符串,则是字符串连接运算
字符串 + 任意类型 = 字符串 字符串连接运算

控制语句有三种:
选择结构: if if…else… switch
循环结构: for while do…while
控制循环语句: break continue

switch

switch和case后面只能是:int或者string

public class A
{
	public static void main(String[] args)
	{
		double a = 3.0;
		switch(a)
		{
			case 3.0:
				System.out.println("3");
				//break;
			case 4.0:
				System.out.println("4");
				break;
			case 10.0:
				System.out.println("10");
				break;
			default:
				break;
		}
	}
}

A.java:6: 错误: 不兼容的类型: 从double转换到int可能会有损失
switch(a)
^
1 个错误

byte、short、char可以写,因为小类型可以直接转换为大类型int

public class A
{
	public static void main(String[] args)
	{
		int a = 3;
		switch(a)
		{
			case 3:
				System.out.println("3");
				//break;
			case 4:
				System.out.println("4");
				break;
			case 10:
				System.out.println("10");
				break;
			default:
				break;
		}
	}
}

打印结果:
3
4

匹配到3,3没有break,则直接进入4执行,4有break,则程序结束;
如果4也没有break,则进入10执行。
也就是,匹配到3后,就开始找break。就不管是否匹配了。
该现象称为:case穿透现象。

九九乘法表
public class A
{
	public static void main(String[] args)
	{
		for (int i = 1; i<=9; i++) {
			for (int j = 1; j<=i ; j++) {
				System.out.print(j + "x" + i + "=" + i*j + " ");
			}
			System.out.println("");
		}
	}
}

结果:
1x1=1 
1x2=2 2x2=4 
1x3=3 2x3=6 3x3=9 
1x4=4 2x4=8 3x4=12 4x4=16 
1x5=5 2x5=10 3x5=15 4x5=20 5x5=25 
1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36 
1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49 
1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64 
1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81 
求出1-100所有的素数
什么是素数?

素数,又称为质数,指的只能被1和本身整除的数,例如:1,2,3,5,7…

public class A
{
	public static void main(String[] args)
	{
		for (int i = 1; i<=100; i++) {
			boolean isSuShu = true;
			for (int j = 2; j<i; j++) {
				if (i%j == 0) {
					isSuShu = false;
					break;
				}
			}
			if (isSuShu) {
				System.out.print(i + " ");
			}
		}
	}
}

结果:
1 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 

升级版:
1-10000的素数,要求每8个换一行输出

......
if (isSuShu) 
{
	System.out.print(i + " ");
	k++;
	if (k>=8) {
		k = 0;
		System.out.println();	
	}	
}
break中断

break使用在switch中,用来终止switch的语句执行
break使用在for while do…while…循环语句中,用来终止循环的执行。

break只会中断最近的循环(而不是每一个循环)

给for循环取别名的用法:

class D
{
	public static void main(String[] args)
	{
		//给for循环起名for1
		for1:for (int i = 1; i<=10; i++) {
			//给for循环起名for2
			for2:for (int j = 1; j<10; j++) {
				System.out.println(j + "----");
				if (j == 5) {
					break for1;//此时,break作用在最外面的for循环
				}
			}
		}
	}
}

continue,跳出本次循环,执行下一次循环

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值