Java基础语法(构造器,类对象)
初学Java的一些基础语法,有不对的地方请务必指正。
- 构造器与类名相同,构造一个Date对象,还要在构造器前面加个new,即new Date(),想多次使用这个对象,就把它存放在一个对象变量里,
Date birthday=new Date();
birthday是对象变量,它并没有实际包含一个对象,而仅仅引用这个Date对象。
-
方法括号里的“形参”是显式参数,方法名前面的类对象是隐式参数,可用this表示。
-
类对象的数据叫做实例域,需要获得或设置实例域的值,最好设私有的数据域和公有的域访问器方法和域更改器方法,不然每个类对象都可以对公有域进行修改,除非是常量(声明final)。
-
常量名全部大写,类名首字母大写驼峰式命名法(UpperCamelCase),其他方法名变量名用首字母小写的驼峰式命名法(LowerCamelCase)。
-
将域定义为static,即静态域,每个类只有一个静态域,这个类的所有对象将共享一个静态域,即使没有对象,静态域也存在(but实例域不存在),静态域属于类,不属于任何独立的对象,所以可以用类名. 静态域名的形式获得这个静态域,静态常量、静态方法也是用类名调用,静态方法可以访问自身类中的静态域,可以传入显式参数,but不能对对象实行操作,也就是说,没有隐式参数。
-
方法的参数有两种,一是基本数据类型(数字或布尔值),二是对象引用。参数传递给方法有两种,一是按值调用,方法得到的是参数值的一个拷贝,二是按引用调用,方法接收的是变量地址。java里都是按值调用!方法不能修改传递给它的任何参数变量的内容。方法可以改变一个对象参数的状态,但对象引用仍然是按值传递,这里挺容易误以为是按引用调用,有点玄乎,按我的理解,就是它可以通过对象引用的拷贝改变所引用对象的一些值,比如对对象的数据(工资啊)进行一些操作(涨工资),因为引用的都是同一个对象,方法结束后,形参的那个参数变量就被抛弃了,然后原来的对象变量引用的就是那个修改后的对象。说不清没关系,韩信带净化,JAVA都是按值调用。C++有引用调用,引用参数标有&符号,方法可以实现修改引用参数的目的。
-
用StringBuilder类可以构造一个StringBuilder()字符串构建器,好处是不用每次连接字符串都构建一个新的String对象,节约时间空间,用append方法在后面追加,拿出来要变字符串调用toString方法。
-
输入要构造一个Scanner对象,并与标准输入流System. in关联,即
Scanner in=new Scanner(System.in);
in. nextLine()是输入一行,包括空格。in. next()可读取一个单词,以空格为分隔符。in. nextInt()和in. nextDouble()分别输入整数和浮点数。Scanner类输入是可见的,输入密码时要用Console类。
-
main是静态方法,且必须是public,main方法中args参数用于接收用户输入的参数,参数以字符串形式存放在数组中。
-
java也可以用C语言的printf方法,方便格式化输出,比如"%8,.2f"表示宽度为八位字符精度为小数点后两位的浮点数,并用逗号分隔符隔开,例如3,333.33。如果多个参数对应后面的一个值,可以用参数索引,索引必须紧跟着%并后接$,比如
System.out.printf("%1$s%2$tB%2$te,%2$tY",“日期:”,new Date());
其中“日期:”对应1部分,. new Date()对应2部分,就会输出 日期:August 8, 2020 。
- 读取文件:用File对象构造一个Scanner对象,如下
Scanner in=new Scanner(Paths.get("my file.txt"));
get是静态方法,会根据给定的路径名构造一个Path。注意,如果文件名有\,要再加一\,如“c:\myfile. txt”,然后就可以用Scanner的任何方法对文件读取。
写入文件:构建一个printWriter对象,只需提供文件名,如下
printWriter out=new printWriter(“myfile.txt”);
如果文件不存在就会创造该文件,就可以像输出到System. out一样使用print,println和printf。重复一遍,读取文件要用File对象构造,不能直接用文件名,不然Scanner会把文件名解释为字符串数据,而写入文件只需要提供文件名。
文件名可以用文件相对于java虚拟机的启动路径的相对位置,也可以用绝对路径。
用不存在的文件名构造Scanner,或用不能被创建的文件名构造printWriter,就会发生异常,需要在main方法后面加上throws IOException 。
- break可以跳出当前循环,带标签的break可以跳到你想跳出的循环之外,比如随便取个标签名label,加个冒号放到你想跳出的循环之前,即
label: while(…){ … break label; }
就会跳出这个while循环,多重嵌套都可以跳出。
continue语句可以跳过当前循环体的剩余部分,立即跳到当前循环的首部。同样,和break语句一样可以加标签。
- java浮点数值采用二进制系统表示,二进制系统无法精确表示0.1。如果数值计算中不允许有舍入误差,要用BigDecimal类(还有BigInteger类可以实现任意精度的整数运算)。先用静态方法valueOf把普通数值转化为大数值,
BigDecimal a=BigDecimal. valueOf(0.1);
同样把0.1赋给b,然后算c=a+2b,java没有提供运算符重载功能,只能用类里的方法add加subtract减multiply乘devide除,
BigDecimal c=a.add(b.multiply(BigDecimal.valueOf(2)));
算出来c等于自己算哈哈。
-
for each循环格式为for(variable:collection) statement ,即定义一个变量用于暂存
集合中的每一个元素,并执行相应的语句块,比如打印一维数组a的每一个元素:
for(int element : a) System. out. println(element);
- 数组拷贝用Arrays类的copyOf方法,
int[] copiedNum=Arrays. copyOf(Num,Num.length);
后面的长度若大于原始数组长度,数值型多余元素被赋值为0,布尔型赋值为false,若小于原始数组的长度,则只拷贝最前面的元素。
还有个copyOfRange(type [] a,int start,int end),包括起点下标start,但不包括终点下标end。
-
Math.random方法会返回一个0到1之间注意是[0,1)的随机浮点数。用n乘以这个数,就可以得到[0,n)的随机浮点数。
-
java实际上没有多维数组,只有一维数组,多维数组被解释为数组的数组,所以很容易创建不规则数组。
在二维数组a中,a. length是二维数组的行数,a[0].length是第0行的长度。
用for each循环打印二维数组a的每个元素要用两个嵌套的循环:
for(double[] row:a) for(double element:row) System.out.println(element);
英语好的跳过这句话,row是行,column是列。
-
方法不仅可以访问所调用对象的私有数据,还可以访问所属类的所有对象的私有数据。
-
不要编写返回引用对象可变的访问器方法,因为可变对象可以用更改器方法,会破坏封装性,如果要返回可变对象的引用,要先对可用对象进行克隆. clone()。
-
这是重点,其实都是重点,无参数构造函数,像这样
public Employee(){ …//这里对实例域设置默认值 }
tips:它是不用写返回类型的
如果类里没有构造器时,系统会提供一个无参构造器,实例域中数值默认设置为0,字符串默认null,布尔型默认false。
如果类里至少有一个构造器,但没有无参构造器,那摸,构造对象时如果没有写参数就是不合法的!要摸,就加上一个无参构造,最简单的都可以,写public 类名(){什么都不写},所有域都被赋予默认值,要摸就构造对象时加上参数。
-
上面的构造方法是有用到重载的,多个方法有相同的名字,不同的参数,便产生了重载,编译器通过方法的参数类型和调用方法所使用的值类型来选择执行哪个方法。java可以重载任何方法。
-
(建议但不一定要)构造函数的参数名,可以在参数前加个a,便于理解参数的意思,比如name它的形参可以是aName。
-
关键字this除了引用隐式参数,this()在构造器里还可以调用同一个类的另一个构造器。
-
除了上次说的Math.randon(),Randon()可以构造一个随机数生成器,
Randon sakura=new Randon();
sakura. nextInt(n);
会返回一个0~n-1之间的随机整数。
- .有人说java的包(package)管理就是lj,使用包是为了确保类名的唯一性,两个程序猿建立了同名类,只要这些类不在同一个包,就不会冲突,恕我无知,就这一点我就觉得很diao。一个类可以使用所属包的所有类。如果要访问其他包中的公有类,麻烦一点可以在每个类前面加上完整的包名,
java. time. LocalDate today=java. time. LocalDate. now();
简单一点就直接导入这个包的所有类,
import java. util. *;
也可以导入包中的特定类。可以导入一个包,不能import java. *导入以java为前缀的所有包。java中的package和import语句类似于C++中的namespace(命名空间)和using指令。
- 静态导入,比如
import static java. lang. System. *;
那摸,就可以不加类名前缀使用System类的静态方法和静态域,
out. println("Damn it, I am a genius. ");
这样看起来不怎么顺眼,也可以静态导入Math类,用起来就很简洁。
- 源文件开头加上
package packageName;
源文件的类就会放在这个包里。如果没有,就会放在默认包(default package)里,默认包是一个没名字的包。
本文地址:https://blog.csdn.net/weixin_46228933/article/details/108028482