写点什么

Surpass Day——Java 语法基础

作者:胖虎不秃头
  • 2022 年 10 月 07 日
    河南
  • 本文字数:5178 字

    阅读完需:约 17 分钟

Surpass Day——Java语法基础

Java 程序基础知识

1、JDK、JRE、JVM 三者的关系

JDK=JRE+Java 开发工具;


JRD=JVM+Java 核心类库;

2、命令行操作

cd md 创建文件目录;


cd rd 删除;


cd del 删文件;


cd ..返回上一级;


cd /跳转目录;

3、pubilic+class

类名-->与文件名一致;

4、字节码文件

编译后生成字节码文件(.class)有几个类生成几个;



标识符

1、标识符的组成

数字、字母、下划线、美元符号(可以是中文),


与 C 语言相同首字符不能以数字开头;


与 C 语言相比,标识符的组成多了一个美元符号;

2、遵守驼峰命名方式

e.g. SytemService、UserService;

3、类名、接口名

首字母大写,后面每个单词首字母大写;

4、变量名、方法名

首字母小写,后面每个单词首字母大写;

5、常量名

全部大写;


//与 C 语言的常量不同 字面值(数据)看见字知其数据;


e.g.10.100,3.14,"abc",'a',ture、false(布尔型);



关键字

关键字要小写


public、class、static、void......



变量与常量

1、变量

Java 中变量必须声明再赋值才能访问(否则内存未开辟出来);


变量必须初始化

2、常量

常量有 final 关键字修饰;



boolean 类型

1、布尔类型的值

boolean 类型只有 ture false 没有其他值;

2、布尔类型占用的字节数

boolen 类型只占用 1 个字节;

3、布尔类型的底层表示和定义

不像 C 语言有 0、1 表示假和真;


底层 false 为 0,ture 为 1;


定义:boolean i = true;



byte 类型

byte 类型表示 8 位带符号的二进制数



char 类型

1、char 类型占有字节数

char 类型在 java 中占 2 个字节

2、char 类型与 short 类型

char 和 short 可表示的种类数量相同,但 char 可取更大的正整数;



float 类型与 double 类型

java 中无 float 类型,定义 float 类型时,在浮点数后 +f


否则认为是 double 类型,编译失败;



类型转换

1、布尔类型无法强制转换;


2、Java:高精度赋值给低精度时需要强制转换,否则编译错误,显示不兼容的类型,高精度到低精度会造成损失精度;e.g.long-->int


3、C 语言:高精度赋值给低精度时,会有精度缺失,但不会造成编译失败;


4、Java 和 C 语言:低精度赋值给高精度(小容量-->大容量) 自动转换不存在精度损失;e.g. int-->long


5、当整数字面值未超过 byte、short、char 的取值范围可以直接赋值给 byte、short、char;


6、byte、short、char 混合运算时,先各自转换成 int;


7、多种数据类型混合运算时,先转换成容量最大的类型;


8、long 类型在后面+ 'L' ,long 10L,L 用来判断是否为 long 类型;


9、float 表示离散、有限、舍入误差、大约、接近不等于、0.1!=0.1,c=c+1;


需要完全避免用浮点数比较大小;


10、


int i = 128;byte b=(byte) i;
复制代码


点击并拖拽以移动


输出为-127(因为有溢出);


11、JDK 新特性


数字之间可以用下划线分隔,更清楚分辨位数;


e.g.10_0000_0000


​​

逻辑运算符(布尔运算符)

& 逻辑与


| 逻辑或


!逻辑非(取反)


^ 逻辑异或(两边的算子只要不一样,结果就是 ture)


&& 短路与


|| 短路或


1、逻辑运算符要求两边的算子都是布尔类型,并且逻辑运算符最终的运算结果也是一个布尔类型;


2、“短路与(或)”和“逻辑与(或)”最终的结果相同,只不过“短路与(或)”存在短路现象

1、逻辑与 &

&左边无论是 true 还是 flase 都会计算右边;


int x=10;int y=8;System.out.println(x < y & ++x < y);System.out.println(x);
复制代码


点击并拖拽以移动


运行结果为 11

2、短路与 &&

&&左边若为 false 则直接短路,右边不再计算(短路现象);


int x=10;int y=8;System.out.println(x < y && ++x < y);System.out.println(x);
复制代码


点击并拖拽以移动


运行结果为 10


从某个角度来看,短路与更智能,效率更高;



运算符

1、赋值运算符

+=、-=、*=、/=、%=;


byte、short、char 混合运算时,先各自转换成 int;


byte b=10;b=b+5;System.out.println(b);
复制代码


点击并拖拽以移动


编译报错,(b+5 自动转换成了 int 类型,所以要想通过编译,需要加强制转换或者使用 b+=5)


byte b=10;b=(byte)(b+5);b+=5;System.out.println(b);
复制代码


点击并拖拽以移动


以上述例子为例


b+=5 和 b=b+5 并不等同;


b+=5 与 b=(byte)(b+5)是等同的;


结论:


扩展类的赋值运算符不改变运算结果类型,假设最初这个变量的类型是 byte 类型,无论怎么进行追加或追减,最终该变量的数据类型还是 byte 类型,但有可能会损失;



2、字符串连接运算符

关于 java 中"+"运算符:


1、+运算符在 java 语言当中有两个作用:


*加法运算,求和;


*字符串的连接运算;


2、"+"两边的数据都是数字的话一定是加法运算;


3、"+"两边的数据只要有一个数据是字符串,一定会进行字符串的连接运算,连接运算之后的结果还是一个字符串类型


静态输出


e.g.System.out.println(10+20);//30


System.out.println(10+20+"30");//"3030"


System.out.println(10+(20+"30");//"102030"


System.out.println("10+20="+a+b);


"10+20="是字符串;


"10+20="+a 先运算字符串+a 等于个字符串"10+20=10";


"10+20="+a+b 再运算 +b 等于个字符串"10+20=1020";


System.out.println("10+20="+(a+b));


此时先运算(a+b)=30,在进行字符串"10+20="+30="10+20=30";


动态输出


System.out.println(a+"+"+b+"="+(a+b));



3、三元运算符/三目运算符/条件运算符

e.g.1


10,'男'不是一个完整的 java 语句;


boolean sex=false;sex ? '男' : '女';
复制代码


点击并拖拽以移动


编译会报错;


修改如下:


boolean sex=false;char c = sex ? '男' : '女';System.out.println(c);
复制代码


点击并拖拽以移动


e.g.2


boolean sex=false;char c = sex ? "男" : '女';System.out.println(c);
复制代码


点击并拖拽以移动


编译报错,类型不兼容,但可以直接用


System.out.println(sex ? "男" : '女');


​​

1、用户控制端输入

第一步:创建键盘扫描器对象


java.util.scanner s = new java.util.Scanner(System.in);


第二步:调用 Scanner 对象的 next()方法开始接收用户键盘输入


敲完回车键 键入的信息会自动赋值给标识符


String userInputContent = s.next();【以字符串的形式接收】


int num = s.nextInt();【以整型的形式接收】


//标识符的命名规范:见名知意

1.1 Scanner 类中的方法

  • 优点一: 可以获取键盘输入的字符串 ;

  • 优点二: 有现成的获取 int,float 等类型数据,非常强大,也非常方便;


Scanner s = new Scanner(System.in); System.out.println("ScannerTest, Please Enter Name:"); String name = sc.nextLine();  //读取字符串型输入 
复制代码


点击并拖拽以移动


Scanner s = new Scanner(System.in); System.out.println("ScannerTest, Please Enter Age:"); int age = sc.nextInt();    //读取整型输入 
复制代码


点击并拖拽以移动


Scanner s = new Scanner(System.in); System.out.println("ScannerTest, Please Enter Salary:"); float salary = sc.nextFloat(); //读取float型输入 
复制代码


点击并拖拽以移动


Scanner s = new Scanner(System.in); System.out.println("Your Information is as below:"); System.out.println("Name:" + name +"\n" + "Age:"+age + "\n"+"Salary:"+salary); 
复制代码


点击并拖拽以移动

1.2 System.in 和 System.out 方法

  • 缺点一: 该方法能获取从键盘输入的字符,但只能针对一个字符的获取

  • 缺点二: 获取的只是 char 类型的。如果想获得 int,float 等类型的输入,比较麻烦。


try{   System.out.print("Enter a Char:");   char i = (char)System.in.read();   System.out.println("Yout Enter Char is:" + i); } catch(IOException e){   e.printStackTrace(); } 
复制代码


点击并拖拽以移动

1.3 InputStreamReader 和 BufferedReader 方法

  • 优点: 可以获取键盘输入的字符串

  • 缺点: 如何要获取的是 int,float 等类型的仍然需要转换


System.out.println("ReadTest, Please Enter Data:"); InputStreamReader is = new InputStreamReader(System.in); //new构造InputStreamReader对象 BufferedReader br = new BufferedReader(is); //拿构造的方法传到BufferedReader中 try{ //该方法中有个IOExcepiton需要捕获   String name = br.readLine();   System.out.println("ReadTest Output:" + name); } catch(IOException e){   e.printStackTrace(); } 
复制代码


点击并拖拽以移动

1.4 nextLine( )和 next( )的区别

nextLine( ) 方法返回的是 Enter 键之前的所有字符,它是可以得到带空格的字符串的。 next( ) 会自动消去有效字符前的空格,只返回输入的字符,不能得到带空格的字符串。



2、方法

2.1 方法的定义,语法结构

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


方法体;


}


注意:


1)修饰符列表可选项,不是必须的,目前统一写成 public static;


2)方法内的修饰符列表当中有 static 关键字时,调用方法:类名.方法名(实际参数列表);当方法在该类中时,"类名. "可以省略;


3)方法名:首字母小写,后面每个字母大写,遵循驼峰规则;


4)建议一个源文件当中只定义一个 class,比较清晰;

2.2 方法在执行过程中,JVM 内存的分配和变化

2.2.1 方法的定义和执行:


方法只定义,不调用是不会执行的,并且在 JVM 中也不会给该方法分配"运行所属"的内存空间;只有调用的时候才会分配所属的内空间;


2.2.2 JVM 内存划分上主要的内存空间:


方法区内存、堆内存、栈内存(还有其他的内存空间);


2.2.3 栈数据结构 :


*栈:stack,是一种数据结构;


*数据结构是数据的存储形态;


*常见的数据结构:数组、队列、栈、链表、二叉树、哈希表/散列表;


2.2.4 方法代码文件的存储位置,内存的分配位置:


1)方法代码片段属于 .class 字节码文件的一部分,字节码文件在类的加载的时候,将其放到了方法区当中。所以 JVM 中的三块主要的内存空间中方法区内存最先有数据。存在了代码片段;


2)代码片段虽然在方法区当中只要一份,但是可以重复调用。每一次调用这个方法的时候,需要给该方法分配独立的活动场所,在栈内存中分配【栈内存中分配方法运行的所属空间】;


3)方法在调用的瞬间会给该方法分配独立的内存空间,在栈中发生压栈动作,方法执行结束之后,给该方法分配独立的内存空间全部释放,此时发生弹栈动作。


压栈:给方法分配内存;


弹栈:释放该方法的内存空间;


4)局部变量在在“方法体”中声明,在栈中存储,运行时在栈中分配



点击并拖拽以移动


​编辑


e.g.下列程序模型就是一个压栈、弹栈的过程;


main beginm1 beginm2 beginm3 beginm3 overm2 overm3 overmain over
复制代码


点击并拖拽以移动

2.3 栈内存的特点

1)栈帧永远指向栈顶元素


2)栈顶元素处于活跃状态,其他元素静止


3)术语: 压栈/入栈/push


弹栈/出栈/pop


4)栈数据结构存储数据的特点:


先进后出;


后进先出



点击并拖拽以移动


​编辑



3、方法执行内存分析

public class MethodTest01{    public static void main(String[] args)    {        int a = 10;        int b = 20;        int restValue = sumInt(a,b);        System.out.println("retValue = "+ retvalue);    }    public ststic int sumInt(int i,int j)    {        int result = i + j;        int num = 3;        int reValue = divide (result,num);        return retValue;    }    public static int divide (int x,int y)    {        int z = x / y;        return z;    }}
复制代码


点击并拖拽以移动



点击并拖拽以移动


​编辑



4、方法重载(overload)

优点:


功能不相同但相似,像是在使用同一个方法一样,程序员编写代码更加方便,也不需要记忆更多的方法名,代码更美观;


(javascript 不支持方法重载机制)


public class MethodTest01{    public static void main(String[] args)    {        System.out.println(sum(1,2));        System.out.println(sum(1.0,2.0));        System.out.println(sum(1L,2L));    }    public static int sum(int a,int b)    {        return a + b;    }     public static long sum(long a,long b)    {        return a + b;    }     public static double sum(double a,double b)    {        return a + b;    }}
复制代码


点击并拖拽以移动


参数的类型不同,对应调用的方法也不同。此时区分方法不再依靠方法名了,依靠的是实参的数据类型。

4.1 什么时候考虑使用方法重载?

*功能相似的时候,尽可能让方法名相同;


【功能不同/不相似的时候,尽可能让方法名不同】;

4.2 构成方法重载的条件

1)在同一个类中


2)方法名相同


3)参数列表不同


(数量不同、顺序不同、类型不同)

4.3 方法重载的影响因素

1)方法重载和方法名+参数列表有关;


2)方法重载和返回值类型无关;


3)方法重载和修饰符列表无关;

4.4 方法重载的应用

用户自定义封装一段代码,使得在使用时更加便捷快速调用;


public class helloworld{     public static void main(String[] args)    {         U.v(2.0);     }}class U{    public static void v(long b){        System.out.println(b);    }    public static void v(double b){        System.out.println(b);    }    public static void v(short b){        System.out.println(b);    }     public static void v(char b){        System.out.println(b);    }     public static void v(String b){        System.out.println(b);    }     public static void v(byte b){        System.out.println(b);    }}
复制代码


点击并拖拽以移动

5、方法递归

缺点:


耗费栈内存,调用一次方法栈内存就会新分配一块所属的内存空间;


当没有结束条件时,栈内存溢出错误,错误无法挽回,只有一个结果,就是 JVM 停止工作;


发布于: 刚刚阅读数: 3
用户头像

还未添加个人签名 2022.07.29 加入

还未添加个人简介

评论

发布
暂无评论
Surpass Day——Java语法基础_Java_胖虎不秃头_InfoQ写作社区