进入培训班第一天,开始记录下一些笔记,也算是记录学习的轨迹吧,更新时间会比较长。
1.在for循环中,循环部分只出现在花括号中“{}”,即所谓的循环体。
2.return的用法:
①返回值
②结束程序运行
3.eclipse的快捷键:
①输出void main方法:输入main + Alt+ ?
②输出System.out.println方法:输入syso+Alt+?
4.对于if语句,若其后没有花括号,则只能对一行起作用。
如:
if(i<5)
i++;
j+=i
则只影响i++那一行。
5. java的内存机制。
基础类型(byte,short,int,long,float,double,char,boolean)只占一块内存,除此之外的都叫引用类型。引用类型不同之处在于要占两块内存。
如:String s = new String("hello");
相当于String s; s = new String("hello"); 分两步进行。
第一步String s 是现在内存中分配一块内存,所存值为null,因为还没有对s进行初始化
第二部 s = newString("hello");这时再在内存中分配一块内存(并且位于堆内存中,所有new出来的东西都在堆内存中,堆内存是动态分配的),得到真正的hello值,由s指向hello,相当于指针。
6. this的简单用法
this表示对static方法可以直接从普通方法(regular method)中调用,但是普通方法不能直接从static方法中调用类内部中对自己的引用,方便类中方法访问自己的属性。
如
class a{
int a;
int b;
public void getA(int a,int b){
this.a = a;
this.b = b;
}
与下边的功能相同
class a{
int a;
int b;
public void getA(int _a,int _b){
a = _a;
b = _b;
}
}
7. static方法的简介
static方法可以直接从普通方法(regular method)中调用,但是普通方法不能直接从static方法中调用,这是因为普通方法是对象的方面,static是类方法。类加载在前,对象实例化在后。
8.封装的简要应用
如若父类A中有private a1(); default a2(); protected a3(); public a4() 这四种方法。
则子类B【不管与A在不在同一个包中】继承A后,若想使用a3方法,则只能使用super方法。而对于a4(),直接使用也行,利用super方法也行。
9. 重载与重写的区别
重写指的是子类覆盖父类的方法,用于继承中
①重载指的是一个方法名对应多个方法;
②什么情况构成重载?形参列表不同(类型、个数不用)
③形参名称不同、返回值不同不构成重载
10.编程时,一般情况下,成员变量都必须私有,以private修饰,然后使用set/get方法
对于set和get方法,set没有返回值,但有形参;get有返回值,无形参。例如:
private int[] score;
其对应的set/get方法为:
public void setScore(int[] score){
this.score = score;
}
public int[] getScore(){
return score;
}
然后
int[] score = {1,2,3,4};
s.setScore(score);
打印时用
System.out.println(s.getScore()[0]);
不要丢了s.getScore()后的[0],这个必须有,因为定义getScore()方法时就已经限制其前边为数组号。也可写为
public int getScore()[]{
return score;
}
11.String为不可变字符序列
StringBuilder:可变字符序列,线程不安全,效率高
StringBuffer:可变字符序列,线程安全,效率低
尽量不要使用
String b = "a" + "c";
这种形式,因为String为不可变字符序列,会在内存新建很多变量,效率低下,也浪费内存。而StringBuilder 和 StringBuffer只会新建一个,效率高,占用内存也少。
12.String方法中,substring()截取字符串时是掐头不掐尾,比如:
String str1 = "abcdefg";
String str2 = str1.substring(2,4);
则str2为cdtrim()只是去掉头部和尾部的空格,字符串内部的不管
13.类似
String str = "a";
建出来的都为字符串常量,它不是new出来的位于方法区[内存中有栈、堆、方法区],而对于
String a1 = new String("a");
String a2 = new String("a");
这种的,由于new出来的都位于堆内存,所以两个"a"虽然内容相同,但处于不同的位置。System.out.println(a1 == a2);为false
System.out.println(a1.equals(a2));为true
因为a1和a2指向了不同的新的字符串变量String a3 = "b";
String a4 = "b";
这种的,"b"位于方法区,并且两次都指向的为同一个,所以System.out.println(a3 == a4);为true
System.out.println(a3.equals(a4));为true
因为a3和a4指向了常量池中的同一个对象
14.数组一旦被创建,它的长度就不能改变。并且声明数组时,不能指定其长度,只有在实例化时才会分配空间。
如:int[5] a; 就是非法的。
15.数组的三种初始化方法
①静态初始化
int[] a = {1,2,3};//静态初始化的省略写法
Man[] mans = {
new man(1,2),//注意为逗号而不是分号
new man(2,3)
};
静态初始化的完整写法为:
int[] arr = new int[]{1,2,3};//不要忘了右边的[]
此时可分开写:int[] arr;
arr = new int[]{1,2,3};//不要忘了右边的[]
但简略写法却不能这样写
int[] arr;
arr = {1,2,3};//会报错
②动态初始化
int[] a = new int[2];
a[0] = 1;
a[1] = 2;
③数组的默认初始化int[] a = new int[2];//默认值为0,0
boolean[] b = new boolean[2];//默认值为false,false
17.多态是指父类的引用可以指向子类的对象.在使用时,new的谁就调用谁的方法,这就是动态绑定(也叫多态).
A a2=new C();--------A 的引用a2 指向newC;所以a2.m1是调用C类里的m1()方法;
18.表示年月日一般用yyyy-MM-dd,其中MM不能小写,因为m表示分钟
19.补充:String与StringBuilder的区别
举个例子:
string s="aa"; s +="bb"; 则内存中存在了aa bb aabb 三个
stringbuilder ss="aa"; ss.Append("bb")。则内存中只有两个 "bb"和"aabb" 此处少了一个"aa",其实是因为stringbuilder是可变的,"aa"变成了"aabb",而不是重新分配 新空间。
为什么是stringbuilder比string好,还是存在string。因为stringbuilder是引用类型的,一开始分配的 时候需要比较多的空间,而string是值类型的。这个有点struct与class的利害比较了。如果不是频繁拼接的情况下,string的性能明显 好于stringbuilder,所以如果频繁拼接就用stringbuilder,如果是展现那么用string。
20.容器中判断重复元素不是利用地址比较,而是equals和hashcode方法
对于自动装箱和拆箱,在1.5以后就可以无视int和Integer的差别了,直接套用就行
补充:调用父类的构造函数用super(),在语法上要求放在第一行。