Java的值引用和地址引用
Java所有的内容均是值引用
public static void main(String args[])
{
int a[]={1,2,3};
test(a);
//test(a)后,a任然是1,2,3
}
public void test(int[] b)
{
int c={0,0,0};
b=c;//将引用重新赋值
}
数组是引用类型,test()传入的是数组引用,b=c改变了数组引用,即这时b的引用一定指向c,而b的引用和a的引用是一样的,因为引用类型传入的就是引用,a应该也跟着改变,为什么却没有跟着改变?
问题出在传值的过程中,test(a)时,并不是直接把a的引用所指的实际对象传入,也就是说不是把实际的{1,2,3}传入进去,它是把a的地址复制给了b,让b也指向内存中的{1,2,3},所以说java就是值引用类型,不过它的值是复制一份地址罢了,它并没有直接引用所指向的实际内容,那么为什么如果我在test中对b的内容进行改变,a也会改变呢,因为b所指的确实是a中的实际内容,和a指向的是一样的,所以b的内容改变了,a的也会改变,但是b的引用改变了,a不会改变,因为他们俩的引用只是指向相同,互相独立,并没有联系
尽量把a,b,c这些变量看作容器,他们里面装的才是对象真实地址,他们和对象本身还是有隔阂的,他们并不是真实的对象本身
抽象类中可以没有抽象方法吗
抽象类可以没有抽象方法,但是如果你的一个类已经声明成了抽象类,即使这个类中没有抽象方法,它也不能再实例化,即不能直接构造一个该类的对象。
如果一个类中有了一个抽象方法,那么这个类必须声明为抽象类,否则编译通不过。
子类重写父类方法后,父类引用创建子类对象,该对象调用此方法时是父类的 还是子类的
package TestMENG;
public class Base {
int i = 99;
public void amethod() {
System.out.println(" Base.amethod() ");
}
Base() {
amethod();
}
}
package TestMENG;
public class Derived extends Base {
int i = -1;
public static void main(String argv[]) {
Base b = new Derived();
System.out.print(b.i);
b.amethod();
}
public void amethod() {
System.out.print(" Derived.amethod() ");
}
}
控制台打印输出: `99` Derived.amethod()
上面代码经过debug调试 效果如下
当执行到Base()方法中的 amethod()方法时 将会跳转到子类Derived.amethod()方法中。
涉及到的知识点:
1.父类的属性 不能被子类覆盖。
2.在实例化子类对象时,如果父类的实例引用了子类的对象(多态),例如:父类 实例 = new 子类()
那么该引用在调用父类的方法时遵循以下原则
2.1 该实例 可以调用父类中特有的方法。(该方法未被子类重写)
2.2 该实例如果调用父类中的方法,若该方法被子类重写,则一定调用的是在子类中重写后的该方法。
2.3 该实例不可以调用父类中没有的方法。(该方法子类特有)