java作为一种面向对象编程的语言,至今非常火热,我学习了一段时间发现自己并没有什么进步,在这里记录一些学习的东西;
java的new过程:
Pet pet = new Pet();
上面的代码产生了一个新的对象pet,其中pet为引用,存储的内存中实例对象的地址,左侧的Pet说明对象的类型,右侧的new过程则是分配内存空间,并产生对象实例。
看过程就是简单的赋值: String pet = “pet_Object”;
将右侧的值赋给左侧的类型为String的引用pet;
这样的话,不难以理解,右侧是一个完整的实例,通过Pet()构造出来的完整对象,Pet pet = new Pet();将右侧的对象赋给左侧,在这个赋值的过程中,左侧的类型对这个实例进行验证,这个验证过程有三种情况:
1)右侧的实例和左侧的类不符,并且不存在任何关系,那么JVM就会报错;
2)右侧的实例和左侧的类符合,编译成功;
3)右侧的实例和左侧的类并不符合,但是右侧的实例所对应的类是左侧类型的子类,这时候就会发生“向上转型”的情况,编译成功,虽然这时候子类中的特定方法不能使用,但是在对pet实例进行“向下转型”,就可以调用子类中的特殊方法;
上面的过程中依然有很多的疑问:1、这个new的过程中产生的实例在对象中是如何存储的;2、方法体的存储问题;
网上关于new的资料很多,很多都说,等号左侧的类是模板,经过我的验证,并非如此;
eg:
public static void main(String[] args){ String str = "cat"; Pet cat = new Cat(str); cat.eat(); Cat cat1=(Cat)cat; System.out.println(">>>>>>"+cat1.getCat()); }结果:This is Cat's constructed function This is Cat,it's the children >>>>>>cat
上面的代码中,Pet类中并没有任何的属性值,但是依旧保存了字符串,也就是说这个是先有的实例,然后实例赋值给了cat;