Java思考篇

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   该实例不可以调用父类中没有的方法。(该方法子类特有)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值