编译阶段主要是看java源程序是否符合java语法;符合java语法则能够生成正常的字节码文件(XXX.class),不符合语法的则无法生成字节码文件
一个java源文件可以编译生成多个.class文件
java.exe命令会启动Java虚拟机(JVM)
JVM会启动类加载器ClassLoader
ClassLoader会去硬盘上搜索HelloWorld.class文件,找到该文件则将该字节码文件装载到JVM中执行
找不到则报错
文件名 helloWorld.java
public class helloWorld
{
public static void main(String[] args)
{
System.out.println("Hello World!");
}
}
运行过程:
单行注释:
使用//只注释当前行
多行注释:
javadoc注释
该注释信息会被javadoc.exe工具解析提取并生成帮助文档
1.5 public class 和 class的区别:
- 一个java源文件当中可以定义多个class一个java源文件当中public的class不是必须的一个class会定义生成一个XX.class字节码文件一个java源文件当中定义公开的类的话,只能有一个,并且该类名称必须和java源文件名称一致每一个class当中都可以编写main方法,都可以设定程序的入口,想执行B.class中的main方法就写上java B,注意,当在命令窗口中执行java Hello,那么要求Hello.class当中必须有主方法。没有主方法会出现运行阶段的错误:
错误: 在类 X 中找不到 main 方法, 请将 main 方法定义为:
public static void main(String[] args)
否则 JavaFX 应用程序类必须扩展javafx.application.Application
public class TestLogin
{
public static void main(String[] args)
{
System.out.println("Hello World!");
}
}
2.2 关键字,这个太多了,就不说了
2.3 字面值
public class TestLogin
{
public static void main(String[] args)
{
System.out.println("Hello World!");
System.out.println('A');
}
}
2.4 变量
public class TestLogin
{
static int k = 90; //成员变量
public static void main(String[] args)
{
//声明一个int类型变量,起名i
int i; //局部变量
i = 100;
System.out.println(i);
int a = 1,b = 2,c = 3;
System.out.println(a);
System.out.println(b);
System.out.println(c);
for(int d=0,d<10;d++){//d变量的作用域是for循环,for循环结束之后,内存就释放了
}
//这里无法访问d变量
System.out.println(d);
int j; //作用域是main方法
for(j=0;j<10;j++){
}
System.out.println(j); //访问的是main方法中的j变量
}
public static void doSome(){
//这里无法访问main方法中的变量i
//System.out.println(i);
System.out.println(k);
}
}
2.5 数据类型
public class DateTypeTest04
{
public static void main(String[] args)
{
char y = 't';
System.out.println(y);
char k = '\'; //在java中两个反斜杠表示的是一个反斜杠字符
System.out.println(k);
//在控制台输出一个单引号字符
char a = ''';
System.out.println(a);
//JDK中自带的native2ascii.exe命令,可以将中文转换成unicode编码形式
char b = '中';
System.out.println(b);
//输出的结果是中
char c = 'u4e2d';
System.out.println(c);
}
}
public class DateTypeTest04
{
public static void main(String[] args)
{
int a = 10;
int b = 010;
int c = 0x10;
System.out.println(a); //10
System.out.println(b); //8
System.out.println(c); //16
//456整数型字面值被当作int类型,占用4个字节
//X变量在声明的时候是long类型,占用8个字节
//int类型的字面值456赋值给long类型的变量X,存在类型转换
//int类型转换成long类型
//int类型是小容量
//long类型是大容量
//小容量可以自动转换成大容量,称之为自动类型转换机制
long x = 456;
System.out.println(x);
//2147483647字面值是int类型,占用4个字节
//y是long类型,占用8个字节,自动类型转换
long y = 2147483647;
System.out.println(y);
//编译错误:过大整数
//long z = 2147483648;
//System.out.println(z);
//解决错误
//2147483648字面值一上来就当作long类型来处理,在字面值后面添加L
//2147483648L是8个字节的long类型
//z是long类型变量,以下程序不存在类型转换
long z = 2147483648L;
System.out.println(z);
//100L是long类型字面值
//d是long类型变量
//不存在类型转换,直接赋值
long d = 100L;
//d变量是long类型,8个字节
//e变量是int类型,4个字节
//以下程序编译报错,大容量不能直接赋值给小容量
int e = d
//大容量转成小容量,需要进行强制类型转换,强制类型转换需要加“强制类型转换符”;加上强制类型转换符之后编译通过了,但是运行阶段可能损失精度
//强转原理:将左边的二进制砍掉
long k = 214783648L;
int e = (int)k;
System.out.println(e);//损失精度非常严重
//
//没有超出byte类型取值范围的话,该字面值可以直接赋值给byte类型的变量
byte b = 50;
}
}
public class DateTypeTest05
{
public static void main(String[] args)
{
//3.0是double类型字面值
//d是double类型变量
//不存在类型转换
double d = 3.0;
System.out.println(d);
//5.1是double类型字面值
//f是float类型的变量
//大容量转换成小容量需要加强制类型转换符,所以以下程序编译错误
//float f = 5.1;
//解决方案:
//第一种方式:强制类型转换
float g = (float)5.1;
//第二种方式:没有类型转换
float f = 5.1f;
}
}
public class DateTypeTest06
{
public static void main(String[] args)
{
//
//编译错误:不兼容的类型
//boolen flag = 1;
boolean loginSuccess = true;
if(loginSuccess){
System.out.println("登陆成功!");
}else{
System.out.println("登录错误!");
}
System.out.println("Hello World!");
}
}
public class DateTypeTest07
{
public static void main(String[] args)
{
//出现错误,1000超出了byte的范围
byte a = 1000;
//正确,因为20没有超出byte范围
byte a = 20;
//变量不能重名
//short a = 1000;
//正确,因为1000 没有超出int范围,所以赋值正确
short b = 1000;
//正确,因为默认是int,并且没有超出范围
int c = 1000;
//正确,可以自动转换
long d = c;
//错误,出现精度丢失问题,大类型转换小类型会出问题
//int e = d;
//将long类型强制转换成int型
//因为值1000,没有超出int范围,所以转换正确
int e = (int)d;
//因为java中的运算会转换成最大类型
//10和3 都是int,所以运算后的最大类型也是int,所以是正确的
int f = 10/3; //3
//声明10为long类型
long g = 10;
//出现错误,多个数值在运算过程中,会转换成容量最大的类型
//以下示例最大的类型为double,而h为int,所以就会出现大类型long到小类型int的转换,将会出现精度丢失
//int h = g/3;
//可以强制转换,因为没有超出int范围
int h = (int)g/3;
//可以采用long类型来接受结果
long h = g/3;
//将g转换成int,然后再转换成byte,最后byte类型和3运算,那么他的运算结果就是int,所以int赋值给byte就出现了精度损失问题
//byte h = (byte)(int)g/3;
//正确
byte h = (byte)(int)(g/3);
//可以转换,因为运算结果没有超出byte范围
byte h = (byte)(g/3);
//可以转换,因为没有超出short范围
short h = (short)(g/3);
short i = 10;
byte j = 5;
//错误,short和byte运算,首先会转换成int再运算,所以运算结果为int,int赋值给short就会出现精度丢失问题
//short k = i+j;
char l = 'a';
System.out.println(l);
System.out.println((byte)l);//输出结果是97,a的ascii值
int m = l+100;
System.out.println(m)//输出结果是197,取得a的ascii值,然后与100进行相加运算
double dd = 10 / 3;
System.out.println(dd);//3.0
dd = 10.0 / 3;
System.out.println(dd); //3.333333333333
}
}
2.6运算符
1、算数运算符:
求和
相减
乘积
/ 商
% 取余
++ 自加1
– 自减1
注意:一个表达式中有多个运算符,运算符有优先级,不确定加小括号
2、关系运算符
大于
= 大于等于
< 小于
<= 小于等于
== 等于
!= 不等于
3、逻辑运算符
& 逻辑与
| 逻辑或
! 逻辑非
^ 逻辑异或 两边的算子只要不一样,结果就是true
&& 短路与
|| 短路或
短路与和逻辑与最终的运算结果是相同的,只不过短路与存在短路现象
短路或和逻辑或最终的运算结果是相同的,只不过短路或存在短路现象
什么情况下出现短路现象呢?
什么时候选择使用逻辑与运算符,什么时候选择使用短路与运算符?
public class DateTypeTest08
{
public static void main(String[] args)
{
int i = 10;
int j = 3;
System.out.println(i+j);//13
System.out.println(i-j);//7
System.out.println(i*j);//30
System.out.println(i/j);//3
System.out.println(i%j);//1
int k = 10;
int c = k++;
int d = ++k;
System.out.println(k);//12
System.out.println(c);//10
System.out.println(d);//12
int xx = 500;
System.out.println(xx);//500
System.out.println(xx ++);//500
System.out.println(xx);//501
System.out.println("--------------------------------------------------");
int a = 10;
int b = 10;
System.out.println(a>b);//false
System.out.println(a>=b);//ture
System.out.println(a3&5>2);//true
System.out.println(5>3&5>6);//false
System.out.println(5>3|5>2);//true
//逻辑与和短路与
int m = 10;
int n = 8;
//逻辑与
//System.out.println(mn结果是false,所以后面的表达式没有再执行,这种现象被称为短路现象
System.out.println(m);//10
System.out.println("--------------------------------------------------");
}
}
、JAVA中的对象和类
对象:对象是类的一个实例,有状态和行为
类:类是一个模板,它描述一类对象的行为和状态



