什么是面向对象
面向对象是Java的核心思想,也是我们生活中大家所习以为常的思想,只不过Java巧妙地把我们生活中的对象思想结合到了编程里,对象之间通过相互作用传递信息,实现程序开发。面向对象让我们可以更方便地开发,同时也更利于开发复杂的项目。
举个简单的例子来解释面向过程和面向对象的区别:
比如你要开车去厦门,面向过程方法打个不恰当比方:
你要打开车门,坐进车里,点火发动,不断控制油门和方向盘,跟随导航开到厦门。中间可能还涉及各种红绿灯停车,各种路况刹车,或者人累了休息会...甚至车该怎么启动,车里各部件如何运作等等...
面向对象方法打个不恰当的比方:
你有个“人”,有辆“车”,通过调用“人”对象的“驾驶的方法”,和“车”对象的“行驶的方法”,再将目的地设定为厦门,人就可以自动开车去厦门。
类和对象
Java中想要创建对象,需要先有对象的类,举个英雄联盟的例子,“艾希”是“英雄”这个类中的一个具体的对象,“技能”也是一个类,“魔法水晶箭”就是这个类中的一个具体对象。
有了类就可以创建该类的对象,Java中创建一个对象的语法是这样的:Hero hero = new Hero();
类名 对象名 = new 类名();
类中可以定义有成员属性,成员方法,一旦创建了一个该类的对象,那么该对象也拥有这些属性和方法。
对象调用属性和方法的方式:对象名.属性名 对象名.方法名
对象的内存布局
如图所示,写了一个Hero英雄类,这个类里面有名字属性,有位置属性,有等级属性。我们在main方法里写下左上角方框里那些代码,看看会发生什么。
new这个操作会在堆中开辟一个对象空间,且该空间中有name属性、position属性、level属性各自的空间,最后会将这个对象空间的地址赋给栈中的hero这个对象名,hero就是这个对象的“引用”,指向这个对象空间,但hero不是这个对象本身,对象本身就在堆中。
分别调用hero的name属性和position属性,将“艾希”“下路”分别赋给它们。由于name和position的值是字符串类型,所以“艾希”“下路”会存放在方法区内常量池中,并且有各自的地址分别赋给对象空间中name属性和position属性的位置。
将15赋给level这个属性,由于level是int数据类型,所以存放在对象的空间中。
如果我们新建一个Hero类的变量名(即引用)hero1,令hero1 = hero;也就是将hero所指向的地址赋给hero1一份,因此hero1也指向这个对象空间。当hero1调用其中的属性并修改时,通过hero访问对象属性也能发现被修改,因为对象是引用类型,hero和hero1只是这个对象的不同“代号”而已。
如果Hero类中还有一个String类型的数组属性pos,那么我们在main方法中通过hero.pos = new String[3];创建一个数组赋给hero.pos属性,相应地,也会在堆内存中开辟一个数组的空间,通过地址的方式存在对象空间内。由于该数组是String类型数组,因此每个元素都是字符串类型,也会存在常量池中。