一个对象只声明不赋值,则只会在内存的栈区创建引用,堆中并无此引用的指向。 而null对象在堆中会被java的垃圾回收机制回收。
java中对象引用放在栈中,对象的实例放于堆中,如果为null,说明只在栈中。
同理,BookInfo bookinfo=null与BookInfo bookinfo=new BookInfo():前者,是声明了一个对象(的引用),jvm并没有开辟内存放入一个对象;而后者,在声明了一个对象的引用后,又把新开辟的没有存储任何有效值的对象的地址赋给了他
Optional<CompanyInvestorVO> first = investorVOList.stream().filter(item -> item.getInvestorName().equals("张三")).findFirst(); String investoRatio = first.get().getInvestoRatio();
获取List对象中 属性为值为张三的对象
一个对象只声明不赋值,则只会在内存的栈区创建引用,堆中并无此引用的指向。 而null对象在堆中会被java的垃圾回收机制回收。java中对象引用放在栈中,对象的实例放于堆中,如果为null,说明只在栈中。
同理,BookInfo bookinfo=null与BookInfo bookinfo=new BookInfo():前者,是声明了一个对象(的引用),jvm并没有开辟内存放入一个对象;而后者,在声明了一个对象的引用后,又把新开辟的没有存储任何有效值的对象的地址赋给了他转载于:https://www.cnblogs.com/douhuan/p/7065244.html
无论何时,一个类定义了一个虚拟方法,大多数编译器向类指定一个指向虚拟方法表(VMT或Vtable)的(虚拟)函数的指针数组添加一个隐藏的成员变量。这些指针在运行时用于适当的函数调用,因为在编译时它可能还不知道是否要调用基函数或者是从继承基类的类实现的派生类。
虚拟方法表解决方案在C++及其相关语言(如D和C#)中尤为常见。将对象的编程接口从实现分离出来的语言,像Visual Basic和 Delphi, 也可以使用虚拟表实现。因为它允许对象使用不同的实现,只需要使用一组不同的方法指针。
这边涉及到继承(多态)的知识点
举个栗子:DerivedC c2=new DerivedC();
BaseClass a1= c2; //BaseClass 基类,DerivedC是继承自BaseClass的子类
a1.play(); //play()在BaseClass,DerivedC中均有定义,即子类覆写了该方法分析:
在a1=c2的时候,仍然是存在两个句柄,a1和c2,但是a1和c2拥有同一块数据内存块和不同的函数表。
那么 :父类 对象 = new 子类()的意义就是为了实现多态(以不变应万变),其中,这句话中的父类就是为了方便找到偏移量,父类决定偏移量,子类决定方法实现,子类与父类中相同的方法与属性在各自的虚拟方法表中具有相同的偏移量。
下面,引申出作业:
class A{
public virtual void M() { Console.Write("A"); }
}
class B : A{
public override void M() { Console.Write("B"); }
}
class C : B{
new public virtual void M() { Console.Write("C"); }
}
class D : C{
public override void M() { Console.Write("D"); }
static void Main()
{
D d = new D(); C c = d; B b = c; A a = b;
d.M(); c.M(); b.M(); a.M();
}
}
客官可以先自己回答一下,最终输出相关的答案:
最终内存图如下:
在内存结构中a、b、c、d均为D类型
前两个偏移量为2,输出是D;后两者偏移量为1,输出是B(父类决定偏移量,子类决定方法实现)
运行结果为:DDBB
环境复现
在使用vue和element开发表单时,创建新对象b=原始数据a,修改b对象中的参数会导致a也被同步修改,导致页面参数有问题,具体例子如下:
var a = {'a':11,'b':22}; var b = a; b['a']= 33; console.log('a',a); console.log('b',b);
结果如下:修改b的时候,a也被影响了,同步被修改了,这也就是导致为什么页面上的元素也会影响的原因。
解决办法
使用Object.assign(target, …sources) 方法,详细可以点击查看
var a = {'a':11,'b':22}; var c = Object.assign({}, a) c['b'] = 55; console.log('a',a); console.log('c',c);
结果如下:在修改c的时候,a并未被修改,二者仅仅是值相等关系,但是设计内部再引用其他对象的修改,此方法也无法保证修改c对a无影响。