目录
主方法:
输出
输入
转义字符
注释
代码规范
+号的使用
Java数据类型
自动类型转换
基本数据类型和String转换
运算符
运算符优先级
标识符的命名规则和规范
保留字
进制
位运算符
多分支
switch
for循环
do-while循环
Break使用
Continue跳转语句
数组使用
面向对象-类
Java内存
Java方法调用
重载
可变参数
作用域
构造器(构造方法)
对象创建流程
this关键字
2021.1.5日打卡韩顺平零基础30天学会java P104
public static void main(String []args){...}
System.out.println("...");//包括空行。print();//没有换行
1、导入扫描器Scanner的包,java.util.*;2、创建该类对象,声明变量;3、调用里面的功能
import java.util.Scanner; Scanner input= new Scanner(System.in); String name=input.next();
test.java->编译 javac->Test.class->运行java->JVM for Windows(把.class字节码文件装载到jvm中运行)
jdk (java development kit) Java开发工具包 jdk=jre+开发工具集
jre(java runtime enviroment) java运行环境 jre=jvm+java se标准类库
只运行.class文件只需要jre
使用cmd 运行javac编译软件 出现javac不是内部命令,需要配置JAVA_HOME环境变量 JAVA_HOME=jdk安装的主目录。编辑path环境变量 增加%JAVA_HOME%\bin。
环境变量的作用是为了让在dos的任意目录,可以去使用java和javac命令
一个源文件中最多只能有1个public类,其他类的个数不限。如果源文件包含一个Public类,文件名必须按该类名命名。
每一个类编译后,都生成对应的.class。可以将main方法写入非public类中,然后运行非public类。 如果想运行非Public类中的main方法,则需要在cmd中 java dog(非public类名)即可。
cmd控制台按下tab键,会实现命令补全
\t :制表,实现对齐;\n换行;\\:表示一个\;\":表示一个";\':表示一个';
\r:表示回车;System.out.println("xxxxx\roo"); 会输出ooxxx(原理:先输出xxxxx,遇到回车符,会将光标移动至首字符开始)
//单行注释,/* */多行注释
ctrl+/ 注释快捷键
文档注释:内容被jdk提供的javadoc解析,以网页文件形式体现,一般写在类外面
javadoc -d 生成文件夹名 -xx -yy hello.java (-xx,-yy代表生成标签)
类方法的注释,要以Javadoc方式来写。非javadoc注释,给代码维护者看,采用单行或多行注释。
shift+tab左移,tab右移。运算符左右要加空格。源文件要用utf-8保存。 每行行宽不超过80。代码编写采用行尾风格。
左右两边都是数值型时,做加法运算。左右两边有一方是字符串时,做拼接运算。
java整性默认int,声明long变量需要加 'l' 和 'L' ;eg: long num = 1L;
浮点型默认double,声明Float型常量,要加 'f' 或 'F' 。浮点型两种表示形式:5.120f,.512。eg: float num=5.12f。
科学计数法 5.12e2
java中,char本质是一个整数,输出是unicode对应字符。可以给char赋值整数,输出会自动按Unicode转换字符。
ascii码一个字节,一共128个字符,实际上可以表示256个。unicode两个字节,不会有乱码的问题,浪费内存,Unicode兼容ASCII码。utf-8字母使用1个字节,汉字使用3个字节。gbk字母1字节,汉字2个字节。
char->int->long->float->double; byte->short->int->long->float->double。
遇到多个不同类型数据时,系统自动将所有数据转换成容量最大的那种数据类型,然后计算。
byte,short,char之间不会相互转换,但是三者可以参与计算,计算时首先转换为int型。 boolean不参与转换
具体数赋给byte时,先判断该数是否在范围内。变量赋值时,先判断变量的类型
基本数据类型转String:基本数据类型+" "即可。String转基本数据类型 调用parseXX方法。eg: String face="face";Integer.parseInt(face);Double.parseDouble(face);Float.parseFloat(face);Short.parseShort(face);Long.parseLong(face);Byte.parsebyte(face);xxx.charAt(i)//取字符串第一个字符Boolean.parseBoolean("true");
可以把"123"转换成一个整数,但是不能把hello转换为一个整数。
int i=1;i=i++;System.out.println(i);//输出1; temp=i=1; i=i+1=2; i=temp;
int i=1;i=++i;System.out.println(i);//输出2;
短路与:条件1&&条件2(如果第1个条件为false,第二个条件不会判断,结果为false,效率高),逻辑与&(不管第一个条件是否为false,第二个条件都要判断,效率低)。
短路或:条件1 || 条件2(第一个条件为true,第二个条件不会判断,效率高);逻辑或:条件1 | 条件2(不管第一个条件是否为true,第二个条件都要判断,效率低)
取反:!;eg:System.out.println( ! ( 1 > 2 ) );结果为true
逻辑异或:^;a^b(当a和b不同时,结果为true,否则为false)
三元运算符:条件表达式?表达式1:表达式2;(如果条件表达式为true,运算结果是表达式1;如果条件表达式为false,运算结果时表达式2)
从上到下递减
26个英文字母大小写,0-9和 _ 或 $ 组成。数字不能开头,不可以使用关键字和保留字,但可以包含关键字和保留字,严格区分大小写,长度无限制。标识符不能包含空格。
包名:多单词组成时,所有字母都小写。类名、接口名:多单词组成时,所有单词的首字母大写。变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写。eg: xxxYyyZzz;常量名:所有字母都大写。多单词时每个单词用下划线连接。XXX_YYY
byValue,cast,future,generic,inner,operator,outer,rest,var,goto,const
二进制:0b或0B开头;八进制:0开头;十六进制:0x或0X开头
java中没有无符号数,java中的数都是有符号的,看结果的时候要看原码
按位与&,按位或 | ,按位异或^(两位一个为1一个为0结果为1,否则为0),按位取反~,算数右移>>:低位溢出,符号位补溢出的高位;算术左移<<:符号位不变,低位补0;逻辑右移>>>(无符号右移),低位溢出,高位补0;没有<<<符号
if(条件表达式1){代码块1} //条件表达式1成立,底下的条件表达式2、3、4......都不判断。
else if(条件表达式2){代码块2}//条件表达式1不成立,转而判断条件表达式2
多分支可以没有else,如果所有的条件表达式都不成立,则一个执行入口都没有。如果所有的条件表达式都不成立,则默认执行else。
第一个if(b=false),将false赋值给b,所以第一个条件表达式为false,不执行,转而判断下一条件表达式。
嵌套分支不要超过3层。
switch(表达式){//表达式对应一个值;break表示退出switch;一个常量都没匹配上,默认执行default;
case 常量1:语句块1;//由于没有break,直接执行语句块2,不会再去判断
case 常量2:语句块2;break;
default:语句块;break;
}
表达式数据类型要么和case常量类型一样,要么是可以自动转成可以相互比较的类型,比如输入是字符,常量是int。表达式中只能使用(byte,short,int,char,enum,String)
case中的值只能是常量,不能是变量。判断的具体数值不多,建议使用switch语句。对区间判断,结果为boolean类型判断建议使用if。
循环初始值可以有多条初始化语句,但要求类型一样。并且中间用逗号隔开,循环变量迭代也可以有多条迭代语句,中间用逗号隔开。
循环变量初始化;
do{
循环体语句;循环变量迭代;
}while(循环条件);//一定会执行一次。先执行再判断。
break语句出现在多层嵌套语句块时,可以通过标签指明要终止的是哪一层语句块。
label1:{
label2: {
label3: { break label2;
}
}
}//break后指定到哪个label,就退出到哪里。实际开发中尽量不要使用标签,如果没有指定break,默认退出最近的循环体。
continue用于结束本次循环,继续执行下一次循环。
动态初始化:数组类型 数组名[]=new 数据类型[大小];
静态初始化:数组类型 数组名[]={元素值,元素值,.....}
数组默认值:int 0;short 0;byte 0;long 0;float 0.0;double 0.0;char \u0000(代表一个空格);boolean false;String null;
数组赋值:基本数据类型赋值,值就是具体的数据,相互不影响。数组在默认情况下时引用传递,赋值的是地址。会相互影响。
jvm中创建的数组arry在栈中,arry指向堆中的一块内存。
字符串比较:.equals();
二维数组:类型[][]数组名 =new 类型[大小][大小]
对象在栈中有一个变量,变量指向堆中的一块区域,堆中字符串变量指向方法区的特定位置。
属性定义:访问修饰符 属性类型 属性名;其中访问修饰符:public,protected,默认是private。属性如果不赋值则是默认值。
1、栈存局部变量;2、堆存放对象或数组;3、方法区存放常量池(存常量比如字符串)和类加载信息;
java创建按对象流程:1、先加载类信息(属性和方法信息,只会加载一次)2、在堆中分配空间,进行默认初始化。3、把地址赋值给该类的对象。4、指定初始化。
2022.1.6看到203集
每一个成员方法都会在栈中创建新空间。但是,当成员方法最后一条指令执行完后,该栈空间就会被释放。
成员方法定义:
访问修饰符 返回数据类型 方法名 (形参列表){//方法体
return 返回值;//非必须
}//访问修饰符(控制方法使用范围:public,protected,默认,private)
若方法是void,则方法体中可以没有return语句,也可以只写 return ;
方法定义时的参数称为形式参数(形参),方法调用时的参数成为实际参数(实参);
方法里面不能定义方法
同一个类中的方法调用:直接调用。跨类中的方法A类调用B类方法,需要通过对象名调用。eg: 对象名.方法名(参数);
基本数据类型,传递的是拷贝值,形参的任何改变不影响实参。引用类型传递的是地址(传递也是值,但是值是地址)。(引用值作为的形参和实参指向同一个堆中的地址。)可以通过形参影响实参。
(输出10,是因为调用方法中的p一开始跟实参指向同一个地址,但是现在形参赋值为null,则形参的指针链断掉)
方法的局部变量是独立的
同一个类中,多个同名方法存在,但要求形参列表不一致。(方法名必须相同,形参列表必须不同。返回类型无要求。
java允许将同一个类中多个同名同功能但参数个数不同的方法封装成一个方法,可以通过可变参数实现。
语法: 访问修饰符 返回类型 方法名(数据类型 ... 形参名)//使用可变参数时,可以当作数组来使用,形参名可以当作数组。数组元素为各个形参。(可变参数的本质就是数组)可变参数的实参可以为数组。
可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在最后。
java主要的变量有:属性(成员变量也称全局变量,作用域为整个类体)和局部变量(定义在成员方法中)。全局变量可以不赋值,可以直接使用,因为有默认值。但是局部变量必须赋值后才能使用,因为没有默认值
属性和局部变量可以重名,访问时遵循就近原则。同一个作用域中,两个局部变量不能重名。属性生命周期比较长,随对象创建而创建,随对象死亡而死亡。局部变量生命周期比较短,随代码块的执行而创建,随代码块结束而死亡(即一次方法调用过程中)。
全局变量(属性)可以在本类使用,也可以被其它类通过对象调用。局部变量只能在本类对应的方法中使用。全局变量(属性)可以加修饰符,局部变量不可以加修饰符。
语法:修饰符 方法名 (形参列表){//方法体}//完成对新对象的初始化
构造器的修饰符可以默认,也可以是public,protected,private;构造器没有返回值,方法名必须和类名一样,创建对象时,构造器的调用由系统完成
一个类可以定义多个不同的构造器(即构造器重载);构造器时完成对象初始化,不是创建对象。
如果程序员没有定义构造方法,系统会自动给类生成一个默认无参的构造方法(默认构造方法);eg: Person(){} ;一旦定义了自己的构造器,默认的构造器就覆盖了,就不能再使用默认的无参构造器,除非显式的自己定义。(javap
1、加载Person类信息(Person.class),只会加载一次;
2、再堆中分配地址空间;
3、完成对象初始化(3.1、默认初始化:age=0 name=null ;3.2、显式初始化:age=90 name=null;3.3、构造器初始化:age=20 name="小倩");
4、将对象在堆中的地址返回给对象p(p是对象名,也可以理解成是对象的引用)
java虚拟机会给每个对象分配this,代表当前对象。哪个对象调用,this就代表哪个对象。
this关键字可以用来访问本类的属性、方法、构造器。this用于区分当前类的属性和局部变量。
访问成员方法的语法:this.方法名(参数列表);
访问构造器语法:this(参数列表);注意只能在构造器中使用,只能在构造器中访问另外一个构造器。this不能在类定义的外部使用,只能在类定义的方法中使用。访问构造器语法:this(参数列表)必须放在第一条;