这算是一个我自己弄的一个查漏补缺的小东西吧。。。
目录
使用动态初始化数组的时候,其中的元素将会自动拥有一个默认值:
前言:是java9.但是其大部分特性都差不多啊。。语法也差不多= =emmm我只是想和其他稍微区分一丢丢。哦。。我是把自己稍微觉得,还需要再看看的知识进行了整理。。算是个人笔记了。这部分存放的应该是我觉得比较简单的java知识。
还有些东西没有添加上去,不代表只有那些哦!有些。。。懒得写。。+ 看视频还没复习到那里。。
如果是在同一个包中,就不需要导包语句。
不同包中,才需要导包语句。
java程序3个步骤:
编写源程序(.java源程序),编译源程序(.class文件 字节码文件),运行(JVM运行)
常量:
程序运行期间不发生改变的量。
1.字符串常量:双引号引起来的。
2.整数常量:直接写上的数字,没有小数点。
3.浮点数常量:直接写上的数字,有小数点。
4.字符常量:单引号引起来的。
5.布尔常量:只有两种取值:true\false
6.空常量:null。没有任何数据
注意:空常量不能直接用来打印输出。
System.out.println(1024); // 这就是一个整数,默认是int类型
System.out.println(3.14); // 这就是一个浮点数,默认是double类型。
数据类型:
基本数据类型:整数型、浮点型、字符型、布尔型。(四类八种)
引用数据类型:字符串、数组、类、接口、lambda
注意:
1.字符串不是基本类型,而是引用类型。
2.浮点型可能只是一个近似值,并非精确的值。
3.数据范围和字节数不一定相关,例如float数据范围比long更加广泛,但是float是4字节,long是8字节。
4.浮点数当中默认类型是double。如果一定要使用float类型,需要加上一个后缀F(f)。
如果是整数,默认为int类型,如果一定要使用long类型,需要加上一个后缀L(l)。推荐使用大写字母后缀。
long num6 = 3000000000; //这样没加后缀的是会被报错的。
long num6 = 3000000000L;//这样的才是对的。
int 最高只能表示21个亿
变量:
程序运行期间,内容可以发生改变的量。
1.数据类型 变量名称; //创建了一个变量
变量名称=数据值; //赋值。
2.数据类型 变量名称=数据值; //再创建一个变量的同时,立刻放入指定的数据值。
注意事项:使用变量时
1.如果创建多个变量,那么变量之间的名称不可重复。
2.对于float和long类型来说,字母后缀F和L不要丢掉,
3.如果使用byte或者short类型的变量,那么右侧的数据值不能超过左侧类型的的范围。
4.没有赋值的变量,不能直接使用;一定要复制之后,才能使用。
5.变量使用不能超过作用于的范围。
6.可以通过一个语句来创建多个变量,但一般情况不推荐。
数据类型转换:
1.当数据类型不一样时,将会发生数据类型转换。
自动类型转换(隐式)
1.特点:代码不需要进行特殊处理,自动完成
2.规则:数据范围从小到大
注意事项:
1.float num=30L;
左边float类型,右边long类型。long--->float,范围是float更大一些,所以符合从小到大规则。
强制类型类型转换:
1.特点:代码需要进行特殊的格式处理,不能自动完成。
2.格式:范围小的类型 范围小的变量名=(范围小的类型)原本范围大的数据
注意事项:
1.强制类型转换一般不推荐使用,因为有可能发生精度损失、数据溢出。
2.byte/short/char 这三种类型都可以发生数学运算,例如加法“+”
3.byte/short/char 这三种类型在运算的时候,首先都会被提升成int类型,然后计算。
4.右侧数值大小不能超过左侧的类型范围。
5.boolean类型不能发生数据类型转换。
编译器优化注意事项:
1. 如果没有超过左侧范围,编译器补上强转。
对于byte/short/char三种类型来说,如果右侧赋值的数值没有超过范围
那么javac编译器将会自动隐含地为我们补上一个(byte)(short)(char)
byte num1=30; //左侧是byte,右侧是int,但是自动补上了强转。
2.如果右侧超过了左侧范围,那么编译器报错。
3.在给变量进行赋值的时候,如果右侧的表达式中全是常量,没有任何变量,那么编译器javac将会直接将若干个常量表达式计算得到结果。
右侧的常量结果数值,没有超过左侧范围,所以正确。
这称为“编译器的常量优化”
但是注意:一旦表达式当中有变量参与,那么就不能进行这种优化了。
4.short a=5;
short b=8;
//short + short --> int + int -->int
short result = a+b; //错误写法!左侧需要的是int类型。
数字和字符的对照关系表(编码表)
ASCLL码值:
48 0
65 A
97 a
运算符等等的:
运算符:进行特定操作的符号。
表达式:用运算符连起来的式子叫做表达式。
四则运算:+-*/
取模运算:只有对于整数的除法来说,取模运算符才有余数的意义。
注意事项:
1.一旦运算当中有不同类型的数据,那么结果将会是数据类型范围大的那种。
四则运算中的+号
1.对于数值来说,就是加法
2.对于字符类型char,在计算之前,char会被提升称为int,然后在计算
3.对于字符串String来说,加号代表字符串连接操作。
任何数据类型和字符串进行连接的时候,结果都会变成字符串。
String str="java";
System.out.println(str + 20 +30); //显示java2030
自增自减运算符:只有变量才可使用,常量不行。
复合赋值运算符:
+= a=a+b;
-= a=a-b;
*= a=a*b;
/= a=a/b;
%= a=a%b
注意事项:
1.只有变量才能使用赋值运算符,常量不能进行复制。
2.复合赋值运算符其中隐含了一个强制类型转换。
定义一个方法的格式:
public static void 方法名称(){ 方法体 }
方法名称的命名规则和变量一样,使用小驼峰式。
方法体:也就是一个大括号当中可以包含任意条语句。
注意事项:
1.方法定义的先后顺序无所谓。
2.方法的定义不能产生嵌套包含关系。
3.方法定义好了之后,不会执行的。如果想要执行,一定要进行方法的调用。
如何调用方法,格式:
方法名称();
java9里面的新特性,jshell
它是一个轻量级的小工具,用于操作简单的东西,不值得去保存的。
退出它 /exit
switch语句使用的注意事项:
1.多个case后面的数值不可以重复
2.switch后面小括号当中只能是下列数据类型:
基本数据类型:byte/short/char/int
引用数据类型:String字符串、enum枚举
3.switch语句格式可以很灵活:前后顺序可以颠倒,而且break语句还可以省略。
“匹配哪一个case就从哪一个位置向下执行,直到遇到了break或者整体结束为止。”
方法:
若干语句的功能及和。
方法名称:方法的名字,规则和变量一样,小驼峰。
参数:进入方法的数据
返回值:从方法中出来的数据。
定义方法的完整格式:
修饰符 返回值类型 方法名称(参数类型 参数名称,。。。){
方法体
return 返回值;
}
return :两个作用,第一停止当前方法,第二将后面的返回值还给调用处。
return后面的返回值需要与方法的返回值类型保持一致。
方法的三种调用:
1.单独调用:方法名称(参数);
2.打印调用
3.赋值调用
注意:返回值类型为void,这种方法只能够单独调用,不能进行打印调用或者赋值调用。
使用方法时的注意事项:
1.方法应该定义在类当中,但是不能再方法当中在定义方法。不能嵌套。
2.方法定义的前后顺序无所谓。
3.方法定义之后不会执行,如果希望执行,一定要调用:单独调用、打印调用、赋值调用。
4.如果方法有返回值,那么必须协商“return 返回值”,不能没有。
5.return后面的返回值数据,必须和方法的返回值类型,对应起来。
6.对于一个void没有返回值的方法,不能写return后面的返回值,只能写return自己。
7.对于void方法当中最后一行的return可以省略不写。
8.一个方法当中可以有多个return语句,但是必须保证同时只有一个会被执行到。
方法的重载:
多个方法的名称一样,但是参数列表不一样。
好处,只需要记住唯一一个方法名称,就可以实现类似的多个功能。
方法的重载与下列因素相关:
1.参数个数不同
2.参数类型不同。
3.参数的多类型顺序不同。
方法重载与下列因素无关:
1.与参数的名称无关
2.与方法的返回值类型无关。
3.与修饰符无关
//在调用输出语句的时候,println方法其实就是进行了多种数据类型的重载形式
数组:
是一种容器,可以同属存放多个数据值。
特点:
1.是一种引用数据类型。
2.其中的多个数据,类型必须统一。
3.数组长度在程序运行期间不可改变。
数组的初始化:
1.动态初始化(指定长度)
数据类型[] 数组名称=new 数据类型[数组长度];
2.静态初始化(指定内容)
注意事项:
虽然静态初始化没有直接告诉长度,但是根据大括号里面的元素具体内容,也可以推算出长度。
直接打印数组名称,得到的是数组对应的:内存地址哈希值。
使用动态初始化数组的时候,其中的元素将会自动拥有一个默认值:
规则如下:
如果是整数类型,那么默认为0;
浮点类型,默认0.0
字符类型,默认'\u0000'
布尔类型,false
引用类型,null
java内存需要划分成5个部分:
1.栈:
存放方法中的局部变量。方法的运行一定要在栈中运行。
局部变量:方法的参数,或者是方法{}内部的变量
作用域,一旦超出作用域,立刻从栈内存当中消失。
2.堆
凡是new出来的东西,都在堆当中。
堆内存里面的东西都有一个地址值:16禁止。
堆内存里面的数据,都有默认值。规则:
整数类型,默认为0;
浮点类型,默认0.0
字符类型,默认'\u0000'
布尔类型,false
引用类型,null
3.方法区:
存储.class相关信息,包含方法的信息。
4.本地方法栈。与操作系统相关。
5.寄存器:与cpu相关。
一个数组的内存图:
(嗷,我这个截图的视频的!)
两个数组的内存图:
两个引用指向同一个数组:
copy的视频截图
类与对象的关系:
1.类是对一类事物的描述,是抽象的。
2.对象是一类事物的实例,是具体的。
3.类是对象的模板,对象是类的实体。
局部变量和成员变量
1.定义的位置不一样【重点】
局部变量:在方法的内部。
成员变量:在方法的外部,直接写在类当中。
2.作用范围不一样【重点】
局部变量:只有方法当中才可以使用,出了方法就不能再用了。
成员变量:整个类全都可以通用。
3.默认值不一样【重点】
局部变量:没有默认值,如果想要使用,必须手动进行赋值。
成员变量:如果没有赋值,会有默认值,规则和数组一样
4.内存的位置不一样
局部变量:位于栈内存。
成员变量:位于堆内存。
5.生命周期不一样
局部变量:随着方法进栈而诞生,随着方法出栈而消失。
成员变量:随着对象创建二诞生,随着对象被垃圾回收而消失。
面向对象三大特征:封装、继承、多态。
封装性在Java当中的体现:
1.方法就是一种封装
2.关键字private也是一种封装。
封装就是将一些细节信息隐藏起来,对于外界不可见。
this关键字的作用:
当方法的局部变量和类的成员变量重名的时候,根据“就近原则”,有限使用局部变量。
如果需要访问本类当中的成员变量,需要使用格式:this.成员变量名
“通过谁调用的方法,谁就是this”
private 关键字的作用及其使用:
1.一旦使用了private进行修饰,那么本类当中仍然可以随意访问,但是超出了本类范围之外,就不能再直接访问了。
2.间接访问private成员变量,就是定义一对儿getter/setter方法。
3.必须叫setXxx或者时getXxx命名规则。
对于Getter来说,不能有参数,返回值类型和成员变量对应。
对于Setter来说,不能有返回值,参数类型和成员变量对应。
构造方法:
构造方法是专门用来创建对象的方法,当我们通过关键字new来创建对象时,就是在调用构造方法。
格式:
public 类名称(参数类型 参数名称){
方法体
}
注意事项:
1.构造方法的名称必须和所在的类名完全一样,就连大小写也要一样。
2.构造方法不要写返回值类型,连void都不写。
3.构造方法不能return一个具体的返回值
4.如果没有编写任何构造方法,那么编译器将会默认赠送一个没有参数的构造方法,其方法体什么事情都不做。
5.一旦编写了至少一个构造方法,那么编译器将不再赠送。
6.构造方法也是可以进行重载的。
重载:方法名称相同,参数列表不同。
一个标准的类通常要拥有下面四部分组成部分:
这样标准的类也叫做Java Bean
1.所有的成员变量都要使用private关键字修饰
2.为每一个成员变量编写一对getter/setter方法
3.编写一个无参数的构造方法
4.编写一个全参数的构造方法
//快速生成get/set: alt+insert 【getter/setter】
//快速生成构造方法: alt+insert 【Constructor】
//如果不是快速生成就是【code】-【generate】//ideaij快捷键。都是