【超硬核】Java SE 基础语法知识点 (C语言快速转Java)

目录

1、Java程序基础

1.1 JDK和JRD

1.2 命令行操作

1.3 pubilic+class

1.4 字节码文件

2、标识符

2.1 标识符的组成

2.2 遵守驼峰命名方式

2.3 类名、接口名:

2.4 变量名、方法名:

2.5 常量名:

3、关键字

4、变量与常量

4.1 变量

4.2 常量

5、boolean类型

5.1 布尔类型的值

5.2 布尔类型占用的字节数

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

6、byte类型

7、char类型

7.1 char类型占有字节数

7.2 char类型与short类型

8、float类型与double类型

9、类型转换

10、类的定义

10.1 语法结构

10.2 基本数据类型

10.3 引用数据类型

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

11.1 逻辑与&

11.2 短路与&&

12、运算符

12.1 赋值运算符

12.2 字符串连接运算符

12.3 三元运算符/三目运算符/条件运算符

13、用户控制端输入

13.1 Scanner类中的方法

13.2 System.in和System.out方法

13.3 InputStreamReader和BufferedReader方法

13.4 nextLine( )和next( )的区别

14、方法

14.1 方法的定义,语法结构

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

14.3 栈内存的特点

15、方法执行内存分析

16、方法重载(overload)

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

16.2 构成方法重载的条件

16.3 方法重载的影响因素

16.4 方法重载的应用

17、方法递归


1、Java程序基础

1.1 JDK和JRD

JDK=JRE+Java开发工具;

JRD=JVM+Java核心类库;

1.2 命令行操作

cd md创建文件目录;

cd rd删除;

cd del删文件;

cd ..返回上一级;

cd /跳转目录;

1.3 pubilic+class

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

1.4 字节码文件

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


2、标识符

2.1 标识符的组成

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

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

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

2.2 遵守驼峰命名方式

e.g. SytemService、UserService;

2.3 类名、接口名:

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

2.4 变量名、方法名:

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

2.5 常量名:

全部大写;

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

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


3、关键字

关键字要小写

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


4、变量与常量

4.1 变量

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

变量必须初始化

4.2 常量

常量有final关键字修饰;


5、boolean类型

5.1 布尔类型的值

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

5.2 布尔类型占用的字节数

boolen类型只占用1个字节;

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

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

底层false为0,ture为1;

定义:boolean i = true;


6、byte类型

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


7、char类型

7.1 char类型占有字节数

char类型在java中占2个字节

7.2 char类型与short类型

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


8、float类型与double类型

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

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


9、类型转换

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;

byte b=10;
b=b+5;
System.out.println(b);

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

byte b=10;
b=(byte)(b+5);
System.out.println(b);

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


10、类的定义

10.1 语法结构

[修饰符列表] class 类名{

}

String不属于基本数据类型,是一个字符串类型,也是一个引用类型;

引用数据类型还包括:类,接口,数组;

String是SUN在JavaSE中提供的字符串类型;

String.class字节码文件;

重点:

1、属性通常是采用一个变量的形式来完成定义的;

2、在类体当中,方法体之外定义的变量被称为"成员变量",成员变量没有赋值,系统赋默认值:一切向0看齐;

10.2 基本数据类型

byte、short、int、long、float、double、boolean、char;

10.3 引用数据类型

String.class SUN提供的;

System.class SUN提供的;

Student.class 程序员自定义的(是一个类,类型,引用数据类型);


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

& 逻辑与

| 逻辑或

!逻辑非(取反)

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

&& 短路与

|| 短路或

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

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

11.1 逻辑与&

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

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

运行结果为11

11.2 短路与&&

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

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

运行结果为10

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


12、运算符

12.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类型,但有可能会损失;

12.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));

12.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 ? "男" : '女');

13、用户控制端输入

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

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

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

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

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

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

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

13.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); 

13.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(); 
} 

13.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(); 
} 

13.4 nextLine( )和next( )的区别

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


14、方法

14.1 方法的定义,语法结构

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

方法体;

}

注意:

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

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

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

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

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

14.2.1 方法的定义和执行:

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

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

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

14.2.3 栈数据结构 :

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

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

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

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

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

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

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

压栈:给方法分配内存;

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

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

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

main begin
m1 begin
m2 begin
m3 begin
m3 over
m2 over
m3 over
main over

14.3 栈内存的特点

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

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

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

弹栈/出栈/pop

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

先进后出;

后进先出;


15、方法执行内存分析

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;
    }
}


16、方法重载(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;
    }
}

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

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

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

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

16.2 构成方法重载的条件

1)在同一个类中

2)方法名相同

3)参数列表不同

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

16.3 方法重载的影响因素

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

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

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

16.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);
    }
}

17、方法递归

缺点:

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

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>