JavaSE---基本语法

入门Java笔记打卡1~(对象和类的设置都为语法的誊写作草稿,无含义)

Java基本语法

规范

public class FirstClass{
    public static void main(string[]args){
        System.out.printlen("1");
        System.out.printlen("2");
    }
}
  • 每一条语句都必须以分号 ; 结尾

  • Java中的方法,就是其他编程语言中的函数

  • 程序的入口是main方法

  • 没有main方法,Java程序是无法启动的

  • 方法必须包含在class内部,先有class,再有方法

public class和文件名必须保持一致

关于左大括号的位置

//官方推荐写法
public static void main(Srting[] args){
}
//不推荐写法
public static void main(Srting[] args)
{
}

如果一个Java项目中有2个不同的class,它们都有自己的main方法,那岂不是有2个Java程序入口?

答:只能选择其中一个入口开始执行程序

注释:

Java的注释有3种书写格式:

单行注释: //

多行注释: /* */ 不可嵌套

文档注释(一种特殊的多行注释)

/**
 * 计算2个整数的和
 * @param a 第1个整数
 * @param b 第2个整数
 * @return 两个整数的和 
 */
public static int add(int a,int b){
    return a + b;
}
//在Eclipse中先写出方法来再  /** + 回车即可快速生成

数据类型

Java的数据类型主要分为2大类

基本类型

java中的char是2个字节!

应用类型

引用类型的值是对对象的引用(相当于c语言中的指针)

字面量

JavaSE---基本语法_第1张图片
整数
JavaSE---基本语法_第2张图片
浮点数
JavaSE---基本语法_第3张图片

E和e代表10

字符和字符串
JavaSE---基本语法_第4张图片

string在java属于引用类型

布尔
空值

public class Main {
	public static void main(String[] args) {
		String str1 = "ABCD";
		String str2 = "";     //空串
		String str3 = null;   //空值
		//String属于引用,负责指向一块存值的区域
		//str2指向的是一个区域,存的是空字符串
		//str3是没有指向任何存值区域
	}
}

转义序列

◼ \b(退格, \u0008)

◼ \t(制表符, \u0009)

◼ \n(换行, \u000a)

◼ \f(换页, \u000c)

◼ \r(回车, \u000d)

◼ "(双引号, \u0022)

◼ '(单引号, \u0027)

◼ \(反斜杠, \u005c)

打印快捷键 syso + ALT+/

数字中使用下划线

可以给数字增加下划线增强可读性

JavaSE---基本语法_第5张图片

变量初始化

任何变量在使用之前都必须要先初始化(赋值)

局部变量:需要程序员手动初始化

非局部变量(实例变量、类变量):编译器会自动给未初始化的变量设置一个初始值

public class SecondClass {
	/*成员变量/实例变量*/
	private int age;
	private static int age2;//类变量
    //这些变量编译器会自动初始化
	public static void main(String[] args) {
		int age;
		age = 20;
		System.out.println(age);
	}
}
JavaSE---基本语法_第6张图片

运算符

JavaSE---基本语法_第7张图片

上面一行的优先级比下面一行高

同一行的优先级一样

当多个优先级一样的运算符一起使用时

按照结合性进行运算

✓ 只有赋值运算符的结合性是从右至左

✓ 其他运算符的结合性都是从左至右

为了保证运算符按照预期执行,尽量多使用小括号

比如 5 * ((a + b) / c)

算数表达式的结果必须被使用

public class Firstclas {
	public static void main(String[] args) {
		boolean flag1 = true;
		boolean flag2 = false;
		int age = 10;
		if(age>0) {
			//if条件句内必须是boolean类型,类似于age>0的比较的返回值属于该类型
		}
	}
}

字符串拼接

加号就可替代

public class Firstclas {
	public static void main(String[] args) {
		String name = "爱超";
		int age = 19;
		float height = 183.5f;
		System.out.println("My name is "+ name 
						+ ", My age is " + age
						+ ", Height is " + height
						+ "cm");
	}
}

位操作符

>> 与 >>>

>>(有符号右移):最左用符号位补齐

>>>(无符号右移):最左用 0 补齐

&、 |、 ^ 也能用在 boolean 类型上

对比 &&、 ||, &、 | 少了短路功能

JavaSE---基本语法_第8张图片

&&和||会直接根据前者的情况提前终止判断后者得出结果

而&和|还得同时两个都得查一遍,没有短路的功能

类型转换

拓宽基本类型转换

数据范围小的转为数据范围大的,可以自动转换

✓ byte 转 short、 int、 long、 float、 double

✓ short 转 int、 long、 float、 double

✓ char 转 int、 long、 float、 double

✓ int 转 long、 float、 double

✓ long 转 float、 double

✓ float 转 double

JavaSE---基本语法_第9张图片

窄化基本类型转换

数据范围大的转为数据范围小的(22种),可能会丢失精度和范围,需要强制转换

✓ short 转 byte、 char

✓ char 转 byte、 short

✓ int 转 byte、 short、 char

✓ long 转 byte、 short、 char、 int

✓ float 转 byte、 short、 char、 int、 long

✓ double 转 byte、 short、 char、 int、 long、 float

JavaSE---基本语法_第10张图片

boolean类型是不好类型转换的

一元数字提升

一元数字提升: 将 byte、 short、 char 类型的一元数字自动提升为 int 类型(拓宽基本类型转换)

◼ 下面的情况会执行一元数字提升

public class Firstclas {
	public static void main(String[] args) {
		byte b1 = 10;
		byte b2 = 20;
		int  sum = b1 + b2; // +是二元操作符,b1,b2不是一元数字
        b++;
        ++b;//可以符合条件
		System.out.println(sum);
	}
}

数组的索引、创建数组时的数组长度

public class Firstclas {
	public static void main(String[] args) {
		int[]array = {11,22,33,44};
		double index = 10;
		array[(int)index] = 20;
	    //不用(int)转换会报错
		//byte index = 10;
		//array[index] = 20;  不会报错,因为byte在一元数字规则中作为数组索引提升为int
	}
}

一元运算符 +、 ++

一元运算符 –、 - -

public class Firstclas {
	public static void main(String[] args) {
		int age = 10;
		System.out.println(+age);
        System.out.println(-age);
	}
}
public class Firstclas {
	public static void main(String[] args) {
		char c = 'A';//存储的是它的ASCII值65
		System.out.println(c);//c
        System.out.println(+c);//65
        //+c被运算后提升为整型
	}
}
JavaSE---基本语法_第11张图片

+c1 提升为int,因为int转char为窄化,需要强制类型转换

c3 = 65 ,65是字面量来定义一个全新的变量,不能认为它是整型

按位取反(~)

位移(<<、 >>、 >>>)

二元数字提升

二元数字提升: 提升一个或者两个数字(拓宽基本类型转换)

如果任意一个数字是 double 类型,那么另一个就会被转换为 double 类型

否则,如果任意一个数字是 float 类型,那么另一个就会被转换为 float 类型

否则,如果任意一个数字是 long 类型,那么另一个就会被转换为 long 类型

否则,两个数字都被转换为 int 类型

◼ 下面的情况会执行二元数字提升

乘(*)、除(/)、取余(%)

加法(+)、减法(–)

比较(<、 <=、 >、 >=)

判等(==、 !=)

位运算(&、 ^、 |)

三目( ? : )

JavaSE---基本语法_第12张图片

//v3报错的原因是v1+v2变为int,不可赋给byte
//v4,v5报错的原因同上
byte v1 = 1;
v1 = v1 + 2;
//error,1 + 2转为整型,不可赋给byte

v1 += 2;
//ok (复合赋值运算自带类型转换)
public class Firstclas {
	public static void main(String[] args) {
		byte v1 = 10;
		short v2 = 20;
		byte v3 = (byte)(v1 > 2 ? v1 : v2);
		//可以理解成三目运算符最终返回一个int,再byte强制转换
	}
}

关键字

java:

JavaSE---基本语法_第13张图片

在java8中,goto,const未被使用,但也属于关键字

true false null是字面量不是关键字

标识符

◼ 标识符:变量名、方法名、类名等,命名规则如下

① 不限长度的 Java 字母、 Java 数字序列,但必须以 Java 字母开头(区分大小写)

② 不能使用关键字

③ 不能使用字面量 true、 false、 null

◼ Java 字母

Character.isJavaIdentifierStart() 方法返回 true 的字符

包括 ASCII 中的 A~Z、 a~z,美元符($),下划线(_),中文,韩文,日文等字符,+号不算是java字母

◼ Java 字母 或者 Java 数字

Character.isJavaIdentifierPart() 方法返回 true 的字符

Java 数字 包括 ASCII 中的 0~9

JavaSE---基本语法_第14张图片

命名建议:

◼ 变量名、方法名:小驼峰,比如 myNameAndAge

◼ 类名:大驼峰,比如 MyNameAndAge

◼ 常量:比如 MY_NAME_AND_AGE

数组

数组的创建
int arr1;
int[] arr2 = {};//空数组
int arr3[] = {};//空数组

//定义的时候指定数组元素
int[] arr4 = new int[] {1,2,3,4};
int[] arr5 = {1,2,3,4};

//定义的时候指定数组的长度
int[] arr6 = new int[4];
arr6[0] = 1;
arr6[1] = 2;
arr6[2] = 3;
arr6[3] = 4;

//多维数组
int [][][]arr7;
int[]arr8[][];

◼ 注意:在Java中,字符数组 != 字符串

✓ 字符数组: char[]

✓ 字符串: String

◼ 推荐使用 char[] arr 格式定义数组

◼ 不推荐使用 char arr[] 格式定义数组

数组的内存
public static void main(String[]args){
    int[] array = new int[]{11,22,33};
    System.out.println(array);
}
JavaSE---基本语法_第15张图片

Java的数组元素属于引用类

数组元素存储在堆空间(Heap)

java存储的堆空间会自动申请初始化

public class Firstclass {
	public static void main(String[] args) {
	int[] arr = new int[4];//初始化4个0
     String[] arr = new String[4];//自动初始化为4个NULL
	}
}
数组的遍历
int[]arr = {11,22,33,44};
for(int i = 0; i
public class Firstclass {
	public static void main(String[] args) {
		String[]arr = new String[4];
        System.out.println(arr);//[Ljava.lang.String;@15db9742   前者进制,后者是哈希值(16进制)
        System.out.println(new Object());//[Ljava.lang.String;@15db9742   前者进制,后者是哈希值(16进制)
        System.out.println(arr.hashCode);//366712642
        System.out.println(0x15db9742);//366712642
        System.out.println(arr[0]);//初始值null
        System.out.println(arr[1]);//初始值null
	}
}
数组的细节访问
public class Main{
    public static void main(String[]args){
        int[] array = {array[n]};//随机访问,速度非常快,O(1)
        //array[n] = 0x1110 + n * 类型占的字节数(int == 4)
    }
}

方法

Java中的方法,其实就是其他编程语言中的函数

方法的书写格式:

修饰符 返回值类型 方法名(参数列表){

方法体

}

2个数之和

public class method {
	public static void main(String[] args) {
        System.out.println(sum(10,20));
	}
    public static int sum(int n1,int n2){
    	return n1 + n2;
    }
} 
public class class1{
    public static void main(String[]args){
        System.out.println(sum new int[]{10,20,30,40,50});
    }
    public static int sum(int []numbers)//可以传入多个值
}
//更好的方式
public class class1{
    public static void main(String[]args){
        System.out.println(sum(10,20,30,40,50));
    }       
    public static int sum(int... numbers)//可以传任意数目的值,取决于sum中传递的参的个数
        return 0;
}

[说明是数组类型,I说明是int类型,@后面是哈希值

Object[] array = {};
//[Ljava.lang.Object;@15db9742
public class method {

	public static void main(String[] args) {
        System.out.println(sum(10,20,30));
	}
    public static int sum(int ...numbers){
    	System.out.println(numbers.length);
    	return 0;
    }
} 
//0
//3
public class method {
	public static void main(String[] args) {
        if(args == null) return;//判断,防止因为传null就会报错,程序异常,程序退出
        int []array1 = null;
        int []array2 = {};   
        System.out.println(array1.length);//该列会报错,array为null,java中不可以用空来访问东西的
    	System.out.println(args.length);
    	System.out.println(array2.length);
} 
}

求和

public class method{
    public static void main(String[]args){
        System.out.println(sum(10,20,30));
    }
    public static int sum(int... numbers){
        int result = 0;
        for(int num : numbers){
            result += num;
        }
        return result;
    }
}

可变参数

可变参数必须是方法中的最后一个参数

举例:JDK自带的 System.out.printf 方法

public class method{
    public static void main(String[]args){
        System.out.println(sum(10,20,30));
    }
    public static int sum(String name,int... numbers){
        int result = 0;
        for(int num : numbers){
            result += num;
        }
        return result;
    }
}
public class method{
    public static void main(String[]args){
	String name = "jack";
        int age = 20;
        System.out.println("My name is" + name + ",age is" + age);
        System.out.println("My name is %s , age is %d",name,age);//另一种方法
    }
        return result;
    }
}

%n 和 \n都是换行

参数传递

public class method{
    public static void main(String[] args){
        /*
        Java的类型有2种
        1.基本类型:byte/char/short/int/long/float/double/boolean
        2.引用类型:数组,对象
        */
        int []n = {11,22,33};
        test(n);
        System.out.println(n[0]);
    }
    public static void test(int[]v){
        v[0] = 44//将数组传到到test来通过下标0找地址来改变,可以改变n的值
        v = 44;  //值传递,不会改变n的值    
    } 
}
public class method{
    public static void main(String[] args){
        /*
        Java的类型有2种
        1.基本类型:byte/char/short/int/long/float/double/boolean
        2.引用类型:数组,对象
        */
		int[] n = test();//引用的是数组的地址
        for(int i = 0; i < n.length; i++){
            System.out.println(n[i]);
        }
    }
    public static void test(int[] v){
		int[] v = {11,22,33};
        return v;
    } 
}

◼ 基本类型作为参数是值传递

基本类型作为返回值,返回的是值

◼ 引用类型作为参数是引用传递(地址传递)

引用类型作为返回值,返回的是引用(地址)

方法签名

方法签名由2个部分组成:方法名、参数类型

下面方法的方法签名是:

sum(int,long,double)

public static double sum(int i,long l,double d){
    return i + l + d;
}

在同一个类中,不能定义2个方法签名一样的方法

JavaSE---基本语法_第16张图片

方法的重载

◼ Java 的方法支持重载:方法名相同,方法签名不同

参数个数不同

参数类型不同

◼ 重载与返回值类型、参数名称无关

JavaSE---基本语法_第17张图片

栈帧

栈帧随着方法的调用而创建,随着方法结束而销毁,存储了方法的局部变量信息

public static void main(String[] args){
    test1(10);
    test2(20);
}
public static void test1(int v){}
public static void test2(int v){
    test3(30);
}
public static void test3(int v){}
JavaSE---基本语法_第18张图片

递归调用

public static void main(String[] args){
    sum(4);
}
public static int sum (int n){
    if(n<=1) return n;
    return n + sum(n-1);
}
//如果递归调用没有终止,将会一直消耗栈空间,导致栈内存溢出
//必须要有一个明确的结束递归的判断条件,也叫做边界条件,递归基
JavaSE---基本语法_第19张图片

JavaSE的基础语法便记录于此,下一章节--面向对象

你可能感兴趣的:(java,jvm,开发语言)