面向对象基础
对象创建
Book b = new Book();
Book a = b;
Book a = b并不是将b这个对象的值赋给a,对象在创建时只创建了一个,a和b都是该对象的“名字”,对a进行属性的更改也会影响到b;比如此时将a.name = “111”,调用b.showname,控制台上也会显示"111"
联系栈和堆更深刻地解释对象创建时这一现象的原因
首先声明栈和堆的基本概念,栈中存放的是基本数据类型和引用数据类型的引用值,例如int a =1,a和1都是直接存储在栈中的,而引用数据类型,例如Book b = new Book(),存放的是b这个对象名称和其内容的地址
对象在创建时,名称存放在栈中,而属性存放在堆内存中;堆内存中的垃圾回收由GC完成,当栈中不存在对堆内存中数据的引用时,GC会自动清理回收这部分内存
Book b1 = new Book();
b1.name = "aaa";
Book b2 = new Book();
b2.name = "bbb";
b1 = b2;
这段代码执行到b1=b2时,b1.name=“aaa”;这部分内容在堆内存中,因为已经没有任何对象名称对其引用,因此会自动释放
因此Book a = b;这条语句实际上只是将b引用的地址赋给了a,当用a对象调用方法时,改变的仍然是该地址对应的堆内存里的内容
Book b1 = new Book();
对象创建时会自动生成无参数的构造方法,因此即使不定义无参方法,这段代码也不会出错;但编码规范还是建议自行定义无参方法和全参方法
方法重载
方法是否构成重载需要满足以下几个条件:
1、方法名称相同
2、参数列表长度 或 参数列表类型 或 参数列表顺序不同
与返回值类型无关!!与返回值类型无关!!与返回值类型无关!!
匿名对象
不创建对象,仅使用一次
new Book().方法
多次使用开辟多个内存空间,彼此之间毫无关联