1。关于java的值引用和对象引用
java语言采用的总是值引用(传递参数的方式),即方法得到的是所有参数值的一个拷贝。所以方法不能修改传给它的任何参数变量的内容。
然而方法参数有两种:值类型和引用类型。对于引用类型,java传递的是引用的拷贝。所以方法可以改变这个对象参数的状态(对象的某个值改变),但是不能实现让一个对象参数引用一个新的对象(对象参数的拷贝可以指向一个新的对象)。
例如:
package CiteTest;//主要验证java的值引用和对象引用public class Cite{ public String dataString; public Cite(String datastring) { this.dataString=datastring; }}package CiteTest;public class TestDemo{ public static void main(String[] args) { Cite aCite=new Cite("Alice"); Cite bCite=new Cite("Bob"); Print(aCite,bCite); swap(aCite,bCite); Print(aCite,bCite); } public static void swap(Cite aCite,Cite bCite) { Cite tempCite=aCite; aCite=bCite; bCite=tempCite; System.out.println("hanshuzhong acite:"+aCite.dataString); System.out.println("hanshuzhong bcite:"+bCite.dataString); } public static void Print(Cite aCite,Cite bCite) { System.out.println("acite:"+aCite.dataString); System.out.println("bcite:"+bCite.dataString); } }
结果如下:
acite:Alicebcite:Bobhanshuzhong acite:Bobhanshuzhong bcite:Aliceacite:Alicebcite:Bob
如果测试改变的话:
public static void change(Cite aCite) { aCite.dataString="hello"; } Cite aCite=new Cite("Alice"); Print(aCite); change(aCite); Print(aCite);
结果为:
acite:Aliceacite:hello
2。重载重载是函数的名字相同,函数的参数不同。而不同的函数是的标志是函数的签名不同。函数的签名是指函数的名字和函数的参数类型,不包括函数的返回类型。
3.构造器
java仅当类中没有任何构造器的时候才会提供默认无参数的构造器。
4.继承
子类继承父类之后,可以调用父类的protect和普public方法,也可以覆盖父类已有的方法。子类需要调用父类的同名方法是,加super关键字。如果使用super构造器调用超类构造器,必须是子类构造器的第一条语句。
当子类的构造器没有显式的调用超类的构造器,则将自动调用超类默认的(无参)构造器。如果超类中没有无参的构造器,而在子类中构造器没有显式调用超类的其他构造器,则java编译器将报告错误。
子类 is a 父类,所以 父类=子类成立,即子类可以指向父类。
5.多态和动态绑定
概念: 一个对象变量可以引用多种实际类型的现象被成为多态。而在运行时能够自动的选择调用哪个方法的现象称为动态绑定。
java中不需要将方法声明为虚拟方法。动态绑定是默认的处理方式。如果不需要让一个方法具有虚拟特征,可以将它标记为final属性。
如果调用的方法为private,static,final方法或者是构造器,编译器可以准确的知道应该调用那个方法,这种调用方式称为静态绑定。与此对应的是调用的方法依赖于隐式参数的类型,并且在实际运行时实现动态绑定。
调用对象方法的执行过程:
编译器查看对象的声明类型和方法名。假设调用x.f(param),隐式参数x声明为C类的对象。编译器会列举所有C类中名为f的方法和其超类中访问属性为public且名为f的方法。
编译器查看调用方法时提供的参数类型。根据参数类型找到与其完全匹配的方法,选择这个方法。这个过程叫做重载解析。可以存在类型转换,例如;int到double,子类到父类。如果没有找到或者找到多个,则报错。注意:如果子类中一个函数签名和超类方法签名一样,则子类中的方法覆盖这个父类中的方法。返回类型不属于签名。如果返回类型不一样,但是兼容,成为两个方法具有可协变的返回类型。所以查找的方法是现在当前类的方法查找,没有的话再查找超类中的方法。
出现任何超类的地方都可以被子类替换。
例:
父类为employee,子类为manager,子类中有方法setbonus而父类中没有。
manager boss=new manager(..);employee[] staff=new employee[3];staff[0]=boss;boss.setbonus(); //对staff[0].setbonus(); //错误
因为staff[0]被声明为employee类型,这个类中没有setbonus,所以会出错。写法错误。对于子类和父类中都存在的方法,看对象是什么。
6.类型转换
对象类型转换之前最好判断一下,用instanceof。
7.抽象类
抽象类可以包含具体的方法实现,如果这个类中有一个抽象方法,就得将类定义为抽象类。抽象类不能实例化。
8.object中的方法
equal方法
用来检测一个对象是否等于另外一个对象。主要是判断两个对象是否具有相同的引用。如果具有相同的引用就一定相等。可以用getclass,但是无法对比数据。不行。instanceof检测又不可以对称。
hashcode()
每个对象都具有一个散列值,即hashcode。一般为对象的存储地址。字符串的散列码由内容导出。但是Stringbuffer类没有定义散列码,他又object的类中的散列码定义。如果重载equal,必须重载hashcode
9.数组中的元素
一旦确定了数组的元素的个数,使用trimToSize()来调整空间大小。
10.反射
反射:能够分析类能力
再运行时查看对象,分析类,实现method对象,操作数组
运行时得到一个对象,也可以得到对象的类名:
Employee e;
e.getClass().getName(); //得到对象的类名
Class c=Class.forName(classname); //用类名得到类,类名要包括包名
用处:
if(e.getClass()==Employee.class)
e.getClass().newInstance();
class内的方法:
getFields(),getDeclareFields(),getMethods(),getConstructors();
11.java中的泛型
classpublic class pair{} public class pair {}
方法
public staticT getmiddle(T[] a)
<T>放在修饰符的后面,返回类型的前面。
泛型限定:
例如:
&分割限定类型,限定类型可以有类,但是类必须是第一个限定符。
无论何时定义一个泛型类型,都会提供一个对应的原始类型。原始类型对应的名字就是删去类型参数后的泛型类姓名。擦出类型变量,替换为限定类型。
如:
<T extends Compareble & Serializable> T替换为Compareble
getclass(),返回的是原始类型。
所以ArrayList<String>,和ArrayList<Double>的getclass方法都是返回一样的ArrayList.class
禁止使用参数化类型的数组,如:pair<String>[] name=new pair<String>[10];
泛型不能new,不能做数组。
泛型的通配符,如:public static void printBuddies(Pair<? extends Employee> p)
另外一种形式:
Pair<? super Manager>表示限定为Manager的所有超类型