基本类型一旦声明就会被分配内存空间,而普通类型(自定义类)需要使用new关键字来分配内存空间。
当我们创建一个衍生类的对象时,Java实际上先创建了一个基类对象(subobject),
并在基类对象的外部(注意,这里是基类对象的外部,衍生类对象的内部),增加衍生类定义的其他成员,构成一个衍生类对象。
外部使用者能看到的,就是基类和衍生类的public成员。
new是在内存中为对象开辟空间。具体来说,new是在内存的堆(heap)上为对象开辟空间。
这一空间中,保存有对象的数据和方法。
引用变量存在于内存的栈(stack)中。栈的读取速度比堆快,但栈上存储的数据受到有效范围的限制。
基本类型(primitive type)的对象,比如int, double,保存在栈上。当我们声明基本类型时,不需要new。
一旦声明,Java将在栈上直接存储基本类型的数据。所以,基本类型的变量名表示的是数据本身,不是引用。
Java的参数传递为值传递。也就是说,当我们传递一个参数时,方法将获得该参数的一个拷贝。
实际上,我们传递的参数,一个是基本类型的变量,另一个为对象的引用。
基本类型变量的值传递,意味着变量本身被复制,并传递给Java方法。Java方法对变量的修改不会影响到原变量。
引用的值传递,意味着对象的地址被复制,并传递给Java方法。Java方法根据该引用的访问将会影响对象。
字符串的不变性(immutable)
任何字符串对象一旦被创建,就不能被更改,通过引用变量导致字符串的修改,都将导致新字符串对象的创建。
大量的字符串相加操作会产生大量的字符串对象,比如:
System.out.println("sfd"+"sf"+"ty");
如果有涉及到较多的字符串相加操作,请使用StringBuffer类。
String s=" this is a book! ";
System.out.println(s.length()); //求字符串长度,包含所有空格;
System.out.println(s.trim().length()); //去除头尾空格
System.out.println(s.toUpperCase()); //将小写字母转换为大写字母
System.out.println("aBcD".toLowerCase()); //将大写字母转换为小写字母
System.out.println(s.indexOf('s')); //找出s这个字符在字符串中首次出现的位置,字符串第一个位置是0位置;
System.out.println(s.lastIndexOf('s'));//找出s这个字符在字符串中最后一次出现的位置
System.out.println(s.indexOf("book")); //找出子串出现的位置,即:"book"中'b'字符的位置
System.out.println(s.indexOf("world!"));
System.out.println(s.toCharArray()[3]); //输出为 i
System.out.println(s.charAt(3)); //输出为 i
System.out.println(s.concat("hello,world!")); //字符串相加
System.out.println("abc".compareTo("bca")); //输出-1,
System.out.println("abc".compareTo("abc")); //输出 0,
System.out.println("cbc".compareTo("bca")); //输出 1
System.out.println("Abc".compareToIgnoreCase("aBc"));
System.out.println(s.contains("book")); //输出 true
System.out.println(s.endsWith("! ")); //输出 false
System.out.println(s.isEmpty()); //是否为空
System.out.println(s.replace('s', 'm'));
System.out.println(s.valueOf(1));
System.out.println(1+"");
System.out.println("abcdefg".substring(3)); //输出defg
System.out.println("abcdefg".substring(3,6)); //输出def
子类可以继承父类的方法,也可以复写父类的方法,但所有复写的方法不能有比父类方法更严格的访问权限。