java学习笔记

一.原理、概念
1.面相对象语言的三个核心本质:数据抽象化(data abstraction)、继承(inheritance)、多态(polymorphism也叫动态绑定dynamic binding)。覆写(overriding)和重载(overloading),覆写引发多态。
重载(overloading):指一个类中具有相同方法名,不同的参数(包括个数、类型、位置)。(从父类继承的方法当然也算子类的方法,不包括父类的private方法)
覆写(overriding):指父类和子类具有相同方法名、相同参数(包括个数、类型、位置)。(即把从父类继承的有效方法给屏蔽了,当然不包括父类的private方法)

2.static,final,abstract说明:
static用来修饰变量(类变量)。方法(类方法),他们是静态的、只需加载一次、类公用,类变量定义如用到方法只能是类方法,类方法内用到的变量只能是类变量,因为他们被初始化时成员变量和成员方法还没有初始化。
final用来修饰变量(不能改变)、方法(不能重载)、类(不能继承)。
abstract用来修饰方法(只能被重载)、类(只能被继承),抽象类不一定含有抽象发放;但含有抽象方法的一定为抽象类。

3.在一个文件夹内的两个.java文件如果没设package,则编译器会将两个文件隶属的文件夹视为default package,因此他们互为friendly。

4.类无构造函数可自动产生一无参构造函数(default constructor);当有任何构造函数时都不会有default constructor。构造函数调用其他构造函数只能在第一行,故无法调用两个构造函数(包括父类和子类其他的构造函数)。

5.类的装载时间:生成一个对象时(装载整个类);取类变量或类方法时(装载静态部分)。

6.生成对象,实现接口。生成对象包括:声明、实例化、初始化。

7.j2se/j2ee/j2me的区别:
java 从JDK1.2的版本开始就叫java2了,同时SUN公司将其分为三个平台:

J2SE(JAVA标准版)主要基于界面程序的开发,其中除了基本的JAVA API外主要包括了Flowout Event Graphics,J2SE就是Java2的标准版,主要用于桌面应用软件的编程,jdk1.1.8版本以后改成j2se。

J2EE(企业级版本)主要用于企业级应用的开发以及分布式的网络程序的开发,如电子商务网站和ERP系统。

J2ME(微型版本)用于开发嵌入式的设备程序,如手机,智能烤箱,手机和PDA的编程等。

二.语法
1.java's lable:仔细看一下文档你就会发现,JAVA里的标号只能定义循环语句。
label1: for (.....) 是合法的。
break label1;
continue label2;
label2: if (...) 是非法的。

2.转义字符  转义字符的意义
\n      换行
\t      横向跳到下一制表位置
\v      竖向跳格
\b      退格
\r      回车
\f      走纸换页
\\      反斜线符"\"
\'      单引号符
\a      鸣铃
\u****     1~4位十六进制数所代表的unicode字符(java)
\***     1~3位八进制数所代表的ASCII字符(c)
\x**     1~2位十六进制数所代表的ASCII字符(c)

3.三种常用进制表示:0123——八进制 123——十进制 0x123——十六进制。

4.length & length():length使数组的一个变量;length()是String类的一个方法。

5.throw & throws:throw在方法体内引发异常;throws在方法参数表后向上级抛出异常。

6.无限循环:for(;;) 和 while(true){} ,得用break离开。

三.类库
1.java随机数:首先利用random()获得一个随机浮点数,然后乘以你希望得到的整数的最大值,最后对得到的结果取整。例如你希望得到的整数的最大值是1000,那么你就可以这么写: int rand = (int) (1000 * Math.random());//Math.random()的输出范围是[0,1)。

2.数组的相关操作
a)array的充填
Java标准程序库中的Arrays中有fill(),将单一数值复制到每个位置
b)array的复制
Java标准程序库中提供System.arraycopy()的static函数
c)array的比较
Arrays提供重载版的equals(),藉以比较两个arrays是否相等,能够处理object和所有基本型别,两个arrays必须拥有相同个数的元素,而有所有对应元素必须两两相等。
d)array元素的比较
有两种方法:a)【java编程思想e2 P310】实现java.lang.Comparable接口,Comparable只有一个compareTo()方法,覆写它:x大返回-1
,相等返回0,x小返回1。b)【java编程思想e2 P311】实现java.util.Comparator接口,此接口有compare()和equals()方法,如无必要无需覆
写equals()方法。
e)array的排序
利用内置的sort函数,可以针对任何primitives array或objects array进行排序。
f)在已排序的array中进行查找
array排序完毕后,可以使用Arrays.binarySearch()快速查找某个元素,在未经排序的array上不能使用binarySearch(),否则结果完全无
法预测,如果array内含多个相同元素,查找动作不保证会搜出其中哪一个元素。

3.容器(containers)
java.lang.Object -> java.util.AbstractCollection & AbstractMap
AbstractCollection -> AbstractList & AbstractQueue & AbstractSet
sop(AbstractCollection);//打印[dog, cat, bird]
sop(AbstractMap);//打印{first=dog, second=cat, third=bird}

四.经验
1.Java是面向对象的语言,操作几乎都是在对象之间进行的,一个类的实例如果是(null)的话则不能调用这个实例的方法,否则就会出java.lang.NullPointException错误。确定它肯定是不为null的。对于String的这种equals或equalsIgnoreCase的操作常常还可以用下面的方法进行安全操作:用一个确定的不为null的String去与未知的String进行比较。
String str = null;
if (“Hello”.equals(str))
{ System.out.println(“str is Hello”); }

2.java中应用浮点数:http://www-128.ibm.com/developerworks/cn/java/j-jtp0114/index.html。建议:想办法用整数;或者用BigDecimal类。

3.java中+用于字符串连接和算术运算,char类型在做运算时会先转换成int类型,所以System.out.println('H'+'a');输出169。
如果你真想把char连接起来,要怎么办呢?
1。用Stringbuffer。
StringBuffer buf = new StringBuffer();
buf.append(`H`);
buf.append(`a`);
System.out.println(buf);

2。按照对付int的方法来处理,利用String重载+运算符的特性。
System.out.println("" + `H` + `a`);

3。在JDK5.0里,还可以用格式化输出。
System.out.println("%c%c", `H`,`a`);
System.out.println(""+'a'+'b'+'c');//前面加一个空串就都按字符串处理。

4。看下面程序输出什么?
public class InTheLoop {

    public static final int END = Integer.MAX_VALUE;

    public static final int START = END - 100;

    public static void main(String[] args) {

        int count = 0;

        for (int i = START; i <= END; i++)

            count++;

        System.out.println(count);

    }

}
解答:死循环(infinite loop)。原因是一个int,是不可能大于Integer.MAX_VALUE的,当到达Integer.MAX_VALUE之后继续加1,就会默认的变为Integer.MIN_VALUE,所以形成了无限循环。这就提醒我们在处理integral type(包括byte, char, short ,int 和 long)的时候,要小心取值范围。

5。JVM中整数的“/”和“%”运算:
a/b=+(a绝对值/b绝对值)取地板  (ab同号、b!=0)
     =-(a绝对值/b绝对值)取地板  (ab异号、b!=0)
eg:7/-3=-1,25/4=6
a%b=+(a绝对值%b绝对值)       (a>=0、b!=0)
       =-(a绝对值%b绝对值)       (a<=0、b!=0)
eg:15%-4=3,-15%-4=-3

6。用移位运算效率较高:
public static boolean isOdd(int i){//判断是否为奇数
    return(i & 1) == 1;
}

7。当赋值运算符出现在if或输出语句上时:首先进行赋值,其次把等号右边的结果作为整个表达式的结果。
例1:
boolean b=true;
if(b = false){
   System.out.println(b);
   System.out.println("haha");
}
输出:
false
haha

8。
boolean b=true;
 System.out.println(b=false);
System.out.println(b);
输出为:
false
false

9、当计算大数字的时候,要小心overflow,variable的类型只能决定最后的存储类型,不能决定中间计算时的临时存储类型。比如
long i = 10000000000000000000000000000 / 1000000000000;

10、位扩展
a)位扩展(widen primitive conversion)时,正数高位补0,负数高位补1。
b)计算前,正数和零存为原码,负数存为补码(去反加一)
eg:Long.toHexString(0x100000000L + 0xcafebabe)打印为多少?0xcafebabe变为Long型为0xffffffffcafebabe 加 0x100000000L = 0x100000000cafebabe,最高位1overflow,结果为0xcafebabe。
c)char型占16位,是0——65535,不含负数,故char位扩展时高位全补0
eg:(int)(char)0xff输出为65535。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值