以下是作者自学Java的一些个人笔记,笔记部分由作者理解后整理(作者小白,若有理解不够到位的地方,欢迎友好讨论~),后续会考虑补全笔记,希望可以帮助到你,共勉!
Java 基础语法知识点
大小写敏感
类名:首字母大写
方法名:小写字母开头。若由多个单词组成,后面的单词首字母大写
源文件名:源文件名必须和类名相同
主方法入口:所有都是从public static void main(string[] args)方法开始执行
Java 标识符
Java 所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符。
关于 Java 标识符,有以下几点需要注意:
-
所有的标识符都应该以字母(A-Z 或者 a-z),美元符($)、或者下划线(_)开始
-
首字符之后可以是字母(A-Z 或者 a-z),美元符($)、下划线(_)或数字的任何字符组合
-
关键字不能用作标识符
-
标识符是大小写敏感的
-
合法标识符举例:age、$salary、_value、__1_value
-
非法标识符举例:123abc、-salary
Java 修饰符
像其他语言一样,Java可以使用修饰符来修饰类中方法和属性。主要有两类修饰符:
-
访问控制修饰符 : default, public , protected, private
-
非访问控制修饰符 : final, abstract, static, synchronized
Java 关键字
常见的有public、class、static、void,后续再继续学习记录
Java 字面量
整数型:10、-5等
浮点型:3.14、-0.5等
布尔型:true、false
字符型:'d' 'a'等
字符串型:“Hello”、“world”、“你好”等
Java + 运算符
主要作用:求和、字符串拼接
求和:两边都是数字
字符串拼接:只要有一边是字符串
Java 变量
三要素:变量名、变量值、数据类型
int a,b,c = 300;//此处只给c赋值了300,其他a和b没有赋值
Java 作用域
变量的有效范围,在java当中通常是一个{}对应一个作用域
Java 变量分类
1.凡是在方法体当中定义的变量,一定是局部变量
局部变量只在当前方法中有效
2.在类体当中定义的变量叫做成员变量
成员变量当中,带static的是静态变量,不带static的是实例变量
进制转换(十进制、二进制、八进制、十六进制)
十进制 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
八进制 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 20
十进制转换成八进制:
除8取余,一直到商0为止,最后将所有的余数逆序输出
八进制转换成十进制:
每一个与权值相乘,最后求和
其余的进制转换方法大致相似,后续再进行补充
原码反码补码
0表正数,1表示负数
字节和比特
1 Byte = 8 bit
每个比特(bit)是计算机最小的存储单位,只能存储0或1两个状态
1 kb = 1024 Byte,依次类推
计算机底层采用补码的形式存储,但显示给人类的时候是以原码的形式显示
正数的原码反码补码都是相同的
负数的原码运算规则:将绝对值转换为二进制后,最高位改1
反码:以原码为参考,符号位不变,其他位取反
补码:以反码为参考,符号位不变,加1
数据类型
整数型 | 说明 | 字节 |
byte | 小整数 | 1 |
short | 中等大小整数 | 2 |
int | Java最常用的整数 | 4 |
long | 极大或极小的整数 | 8 |
浮点型 | 说明 | 字节 |
float | 单精度,精度为7位小数 | 4 |
double | 双精度,精度为15位小数,Java最常用的浮点类型 | 8 |
布尔型:boolean | 逻辑判断 | 1 |
字符型:char | 单个字符,’a‘等 | 2 |
整数型
java允许小容量的数据直接赋值给大容量的变量
如果在整数型字面量后面添加L,会将这个整数型字面量当作long类型来处理
例如:int a = 28234923432 这个数太大了,int 分配4个字节放不下(会报错),所以要在后面加个L
变成long a = 28234923432L 这样就没问题了
强制类型转换,编译时可能会损失精度,也可能不会损失
long x = 1000L
int y =(int)x
当一个整数型字面量没有超出byte的取值范围(-128~127)时,可以直接赋值给byte下的变量
short取值范围:-32768~32767
多种数据类型混合运算,先各自转换成容量最大的,再做运算
byte < short < int < long < float < double
浮点型
float:单精度,可以精确到7位小数
double:双精度,可以精确到15位小数
double是常用的
浮点型数据两种表示形式
1.十进制
double x = 1.23
double y = 0.23
2.科学计数法
double x = 0.123E2 // 0.123*10 的二次方
double y = 123.34E-2 // 123.34/10 的二次方
浮点型数据参与运算的结果,一定不要使用”==“与其他数字进行相等比较
主要原因:任何浮点型数据,在计算机底层存储的都是近似值
字符型
char 类型占用2个字节
char类型的字面量必须使用单引号括起来:'A' 'a' '中'
采用统一的字符编码方式:Unicode编码
char 的默认值是:\u0000
转义字符:
\t |
制表符,相当于按下Tab键 |
\n | 换行符 |
\" | 双引号 |
\' | 单引号 |
\ \ | 反斜线本身 |
char参与的运算:
有一个运算规则需要记住:
byte short char 混合运算的时候,各自先转换成int再做运算
比如 ‘a' + 1 直接输出得到98
但是 如果 先是 char c = ’a‘ + 1 然后输出c 那就是得到b
再比如,
byte b = 1;
short s = 1;
char c = 1;
要将上面的相加起来,只能 int num = b + s + c 或者强制转换 short num = (short)(b + s + c)
布尔型
boolean 只有true和false,没有0和1的说法,用于条件判断等语句
Java String类
在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串
1.创建字符串最简单的方式如下:
String str = "Runoob";
2.用构造函数创建字符串:
String str2=new String("Runoob");
3.字符串长度表示:int len = str.length();
4.连接字符串可以使用+来进行, 比如,“你好” + “欢迎你”;
运算符
算术运算符
操作符 | 说明 |
+ | 加法 |
- | 减法 |
* | 乘法 |
/ | 整除 |
% | 取模(求余数) |
++ | 自增加1 |
-- | 自减减1 |
++出现在变量之后,先赋值再加1
++出现在变量之前,先加1再赋值
关系运算符
> >= < <= == !=
所有的关系运算符结果一定是布尔类型:true/false
= 赋值运算符
== 可以比较两个值是否相等
逻辑运算符
操作符 | 描述 | 例子 |
---|---|---|
& | 如果相对应位都是1,则结果为1,否则为0 | (A&B),得到12,即0000 1100 |
| | 如果相对应位都是 0,则结果为 0,否则为 1 | (A | B)得到61,即 0011 1101 |
^ | 如果相对应位值相同,则结果为0,否则为1 | (A ^ B)得到49,即 0011 0001 |
〜 | 按位取反运算符翻转操作数的每一位,即0变成1,1变成0。 | (〜A)得到-61,即1100 0011 |
<< | 按位左移运算符。左操作数按位左移右操作数指定的位数。 | A << 2得到240,即 1111 0000 |
>> | 按位右移运算符。左操作数按位右移右操作数指定的位数。 | A >> 2得到15即 1111 |
>>> | 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 | A>>>2得到15即0000 1111 |
条件运算符(?:)
variable x = (expression) ? value if true : value if false
public class Test {
public static void main(String[] args){
int a , b;
a = 10;
// 如果 a 等于 1 成立,则设置 b 为 20,否则为 30
b = (a == 1) ? 20 : 30;
System.out.println( "Value of b is : " + b );
// 如果 a 等于 10 成立,则设置 b 为 20,否则为 30
b = (a == 10) ? 20 : 30;
System.out.println( "Value of b is : " + b );
}
}
Java 条件语句
布尔表达式结果为true则执行,为false则不执行
//第一种语法:
if(布尔表达式)
{
//如果布尔表达式为true将执行的语句
}
//第二种语法:
if(布尔表达式){
}else{
}
//第三种语法:
if(布尔表达式 1){
else if(布尔表达式 2){
} }
Java 分支语句
switch case 语句语法格式如下:
switch(expression){
case value :
//语句
break; //可选
case value :
//语句
break; //可选
//你可以有任意数量的case语句
default : //可选
//语句
}
一般是这样的 会在switch语句外进行变量声明和赋值 expression就是变量
case 后面跟着的可以是对应等级或者1 2 3 4 反正就是你根据变量值的情况进行一个判断
break 出现后 如果变量与value相等 则停止往下执行代码
default 就是 如果以上都没有对应的情况出现的默认内容(可选,自定义)
举个例子,
public class Test {
public static void main(String args[]){
//char grade = args[0].charAt(0);
char grade = 'C';
switch(grade)
{
case 'A' :
System.out.println("优秀");
break;
case 'B' :
case 'C' :
System.out.println("良好");
break;
case 'D' :
System.out.println("及格");
break;
case 'F' :
System.out.println("你需要再努力努力");
break;
default :
System.out.println("未知等级");
}
System.out.println("你的等级是 " + grade);
}
}
运行的结果就是,
良好 你的等级是 C
Java 循环语句
while循环:
只要布尔表达式为 true,循环就会一直执行下去
while( 布尔表达式 ) {
//循环内容
}
do…while 循环:
do…while 循环和 while 循环相似,不同的是,do…while 循环至少会执行一次
do {
//代码语句
}while(布尔表达式);
for循环:
for(初始化; 布尔表达式; 更新) {
//代码语句
}
Java 增强 for 循环
for(声明语句 : 表达式)
{
//代码句子
}
声明语句:声明新的局部变量,必须跟数组元素的类型匹配
表达式:要访问的数组名
直接上例子,更有利于理解
public class Test {
public static void main(String[] args){
int [] numbers = {10, 20, 30, 40, 50};
for(int x : numbers ){
System.out.print( x );
System.out.print(",");
}
System.out.print("\n");
String [] names ={"James", "Larry", "Tom", "Lacy"};
for( String name : names ) {
System.out.print( name );
System.out.print(",");
}
}
}
IDEA快捷键
idea会自动保存,自动编译,不需要其他操作
生成main方法:psvm (直接缩写输入,idea会帮忙补全的)
快速生成输出语句:在“......”(你想输出的内容)后面加上 .sout 比如 “你好”.sout
运行结果:ctrl + shift + F10
for循环:直接 fori idea会帮忙补全
复制一行:ctrl + d
打开运行结果:alt + 4
新建/新增任何东西:alt + insert
退出任何窗口:ESC
编写源码的窗口最大化:ctrl + shift + F12
打开project窗口:alt + 1
查找某个类:敲两下shift,选择classes,输入类名
切换选项卡:alt + 左右方向键
自动生成变量:在一个值的后面输入 .var ,比如 10.var
删除一行:ctrl + y
在一个类中查找方法:ctrl + F12
Java 方法
方法定义
1.方法本质上就是一段可以被重复利用的代码片段 每个方法都是一个独立的封装好的功能
2.方法要执行的话,必须要去调用它,比如:
public class Test01 {
public static void main(String[] args){
sum(100,200) //调用方法
}
//定义方法
public static void sum(int a,int b){
int c = a + b;
System.out.println(a + "+" + b + "=" + c);
}
}
3.语法格式:[修饰符列表] 返回值类型 方法名 (形参列表){ 方法体; }
目前,修饰符列表这一块,统一编写public static,具体原因后面学习补充
返回值类型:可以是java语言中任何一种数据类型,包括基本数据类型和引用数据类型,就是byte int那些
如果方法执行结束的时候没有返回任何数据给调用者,返回类型写:void
返回类型是int,方法结束就返回一个整数给调用者
返回类型是String,方法结束就返回一个字符串给调用者
返回类型是void,方法结束就不会返回任何数据给调用者
4.当返回值类型不是void的时候,方法在结束的时候必须使用“return 值”;语句来完成数据的返回
如果是void,可以使用“return;”来结束语句,也可以不使用,绝对不可以返回一个值
5.return语句有两种写法:
第一种:return 值;
第二种:return;
不管是哪一种,只要return语句执行,方法必然结束
6.当调用一个返回值类型不是void的方法时,方法结束时会返回值,可以采用变量接收,但是类型要一致
7.方法名:一般都是首字母小写,后面的单词首字母大写
方法调用
格式:类名.方法名()
调用者 和 被调用者 在同一类的情况下,可以省略 类名.
但是在不同类的情况下,必须遵循这个格式
以下是一个登录界面,可以更好帮助理解方法的定义与调用
import java.util.Scanner;
public class Test01 {
public static void main(String[] args){
login();
}
public static void login(){
Scanner scanner = new Scanner(System.in);
System.out.println("用户名:");
String username = scanner.next();
System.out.println("密码:");
String password = scanner.next();
boolean isOk = check(username,password);
if (isOk){
System.out.println("登录成功");
}
else{
System.out.println("登陆失败");
}
}
public static boolean check(String username,String password){
return username.equals("admin") && password.equals("123456");
}
}
方法重载(overload)
方法重载,程序员使用起来很轻松
就比如,System.out.println( ) 这个方法就是算是在java.io.PrintStream类中的方法重载,我们可以往里面传各种实参,只需要记住这个方法名就好,十分方便
Java重载,即可以在同一个类中定义多个构造方法,只要参数列表不同即可
当一个程序满足怎样的条件时,代码就构成了方法重载呢
条件1:在同一个类中;
条件2:方法名一致;
条件3:形参列表不同:类型不同算不同、顺序不同算不同、个数不同算不同
//形参的个数不同
public static void m1(){ }
public static void m1(String s){ }
//形参的类型不同
public static void m2(int a,int b){ }
public static void m2(long a,long b){ }
//形参的顺序不同
public static void m3(String a,int b){ }
public static void m3(int b,String a){ }
//以下两个方法没有构成方法重载:
public static void noOverload(int a,int b){ }
public static void noOverload(int x,int y){ }
方法递归
方法递归就是方法递归调用自己
一般来说,初学者能循环就循环处理,不建议方法递归,因为递归占内存较大,没有结束语句的话,还会导致栈内存溢出错误
如果要使用,记得有结束语句
举个例子理解一下,斐波那契数列(关于一对兔子每三个月新生一对新兔子,求对应月数总数问题)
public class Test01 {
public static void main(String[] args) {
int n = 12;
int total = rabbit(n);
System.out.println(total);
}
public static int rabbit(int n) {
if(n == 1 || n == 2){
return 1;
}
return rabbit(n - 1) + rabbit(n - 2);
}
}