Java Learning – Basic 02

1. 构造函数:

特殊的方法,名字跟类名一直,无返回值,也没有void,如果没有构造函数,JVM在编译时会自动加一个隐含的构造函数,下面文章详细介绍了构造函数和this的用法:
http://blog.csdn.net/nypone/article/details/4693509

2. 对象传递和变量传递:

变量传递数值,但不改变原始数据;而对象传递的是引用,也就是地址,如果改变了,那么原始对象也会改变。这里扩展一下,如果If中==常用于基本数据类型的相等性,如果判断的是String对象呢?他判断的是两个对象的内存地址是否相同,如果想确内容是否相等,需要用equals方法

3. Java类的成员变量:

主要有两种,静态变量和实例变量。静态变量也是类变量,两种变量的界限也是一个在类,一个在实例。实例变量必须创建实例对象(new),才会分配空间;而只要加载类,就会给静态变量分配空间。

class Person
{
    int age ;
    String name; //实例变量,也叫对象变量
    static int totalFee; //静态变量,也叫类变量
    //类变量是所有对象共有,一个对象将它改变,其他对象得到的就是改变后的
    //而实例变量则属对象私有,某一个对象将其值改变,不影响其他对象
    public void showName()
    {
        System.out.print(this.name);
    }
    public static void showTotalFee()
    //类方法是属于与类相关的,公共的方法
    {
        System.out.print(totalFee);
    }
}

4. 静态方法:

只能访问静态变量和静态方法,如下就是不正确的:

package test;

public class test11 {
	public static void test(){
		test2(); // 报错!建议把下面的函数改成静态方法
		System.out.println("test1");
		}
	public void test2(){ //如改成void static test2()
		System.out.println("test2");
		}
}

5. 当使用void时:

正常是没有返回值,但是可以在方法中写“return;”,return后面没东西,说明无返回值;这里要跟抽象类中的抽象方法区分,抽象方法无返回值,连void也不行。

6. 调用其他类的方法:

有两种方法:

Earth e = new Earth();
Earth.test();
e.test();

7. 遍历数组:

用增强型的for语句,下面number是数组

String[] number = {"A", "B", "C"}
For (String  s : number){
	System.out.print(s + " ");
}

8. 循环体中的continue,break:

continue:用于结束循环体中其后语句的执行,并跳回循环程序块的开头执行下一次循环,而不是立刻循环体。
break:在java中,跳出一层循环,如果跳出多个循环,可以用goto或者label,下面是如何跳出多层循环
http://blog.csdn.net/nokiaguy/article/details/4684765

9. Arraylist

比标准数组更灵活,可以增加或减少数据集;另外ArrayList是标准数组面向对象的表示,所以基本数据类型不能存储到ArrayList,那么下面怎么理解?

int i = 63;
sampleArrayList.add(i);

如果一个基本数据类型放到ArrayList中,那么java会通过自动装箱把基本数据转换成Integer的对象并存储

Java中Array与ArrayList的主要区别在于:
Array([]):最高效;但是其容量固定且无法动态改变;
ArrayList:容量可动态增长;但牺牲效率;
http://blog.sina.com.cn/s/blog_5ce1fe770100b0ay.html

10.泛型:

泛型是Java SE 1.5 的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。
http://baike.baidu.com/link?url=udpiOhAYM4Bt6iDNnc4HBl9IphrlZttHsOOqkv7TadSvlhjxv1MQJtKc7y3oc8Fk9Reo8ICMz17peQhm9wF9m_

泛型数组:
数组是不能通过泛型创建的,因为我们不能创建不可具体化的类型的数组。何为不可集体化?即不是一个实际存在的类型,因而不能实例化。下面是其他网友总结的怎样创建泛型数组:
http://developer.51cto.com/art/201202/317813.htm
http://jingyan.baidu.com/article/b907e627d0dbd846e7891cf1.html

11.继承:

就是方便代码重用而产生的,在不同的类中找出其中的共性并创建一个通用的父类,子类继承父类,也可以说子类扩展父类。如同现实生活中父类是动物,子类是猪马羊,他们继承类动物的特点属性。注意类只能扩展一个类,但接口可以扩展多个接口!

12.抽象类:

不能实例化(实例化是创建对象,苹果可以实例化红苹果,青苹果;而水果不能实例化红水果,黑水果),只能通过继承由子类引用,因为抽象方法不能有方法体(由于是抽象的,也就无法描述出方法体)!那么抽象类什么时候才会被用到呢?当不需要实例化时,什么时候不需要实例化,可以参考下面的连接:
http://zhidao.baidu.com/link?url=93lXAnCxjpMRLQV3gRQnnfYDFxiMBdCF9TaFfLQhoHqFpdEAzRlcKwocQ975dLw5bGVMSnpXeOfTefxZD_ojOa

13.接口:

类可以使用多个接口,接口可以看成是一个全是抽象方法的特殊抽象类。实现接口时,必须在该类中实现所有方法。比如一个接口有3个方法,当一个类实现(implements)这个接口时,这3个方法都需要实现,换句话说,接口是调用类的必要并且公共的方法。

一个接口为什么不可以继承抽象类?
接口里的方法是不能有方法身体的,但抽象类的方法(在抽象类中有非抽象方法,如果是抽象方法,一样没有方法体!)是可以有方法体的,继承后,在这一点上就会产生矛盾。抽象类的方法体无法存在了呀

接口和抽象类的区别:
http://www.ibm.com/developerworks/cn/java/l-javainterface-abstract/
http://www.cnblogs.com/xiaoao808/archive/2008/03/11/1100886.html

14.访问修饰符:

它定义了类调用的不同安全级别,也可以看成是封装,就好比对于我对于开车的理解,只要知道开火,调档,踩油门,车就走了,但是当你操作的每一步,里面是怎么运行的,你不需要关心

私有的(private):最严格,只能被同一个类中的其他方法使用
默认级别:是第二严格的,允许同一个包的不同类之间调用
protected:是第三严格,除了默认级别,它增加了包外子类的访问
public:是最不严格的,他没有提供限制

15.Java中@Override的作用

@Override是伪代码,表示重写,可以不写,教材上就没写,不过写上有如下好处:
– 可以当注释用,方便阅读;
– 编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错。例如,你如果没写@Override,而你下面的方法名又写错了,这时你的编译器是可以编译通过的,因为编译器以为这个方法是你的子类中自己增加的方法。
http://www.cnblogs.com/octobershiner/archive/2012/03/09/2388370.html

16.Java 异常处理的误区和经验总结

http://www.ibm.com/developerworks/cn/java/j-lo-exception-misdirection/index.html

17.toString方法

toString方法是Object里面已经有了的方法,而所有类都是继承Object,所以“所有对象都有这个方法”。它通常只是为了方便输出,比 System.out.println(xx),括号里面的“xx”如果不是String类型的话,就自动调用xx的toString()方法。总而言之,它只是sun公司开发java的时候为了方便所有类的字符串操作而特意加入的一个方法。但需要注意的是若希望将StringBuffer在屏幕上显示出来, 则必须首先调用toString方法把它变成字符串常量, 因为PrintStream的方法println()不接受StringBuffer类型的参数

18.当实例化一个对象时,内存会发生什么?

http://blog.csdn.net/lingzhou1/article/details/8476709
http://www.cnblogs.com/whgw/archive/2011/09/29/2194997.html
http://blog.sina.com.cn/s/blog_6cad92b701019r8o.html
http://jingyan.baidu.com/article/020278118b44ed1bcd9ce561.html

19.StringBuffer和String:

String:
是对象不是原始类型,为不可变对象,一旦被创建,就不能修改它的值。对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去。String 是final类,即不能被继承,如下

string str = "abc";
str = str+"bcd";

这样会创建两个对象,一个新实例str “abcbcd”,和之前的str “abc”。因此String会导致新对象的生成,少量的追加差别不大,但多了就会非常影响性能,创建新对象属于程序开销较大的操作之一,下面是从网上找到一个测试例子,很形象,我特意把循环次数调的很大(10w次),运行后结果大概为208051,208s

package test;

public class test11 {
	public static void main(String[] args) {
        String tempstr = "abcdefghijklmnopqrstuvwxyz";
        int times = 100000;
        long lstart1 = System.currentTimeMillis();
        String str = ""; // String对象
        for (int i = 0; i < times; i++) {
            str += tempstr; // 24个字母循环叠加
        }
        long lend1 = System.currentTimeMillis();
        long time = (lend1 - lstart1);
        System.out.println(time);
	}

}

StringBuffer:
是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象,它只能通过构造函数来建立,而不能通过付值符号对他进行赋值

StringBuffer sb = new StringBuffer();
sb = "welcome to here!";//error

对象被建立以后,在内存中就会分配内存空间,并初始保存一个null。向StringBuffer中赋值的时候可以通过它的append方法
sb.append(“hello”);下面是相对于String,StringBuffer的性能测试,同样的功能,同样的循环次数,下面这个程序结果为23,远远小于1s!

package test;

public class test11 {
	public static void main(String[] args) {
        String tempstr = "abcdefghijklmnopqrstuvwxyz";
        int times = 100000;
        long lstart1 = System.currentTimeMillis();
        StringBuffer sb = new StringBuffer(); // 更新
        for (int i = 0; i < times; i++) {
        	sb.append(tempstr); // 更新
        }
        long lend1 = System.currentTimeMillis();
        long time = (lend1 - lstart1);
        System.out.println(time);
	}

}

http://www.cnblogs.com/ydpvictor/archive/2012/09/09/2677260.html
http://www.cnblogs.com/zhangjs8385/archive/2011/10/10/2205281.html <<< 注意后半部分,有详细说明String和StringBuffer的区别,不过看的不是很明白,暂留

0
你可以留言,或者trackback 从你的网站

留言哦