Java学习笔记(未完待续

1.在java中,“成员函数”被称为“方法”。类似的,使用点运算符进行类内成员的访问。
2.system.out的两个输出方法:println和print,前一个会换行而后一个不会。
3.有8种数据类型,4个整型(byte, short, int, long)、2个浮点型(float, double)、1个字符型(char)与1个布尔型(boolean)。
4.长整型有后缀L,十六进制有前缀0x,八进制有前缀0。从java7开始,可以使用0b表示二进制,也可以在数字字面值中添加下划线 _ (只是为了让人更容易阅读)。与C++不同的是,java没有无符号类型。
5.float类型的数据有后缀F,没有后缀的浮点数默认成为double类型。
6.尽管有常量专门表示正负无穷大以及NaN,但是不能用等于运算符判断某个值是不是溢出、错误。
7.java中boolean和整数类型之间不能进行相互转化。
8.常量用final进行声明,习惯上变量名全部为大写。(const是Java保留的关键字,但是尚未被用到)
9. 静态引入(import static)的办法可以在使用类中常量时省去写类名。
10. 建议不要在boolean类型与其他类型之间进行强制类型转化,如果一定需要的话,可以写成:b? 1: 0;
11. String类没有提供可以直接修改字符串的方法,所以可以采用如下办法:String s; s = s.substring(a, b) + “(需要添加的字符串)”。因为String类的这个特性,故它被称为“不可变字符串”。
12. 字符串(String)的比较:.equals() 与 .equalsIgnoreCase() 。值得一提的是,字符串常量也可以直接调用equals方法。 Java中的compareTo方法与C中的strcmp函数完全类似。
13. 检查空串 if(s.length() == 0) 或者 if(s.equals(""));检查Null串 if(s == Null);既要检查空串又要检查Null串,那么先要检查是不是null串再检查是不是空串。
14. 因为String类本身的性质,如果用拼接的办法会消耗很多额外且不必要的空间时间,所以构造一个字符串应该创建一个StringBuilder,使用append方法来添加新读入的字符/字符串,最后使用toString方法得到String对象。
15. 沿用了C++的printf语句,可以添加多个标志,具体查表处理。
16. 可以使用静态的办法创建一个格式化的字符串,而不打印输出。 String message = String.format("%xxx %xxx", str1, str2);
17. 使用Scanner进行文件读入的时候不可以把"文件名"作为参数传入,这样只会获得一个字符串数据,而应该将Paths.get(“文件名”)传入Scanner。
18. 在读入文件的时候,有可能出现读入文件不存在的情况,为此,我们需要告知编译器已知可能出现的异常,要在main函数后面添加throw IOException子句标记。
19. 从Java SE 7开始,switch语句中的case标签可以是字符串常量。
20. switch语句在使用枚举常量作为标签时,可以省略类名,因为类名可以通过表达式值确定。
21. 与C++不同的是,尽管保留了go to语句,但是实际使用的是带标签的break语句。

read_date;   //标签名 + ';'
while(){
	...
	while(){
	...
	break read_date;
	}
}

  为了直接跳出多重嵌套而不想要添加更多的判断条件,适当的使用break标签是有益的。另外,带标签的break语句只可以用于跳出循环rebuke跳进循环。

22.BigDecimal类的时间复杂度测试:
我们用2的幂次的计算来大致的考量Java的BigDecimal类的效率。
Java中的测试输出语句采用System.out.println();
 (1) 2的幂次的计算:15e4的计算在1s左右,50e4的计算在5s左右,而1e6的计算则激增到了20s。实际打表可以取1e5-2e5的范围。
 (2) 2的幂次的计算与输出:5e3在0.7s左右,1e4在2s左右。实际打表应该限制在1e4的数量级。
 (3) 循环且无输出语句:开到最大的整数1e9竟然只有毫秒级的时间花费…而C++需要花费1.5s左右的时间。
 (4) 循环且有输出语句:数量级1e7大概花费1s。

23. Java的数组可以使用变量进行初始化长度。
24. Java的数组遍历办法也可以使用类似C++中的范围for语句
25. 打印数组除了遍历的办法还可以使用一个更简单的办法:

//toString方法将数组保存为“[elem1, elem2,..., elemN]“的形式。
System.out.println(Array.toString(array));

26.初始化一个数组,要么使用new,要么在定义的时候使用花括号进行列表初始化。值得一提的是,可以使用new创建一个匿名数组,使用该匿名数组来进行初始化操作,如:int [] array = new int[]{1, 2, 3, 4, 5};

27.数组拷贝有关操作。如果使用int [] luckynumber = smallprimes,将会使得luckynumber和smallprime引用同一个整形数组,对其中任意一个进行修改将会影响到另一个。而如果想要进行拷贝而创建一个新的数组,应该使用方法Array.copyOf(ElemType[] array, long arrayLength)。这个方法通常可以用来增加数组的长度。

//Java
int [] a = new int[100];

//C++
int a[100]; //不等价
int *a = new int[100];  //等价

28.对内置类型构成的数组的排序:Arrays.sort(a);
29.Math.random()方法将返回一个0-1的随机数,通过加减乘除、int截断等方法可以获得不同范围的其他随机数。
30.Java中多维数组的创建。Java中实际上只有一维数组,以二维数组为例,int [][] array = new int[10][6]先分配包含十个指针的数组,再for循环为这十个指针分别指向一个包含6个整形的数组。

//与C++的比对
int a[10][6]; //不等价
int (*a)[6] = new int[10][6]; //不等价
int ** a = new int*[10]; //等价
for(itn i = 0; i < 10; i++) a[i] = new int[6];

31.实现封装的关键在于不能让类中的方法直接地访问其他类的实例域,只能通过类中的方法来与对象数据进行交互。
32.传统的程序设计从顶层的main开始编写程序,而OOP则从设计类开始。
33.类之间的关系:依赖(uses-a)、聚合(has-a)、继承(is-a)。如果一个类的方法操作另一个类,则说一个类依赖于另一个类。(我们应该尽量降低类之间的耦合度)聚合表示一个类的对象包含另一个类的对象。继承则表示一种从一般到特殊的关系。
34.类的构造器名与类名相同,在前加上 new 操作符,表达式new Name()就可以创造一个新对象。
35.类的对象与对象变量是不同的。对象变量本身不是一个对象,它做的是引用一个类对象。Java中类的“引用”不同于C++,对象变量可以引用值为null的对象,它更像是C++中的指针。
36.一个源文件中只能有一个公有类,但是可以有任意多个私有类。
37.构造器与其他方法不同的地方在于,构造器只有伴随着new操作符才会被执行,而不能对一个已存在的对象调用构造器重新设置实例域。
38.对于一个方法而言,有两种参数,一种是显式参数,即在括号中的数值,另一种是隐式参数,是出现在该方法名前的对象,用this表示。在方法中使用this可以有效地将实例域与局部变量分开。
39.如果需要返回一个可变对象的引用,不应该返回该对象的一个引用,这会破坏该类的封装性,应该使用方法.clone()来创建一个副本。
40.类的public方法作为与外部交互的接口,同时也会有一些private方法来作为内部实现的辅助方法。
41.静态域属于类,即使没有对象,静态域仍然存在。
42.静态(static)常(final)量可以通过“类名.静态常量名"进行访问。如果该常量不是静态,那么它处于该类的实例域,需要通过类中某对象进行访问。
43.静态方法不需要使用对象,也不能访问实例域,但是可以访问自身类中的静态域。通常在下面两种情况使用静态方法:(1)不需要访问对象状态,所需参数都是显式提供;(2)只访问类中的静态域。
44.每一个类都可以拥有一个静态的main方法,单独运行该类时就将从该main方法开始。但是如果该类被包含在一个更大的程序中,在运行更大的程序时,该类的main方法就将永远不会被执行。
45. 所有方法都允许重载,但是为了完整的描述方法,应该指出其方法名与参数类型,称其为标签(signature),方法的返回值不是标签的一部分。
46. 在使用默认构造器时要注意不要使用null引用的对象做操作。
47. 在构造器中使用 this(xxx) 可以调用另一个构造器。
48. java具有初始化块的机制。在类中直接以{}包含,当创建一个对象时将自动执行。
49. 可以为任何一个类添加finalize方法,该方法将在垃圾回收之前被调用。
50. .*只可以用于来导入一个包。
51. 静态导入(import static java.xxx…)包中的某个类可以不必添加类名前缀而使用类中的静态方法和静态域。
52. 在源文件开头使用package语句将源文件中的类放在指定的包中,不然将将其放在默认包中。
53. 在子类中为了使用超类的某些方法时,可以使用super.method_name()实现。但是super和this不同,this是对象自己的引用,而super不是任何超类对象的引用,而是一个特殊的指示符,表示将要使用超类的方法。
54. 因为子类不能直接访问超类的私有域,因而对子类的初始化一定要用到超类的构造器,super可以直接调用超类的构造器:super(xxx, xxx, …)。如果子类没有显式的调用主类构造器,那么就将调用主类的无参构造器;如果主类没有无参构造器,那么就将报错。
55. 一个对象变量可以指示多种实际类型的现象称为多态(polymorphism),在运行时决定调用哪个方法的现象称为动态绑定(dynamic binding)。
56. is-a规则的另一种表述是置换法则。在程序中任何出现超类对象的地方都可以用子类进行替换。有一个值得注意的地方,可以将一个子类的对象赋值给一个超类,但是不能将一个超类对象赋值给子类。如果通过某种办法想要用一个超类的对象修改某个子类数组的元素将会报错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值