今天正式开始学习JAVA,从b站的黑马程序员的基础视频开始。Java/安卓开发入门基础视频
主要学习了JAVA的发展历史和基本特点、基本的数据类型、运算符和程序结构。
JAVA的口号是Write once, run anywhere。即一次编译,到处运行。这个是JAVA跨平台性的体现,这个也是JAVA在发布后迅速发展的一个重要原因。JAVA实现这特点的方法是利用JVM虚拟机。在各个平台上安装JVM虚拟机,源代码在虚拟机上编译运行,这样就能让不同平台都能运行JAVA程序。然而只能说JAVA是跨平台的,JVM是不跨平台的,对于不同的平台有不同的JVM虚拟机与其对应。JVM虚拟机包含在JRE(Java Runtime Enviroment)中,倘若不需要进行JAVA程序的开发,仅仅是对JAVA程序的运行,只需要安装JRE,而JDK(Java Development Kit )则集成了JAVA开发的工具,包括javac.exe(java编译程序),java.exe(java 运行程序),jar.exe(java打包程序)等,这些工具存放在JDK的bin目录下。在进行环境变量的配置时要将javac.exe 和java.exe的路径存放Path中。
在学习JAVA之前,有学习过C语言,所以对于数据类型等具体的知识点不做详细描述。仅描述二者不同的地方。
对于二者的代码书写的风格上,主要在于大括号是否换行。这个问题分分钟引发程序员间的战争。但总体来说,JAVA约定俗成的是大括号跟在后面,不换行。而C语言则一半将大括号写在下一行。对于类,包,方法,变量的命名规则大体一致,但对于命名的规范主要是大家约定俗成的,并没强制的要求。比较流行的为驼峰命名,如GetName,getPoint等。
是在变量的赋值方面中,JAVA对于变量的赋值有常量优化机制,即自动判断常量是否在赋给的变量的范围内,在可能发生精度损失的时候编译不通过。特别的,由于这个机制,JAVA在给float型赋值时需在常量后面加f。将大于int型范围的数值赋给long型时要在常量后面加L。
float f = 1.23f;
long L = 8888888888888888L;
对此机制的相关例子如下
byte a = 200;
java在编译时会报错,可能损失精度。这是因为byte 长度是一个字节,只能存放-128~127的整型数据,在编译时便不能通过。而在C语言中,这样赋值不会再编译中出错。eg:
//在C语言中
short a = 32769
C语言中编译不会报错,但输出的是-32767。
JAVA的整型默认为int型,浮点型默认为double型。在两个整型常量中,倘若有一个常量的精度低于int型,会自动提升为int型,称为隐式转换,转化后的常量若在所赋给的变量的范围内,是没有问题的,但倘若是两个高精度的变量进行运算再赋给低精度的变量,会报错可能损失精度。因为编译器无法判断两个变量进行运算是否会超出所赋变量的范围。
byte a = 3;
int b = 4;
byte c = a + b;
这是无法编译通过的。一方面,byte型的a与int 型的b 相加,会自动提升为int型,相加的结果也为int型,但在编译时,a和b两个变量运算结果的大小无确定,因此不能赋给byte型的c。
总的来说JAVA在两个操作数进行运算时会将两个精度低于int的整型或低于double浮点型的操作数进行隐式转换,倘若结果是常量,且在所赋给的变量的范围内,则不会报错,若无法判断是否超出所赋给变量的取值范围或者确定已超出则会报错。
关于类型转换的练习代码如下
class Demo_Conversion {
public static void main(String[] args) {
byte b1=3;
byte b2=4;
//byte b3=b1+b2; //报错:可能会损失精度
/*
原因两方面:1、b1和b2相加是会自动提升为int型
2、由于b1和b2是变量,无法判断大小是否超出byte的范围,故可能损失精度
*/
byte b3 = 3 + 4; //在java中有常量优化机制,自动判断常量是否超出变量的范围,隐式转换
System.out.println(b3);
float f=12.3f;
long l=(long)f; //强制转换
System.out.println(l);
System.out.println("5 + 5 = " +5 + 5 );
System.out.println("5 + 5 = "+(5 + 5));//字符串+任何类型组成新的字符串
System.out.println('a'+1+"hello");//优先级从左到右
char c=97;
System.out.println(c);
//char c1=-98; //编译不通过,0--65535则可以
char c1=2,c2=3,c3=4,c4=5;
System.out.println(c1);
System.out.println(c2);
System.out.println(c3);
System.out.println(c4);
byte b4=1;
b4++;
//b4 = b4 + 1; //报错
System.out.println(b4);
}
}
其次是JAVA的输入与输出与C语言的不同。
java的输入需要引入包,创建键盘输入对象,而C语言只需在头不声明头文件即可
C语言:
#include <stdio.h>
void main()
{
int a;
printf("please enter a number:");
scanf("%d",&a);
printf("\nthe number is :%d",a);
}
JAVA
import java.util.Scanner; //引入包
class Demo_Scanner {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); //创建键盘录入对象
System.out.println("请输入一个整数");
int x = sc.nextInt(); //将键盘录入对象存储在x中
System.out.println(x);
}
}
JAVA的输出有println和print两个,用法大致相同,只不过println在输出是自动换行。但与C语言的输出有很大的不同。
System.out.println("5 + 5 = " +5 + 5 );//输出结果为5+5=55
System.out.println("5 + 5 = "+(5 + 5));//字符串+任何类型组成新的字符串,结果为5+5=10
System.out.println('a'+1+"hello");//优先级从左到右,结果为98hello
相关用法及ACS码的相关知识暂不做详细描述。
在运算符中,算数运算符+ - * / 位运算<< >> ^ ~ 及逻辑运算符& | !没有什么太大的不同。JAVA多了&& 和||,这两个是“短路逻辑运算”,&&在碰到false后不再执行后面的运算,||再碰到true后不再进行后面的运算。
另外值得注意的是两个技巧
- 通过^运算再不申请新的变量的情况下对两个变量的数值进行交换
- a<<k可以表示a乘以2的k次幂,a>>k可以表示a除以2的k次幂
class Demo_Operactor{
public static void main(String[] args) {
int a=3,b=4;
System.out.println(a++ == 4 && ++b == 5 ); //false
System.out.println(a); //4
System.out.println(b); //4 短路与&&遇到false不再执行右边
System.out.println(a++ == 4 || ++b == 5);
System.out.println(a);
System.out.println(b); //同理 短路或||遇到true不再执行右边
//位运算 ~ & | ^(相同为0不同为1)
//对一个数进行两次位异或运算还是其本身
System.out.println(6 ^ 10 ^ 10); //6
System.out.println(6 ^ 10 ^ 6); //10
//不用第三变量,交换两个变量的值
int x=5,y=10;
//方法一
x = x + y;
y = x - y;
x = x - y;
System.out.println(x); //10
System.out.println(y); //5
//方法二
x = x ^ y;
y = x ^ y;
x = x ^ y;
System.out.println(x); //5
System.out.println(y); //10
//<<左移即乘以2的几次幂 >>右移即除以2的几次幂
System.out.println(3 << 2); //12
System.out.println(3 >> 2); //0
}
}
最后是程序的顺序结构和选择结构,二者也没用太大的区别。在switch的使用中最应该注意的是break。switch只有在遇到break或者大括号时才停止,在编写程序时常常漏写break,会造成case穿透的现象。但有时这也是一个值得利用的地方,可以减少我们的代码量。
import java.util.Scanner;
class Demo_Switch {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个月份");
int x = sc.nextInt();
switch (x){ //switch的case穿透,只有遇到break或者大括号才结束
case 3:
case 4:
case 5:
System.out.println(x+"月是春季");
break;
case 6:
case 7:
case 8:
System.out.println(x+"月是夏季");
break;
case 9:
case 10:
case 11:
System.out.println(x+"月是秋季");
break;
case 12:
case 1:
case 2:
System.out.println(x+"月是冬季");
break;
default :
System.out.println("没有对应的季节");
}
int y = sc.nextInt();
switch (y){
default :
y++;
System.out.println(y);
case 1:
y++;
System.out.println(y);
break;
}
}
}