初学Java的一些问题
1 关于jdk jre jvm的关系
jdk>jre>jvm
jdk即Java Development Kit是java语言的软件开发工具包,它是给开发者使用的,其中包含了jre与jvm
jre即Java Runtime Environment是java运行环境,可以让计算机运行java程序
jvm即Java Virtual Machine即java虚拟机
2 标识符与基础数据类型
标识符的命名:
只能由字母数字下划线和$组成,以字母开头
采用驼峰命名法,例如studentName 即首单词小写,其余单词首字母大写
尽量做到言简意赅,见名知意
基础数据类型有:
int (4Byte)默认值0;
byte (1Byte)默认值0;
short (2Byte)默认值0;
char (2Byte,与c不同是为了方便存中文)默认值null;
float (4Byte)默认值0.0;
long (8Byte)默认值0;
double (8Byte)默认值0.0;
boolean (1bit)默认值false;
3 关于包
- 打包和编译运行
package tax;
import java.util.Scanner;
public class Test {
public static void main(String[] args)
{
Scanner s = new Scanner(System.in);
System.out.println("继续输入纳税人请输入1");
while(s.nextInt()==1) {
Person p = new Person();
System.out.println("请输入纳税人类型:");
int index = s.nextInt();
p.setStatus(index);
System.out.println("请输入收入:");
double in = s.nextDouble();
p.setIncome(in);
System.out.println("纳税人需要缴纳的税额为" + p.money() + "¥");
System.out.println("继续输入纳税人请输入1");
}
}
}
例如这个类,将其打包到tax
同处于这一个包下的还有Person.java
package tax;
public class Person
{
private int status;
private double income;
private double tax; //Person类的成员属性
public double money() {
} //该方法返回taxer的税额
public void setStatus(int s){
status = s;
}
public void setIncome(double in){
income = in;
}
public void setTax(double t){
tax = t;
}//通过一些public方法可以更改对象属性,或者获得成员属性
}
// 其中方法过长将其省略了
/*
D:\EditPlus\tax>javac Test.java
Test.java:11: 错误: 找不到符号
Person p = new Person();
^
符号: 类 Person
位置: 类 Test
Test.java:11: 错误: 找不到符号
Person p = new Person();
^
符号: 类 Person
位置: 类 Test
2 个错误
*/
报错找不到符号 原因是没有Person.class文件
/*
D:\EditPlus\tax>javac *.java //正常编译
D:\EditPlus\tax>java Test
错误: 找不到或无法加载主类 Test //运行报错
*/
//对于包中的文件我们采用返回上一级的状态下 java 包名.文件名来运行
例如:
D:\EditPlus>java tax.Test
继续输入纳税人请输入1
//这样可以正常运行
4 Java文件的编译与运行
-
基础dos命令
dir:显示当前目录下的文件 mkdir xxx:创建名称为xxx的文件夹 ↑/↓:查看上/下一条命令 盘符:如c: d:切换到指定硬盘 cd:进入文件夹 del xxx:删除指定文件 ctrl+c 退出操作 javac xxx.java:编译java文件生成相应.class文件 java xxx:运行文件
5 一些测试
- 类名
class Main
{
public static void main()
{
System.out.println(hello world!);
}
}
/*
文件名为noName.java
类名叫做Main
编译javac noName.java 编译能通过,随之生成了Main.class文件
随后java noName 报以下错误:
错误: 找不到或无法加载主类 noName
只有java Main能够正常运行
*/
结论:在写java程序的时候,我们应该把类名首字母大写,并且和文件名相同
-
关于main方法
class Main { public static void main(String[]) { System.out.println("Hello World!"); } } 删掉参数名args报错 /* Main.java:3: 错误: 需要<标识符> public static void main(String[]) ^ 1 个错误 */ //但是参数名可以叫别的,只要标识符命名合法就行 class Main { public static void (String[] args) { System.out.println("Hello World!"); } } 删掉main同样报错 /* Main.java:3: 错误: 需要<标识符> public static void (String[] args) ^ 1 个错误 */ class Main { public static main (String[] args) { System.out.println("Hello World!"); } } 删掉void报错 /* Main.java:3: 错误: 方法声明无效; 需要返回类型 public static main (String[] args) ^ 1 个错误 */ class Main { public void main (String[] args) { System.out.println("Hello World!"); } } 删掉static报错 /* 错误: main 方法不是类 Main 中的static, 请将 main 方法定义为: public static void main(String[] args) */ class Main { static void main (String[] args) { System.out.println("Hello World!"); } } 删掉public报错 /* 错误: 在类 Main 中找不到 main 方法, 请将 main 方法定义为: public static void main(String[] args) 否则 JavaFX 应用程序类必须扩展javafx.application.Application */ 结论:关于main方法定义,除了参数名可以改变,其他的格式都不能改变(psvm)
6 关于成员属性默认值
import java.util.Scanner;
public class Test03
{
static int life;
public static void main(String[] args)
{
System.out.println("life默认值"+life);
Scanner scan = new Scanner(System.in);
life = scan.nextInt();
System.out.println("更改后"+life);
}
}
/*
D:\EditPlus\Test>java Test03
life默认值0
1 //输入1
更改后1
*/
对于下一次重新运行static 变量还会恢复默认值
import java.util.Scanner;
public class Test03
{
static int life;
public static void main(String[] args)
{
System.out.println("life当前值"+life);
Scanner scan = new Scanner(System.in);
}
}
/*
life当前值0
*/
结论:
1.基础数据类型的默认值:
int long short byte:0
float double :0.0
char:null
boolean:false
2.静态变量的值会初始化,未附值为默认值,附值则为该值
7 关于附值
public class Test00
{
public static void main(String[] args)
{
byte num = 200 ;
System.out.println(num);
}
}
/*
D:\EditPlus\Every>javac Test00.java
Test00.java:5: 错误: 不兼容的类型: 从int转换到byte可能会有损失
byte num = 200 ;
^
1 个错误
*/
这让我们不禁思考,1.等号右边是不是会把我们的数字默认为int让后附值给左边呢?
2.赋值语句是不是先执行右边吗?
public class Test00
{
public static void main(String[] args)
{
byte num = 12 ;
num = num + 1;
System.out.println(num);
}
}
/*
D:\EditPlus\Every>javac Test00.java
Test00.java:6: 错误: 不兼容的类型: 从int转换到byte可能会有损失
num = num + 1;
^
1 个错误
*/
这更证明了我们的猜测
结论:
1. 赋值语句会先执行等号右边,再将其赋值给左边。
2.右边数字会被默认为int类型,当把大的数据类型附值给小的类型时,编译器会报错需要强转
小转大则不会。
8 case穿透
public class Test00
{
public static void main(String[] args)
{
int num = 1;
switch(num)
{
case 1:System.out.println(num);
case 2:System.out.println(num);
case 3:System.out.println(num);
case 4:System.out.println(num);break;
case 5:System.out.println(num);break;
default:break;
}
}
}
/*
D:\EditPlus\Every>java Test00
1
1
1
1
*/
结论:
case后边如果不加break,从对应的那一项开始会以此往后执行,直到遇到break
这种现象叫做case穿透