我们回想一下,这几天我们完成一个需求的步骤:首先是搞清楚我们要做什么,然后在分析怎么做,最后我们再代码体现。一步一步去实现,而具体的每一步都需要我们去实现和操作。这些步骤相互调用和协作,完成我们的需求。
在上面的每一个具体步骤中我们都是参与者,并且需要面对具体的每一个步骤和过程,这就是面向过程最直接的体现。
那么什么是面向过程开发呢? 面向过程开发,其实就是面向着具体的每一个步骤和过程,把每一个步骤和过程完成,然后由这些功能方法相互调用,完成需求。面向过程的代表语言:C语言
当需求单一,或者简单时,我们一步一步去操作没问题,并且效率也挺高。 可随着需求的更改,功能的增多,发现需要面对每一个步骤很麻烦了,这时就开始思索,能不能把这些步骤和功能在进行封装,封装时根据不同的功能,进行不同的封装,功能类似的封装在一起。这样结构就清晰了很多。用的时候,找到对应的类就可以了。这就是面向对象的思想。
(1)是一种更符合我们思想习惯的思想;
(2)可以将复杂的事情简单化;
(3)将我们从执行者变成了指挥者,角色发生了转换;
买电脑:在买电脑的流程中,我们只关注电脑的性能和价格,而不关心电脑是怎么生产的,如何组装的,此时就是将电脑当作一个对象,而人可以有去购买电脑的操作。
洗衣服:在洗衣服的流程中,我们将衣服和人可以看作为对象,而人可以有洗的动作,衣服则是洗的对象。
(1)封装:封装是把对象的属性、操作结合在一起,构成一个独立的对象。一旦封装,内部信息对外界是隐藏的,也就象一个四周密封的房子一样,不允许直接对对象的属性进行操作,要想操作,只能通过局部接口(相当于房子的大门)。外部只能看到对象对操作的反应,而不知道对象是如何做出这一反应的。所以封装包含两个方面的含义,一个是信息隐藏,另一个局部开放。会在接下来的课程中详细学习。
(2)继承:继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。会在接下来的课程中详细学习。
(3)多态:指一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。会在接下来的课程中详细学习。
面向对象的思维方式在Java代码中表现为类的定义与对象的使用。理清类与对象的概念与关系是面向对象的重点。
类是具有相同特征(属性)和行为(功能)的一类事物的抽象。
我们将现实事物的特征抽象为类中的成员变量,现实事物的行为功能抽象为类中的成员方法。
**注意:**实际上所属关系是直接属于类的,均称为成员,如成员变量、成员方法、后边学习的成员内部类,并不单指成员变量。
public class 类名{
private 数据类型 变量名1;
private 数据类型 变量名2;
…其他成员变量
public 返回值类型 方法名(参数类型 参数名,参数类型 参数名2…){
方法体;
}
每个属性对应的get/set方法,使用this区分成员变量与局部变量
}
说明:
(1)使用class(类)来抽象一个现实生活中的事物
(2)定义成员变量对应事物的属性,一般使用private修饰,提供get/set方法
(3)定义成员方法对应事物的功能,一般使用public修饰
Java中访问修饰符public、private、protected、default范围
public: Java语言中访问限制最宽的修饰符,一般称之为“公共的”。被其修饰的类、属性以及方法不仅可以跨类访问,而且允许跨包(package)访问。 private: Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”。被其修饰的类、属性以及方法只能被该类的对象访问,其子类不能访问,更不能允许跨包访问。 protected: 介于public 和 private 之间的一种访问修饰符,一般称之为“保护形”。被其修饰的类、属性以及方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问。 **default:**即不加任何访问修饰符,通常称为“默认访问模式“。该模式下,只允许在同一个包中进行访问。
需求:声明一个人类,声明他的姓名和年龄,并声明他的行为吃。
public class Person {
private String name;
private int age;
public void eat() {
System.out.println("吃过了!");
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge (int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
类的使用非常简单,一般分为两个动作:创建对象与调用方法。
类的定义是现实事物的抽象,真正使用的是类创建的对象。通常使用对象来调用方法。
对象创建格式:
数据类型 对象名= new 数据类型();
对象方法的调用:
**无返回值:**对象名.方法名(参数);
**有返回值:**返回值类型 变量名 = 对象名.方法名(参数);
需求:声明一个人类对象,并调用姓名的set/get方法
public class PersonDemo{
public static void main(String args[]){
Person p=new Person();//产生对象
p.setName("张三");//无返回值使用方法
String s=p.getName();//有返回值使用方法
System.out.println("s="+s);//s=张三
}
}
直接定义在类中的变量称为成员变量,在面向对象思想设计上,是类的组成部分。
成员变量通常使用private修饰,阻止本类以外的其他类访问。
成员变量不能重名,局部变量不能重名,成员与局部变量可以重名,但是需要使用this区分。
使用this访问的为成员变量,直接访问的为局部。在方法内访问变量,如果没有该名称的局部变量会自动查找是否有该名称的成员变量。
正常定义成员方法时,一般是不需要添加static修饰符的。static修饰符会在后边详细简介。
成员方法一般可分为两类:
(1)没有业务的属性get/set方法,与属性对应
(2)有业务的普通方法,属于类的功能
需求:定义一个人类,他拥有成员变量(属性):姓名、年龄、性别,成员方法(行为):吃饭、睡觉、打豆豆及属性的get/set方法
<span class="hljs-comment">/*
* 定义自定义类型 Person类
*
* 属性(成员变量):姓名 String、年龄 int、性别 String
* 行为(成员方法):吃饭、睡觉、打豆豆 、为成员变量赋值/获取成员变量的值的方法
*
* private 修饰的成员(成员变量,成员方法) 让外界无法直接访问 内部可以访问
* this区分成员变量与局部变量(注意:这是定义时所展现出来的功能,其功能本质,一会单独说)
*
* 成员方法:一般不使用static修饰
* 分为两种:
* 1.get/set方法
* 2.属于类的功能的方法
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Person</span> </span>{
<span class="hljs-comment">//定义成员变量</span>
<span class="hljs-keyword">private</span> String name;
<span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> age;
<span class="hljs-keyword">private</span> String sex;
<span class="hljs-comment">//吃饭</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">eat</span><span class="hljs-params">()</span> </span>{
System.out.println(name + <span class="hljs-string">"吃了"</span>);
}
<span class="hljs-comment">//睡觉</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">sleep</span><span class="hljs-params">()</span> </span>{
System.out.println(name + <span class="hljs-string">"睡了"</span>);
}
<span class="hljs-comment">//打豆豆</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">hitBeanBean</span><span class="hljs-params">()</span> </span>{
System.out.println(name + <span class="hljs-string">"打了,爽了,敲代码了!"</span>);
}
<span class="hljs-comment">//为name赋值的方法:方法名:setName;参数:String name;返回值 :void</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setName</span><span class="hljs-params">(String name)</span> </span>{
<span class="hljs-keyword">this</span>.name = name;
}
<span class="hljs-comment">//获取name的值的方法:方法名;getName;参数:无;返回值:String name</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">getName</span><span class="hljs-params">()</span> </span>{
<span class="hljs-keyword">return</span> name;
}
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setAge</span><span class="hljs-params">(<span class="hljs-keyword">int</span> age)</span> </span>{
<span class="hljs-keyword">this</span>.age = age;
}
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">getAge</span><span class="hljs-params">()</span> </span>{
<span class="hljs-keyword">return</span> age;
}
<span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">getSex</span><span class="hljs-params">()</span> </span>{
<span class="hljs-keyword">return</span> sex;
}
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setSex</span><span class="hljs-params">(String sex)</span> </span>{
<span class="hljs-keyword">this</span>.sex = sex;
}
}
Person类的应用
<span class="hljs-comment">/*
* 测试Person类
*
* 导包:在同一个文件夹下不需要导包
* 创建对象:数据类型 变量名 = new 数据类型()
* 调用方法:返回值类型 新变量名 = 变量名.方法名(实际参数);
*
* 方法调用时,用static修饰的方法调用其他方法时,其他方法必须使用static修饰
* 指的是:
* 在同一个类中,直接调用其他方法时,其他方法必须使用static修饰
* 如果使用对象名.方法名()这种方式,其他方法一般不使用static修饰
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">PersonDemo</span> </span>{
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> </span>{
<span class="hljs-comment">//创建对象</span>
Person p = <span class="hljs-keyword">new</span> Person();
<span class="hljs-comment">//调用方法</span>
p.setName(<span class="hljs-string">"柳岩"</span>);
p.setAge(<span class="hljs-number">38</span>);
<span class="hljs-comment">//因为age用private修饰了 所以外界不能直接访问了</span>
<span class="hljs-comment">//p.age = -1;</span>
<span class="hljs-comment">//如果使用对象名.方法名()这种方式 其他方法一般不使用static修饰</span>
p.eat();
p.sleep();
p.hitBeanBean();
String name = p.getName();
System.out.println(name);
System.out.println(p.getAge());
<span class="hljs-comment">//main方法直接调用method方法 method方法必须使用static修饰</span>
<span class="hljs-comment">//method();</span>
}
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">method</span><span class="hljs-params">()</span> </span>{
System.out.println(<span class="hljs-string">"我是一个方法"</span>);
}
}
执行结果:
(1)在类中的位置不同。
成员变量:类中,方法外;
局部变量:方法中或者方法声明上(形式参数)
(2)在内存中的位置不同。
成员变量:堆内存;
局部变量:栈内存
(3)生命周期不同。
成员变量:随着对象的创建而存在,随着对象的消失而消失;
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
(4)初始化值的不同。
成员变量:有默认值;
局部变量:没有默认值。必须先定义,赋值,最后使用
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">VarDemo</span> </span>{
<span class="hljs-keyword">int</span> x;
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">show</span><span class="hljs-params">()</span> </span>{
<span class="hljs-keyword">int</span> y = <span class="hljs-number">0</span>;
System.out.println(x);<span class="hljs-comment">//0</span>
System.out.println(y);<span class="hljs-comment">//0</span>
}
}
类是抽象概念,对象是类的具体实例。我们通常真正使用的是某个类的实例对象,进而调用该对象的方法。
一个类可以有多个对象,一个对象只属于一个类(在讲完多态后会有不同的理解)。
可以说创建对象并调用方法是类最主要的使用方式。
我们学习编程语言,就是为了模拟现实世界的事物,实现信息化。
比如:去超市买东西的计费系统,去银行办业务的系统。
我们如何表示一个现实世界事物呢:
属性:就是该事物的描述信息
行为:就是该事物能够做什么
举例:学生拥有班级、年纪等属性,拥有上课、考试等行为
我们学习的Java语言最基本单位是类,所以我们就应该把事物用一个类来体现。
类:是一组相关的属性和行为的集合
对象:是该类事物的具体体现
举例:类 :学生 对象 :小明就是一个对象
以类作为形参,接收时,接收的是对象地址
学生类:
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Student</span> </span>{
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">study</span><span class="hljs-params">()</span> </span>{
System.out.println(<span class="hljs-string">"好好学习,天天向上"</span>);
}
}
老师类:
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Teacher</span> </span>{
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">test</span><span class="hljs-params">(Student s)</span> </span>{
s.study();
}
}
测试类:
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">TestDemo</span> </span>{
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> </span>{
Teacher t = <span class="hljs-keyword">new</span> Teacher();
Student s = <span class="hljs-keyword">new</span> Student();
t.test(s);
}
}
执行结果:
以类作为返回值,返回时,返回的其实是该类的对象地址
学生类:
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Student</span> </span>{
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">study</span><span class="hljs-params">()</span> </span>{
System.out.println(<span class="hljs-string">"好好学习,天天向上"</span>);
}
}
老师类:
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Teacher</span> </span>{
<span class="hljs-function"><span class="hljs-keyword">public</span> Student <span class="hljs-title">getStudent</span><span class="hljs-params">()</span> </span>{
Student s = <span class="hljs-keyword">new</span> Student();
<span class="hljs-keyword">return</span> s;
}
}
测试类:
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">TestDemo</span></span>{
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> </span>{
Teacher t = <span class="hljs-keyword">new</span> Teacher();
Student s = t.getStudent();
s.study();
}
}
运行结果:
**属性:**颜色(String)、品牌(String)、价格(double)、 车牌号(String)、车主(String)
行为:(1)set/get (2)运输、兜风
汽车类:
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Car</span> </span>{
<span class="hljs-keyword">private</span> String color;<span class="hljs-comment">//颜色</span>
<span class="hljs-keyword">private</span> String pinPai;<span class="hljs-comment">//品牌</span>
<span class="hljs-keyword">private</span> <span class="hljs-keyword">double</span> price;<span class="hljs-comment">//价格</span>
<span class="hljs-keyword">private</span> String number;<span class="hljs-comment">//车牌号</span>
<span class="hljs-keyword">private</span> String admin;<span class="hljs-comment">//车主</span>
<span class="hljs-comment">//运输方法:方法名:yunShu;参数:String货物;返回值:无</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">yunShu</span><span class="hljs-params">(String huoWu)</span></span>{
System.out.println(admin+<span class="hljs-string">"开着"</span>+color+pinPai+<span class="hljs-string">"价值"</span>+price
+<span class="hljs-string">"车牌号为"</span>+number+<span class="hljs-string">"的车"</span>+<span class="hljs-string">"运输了"</span>+huoWu);
}
<span class="hljs-comment">//兜风:方法名:douFeng;参数:String name;返回值:无</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">douFeng</span><span class="hljs-params">(String name)</span></span>{
System.out.println(admin+<span class="hljs-string">"开着"</span>+color+pinPai+<span class="hljs-string">"价值"</span>+price
+<span class="hljs-string">"车牌号为"</span>+number+<span class="hljs-string">"的车"</span>+<span class="hljs-string">"带着"</span>+name+<span class="hljs-string">"去兜风"</span>);
}
<span class="hljs-comment">//set/get</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setColor</span><span class="hljs-params">(String color)</span></span>{
<span class="hljs-keyword">this</span>.color = color;
}
<span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">getColor</span><span class="hljs-params">()</span></span>{
<span class="hljs-keyword">return</span> color;
}
<span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">getPinPai</span><span class="hljs-params">()</span> </span>{
<span class="hljs-keyword">return</span> pinPai;
}
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setPinPai</span><span class="hljs-params">(String pinPai)</span> </span>{
<span class="hljs-keyword">this</span>.pinPai = pinPai;
}
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">double</span> <span class="hljs-title">getPrice</span><span class="hljs-params">()</span> </span>{
<span class="hljs-keyword">return</span> price;
}
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setPrice</span><span class="hljs-params">(<span class="hljs-keyword">double</span> price)</span> </span>{
<span class="hljs-keyword">this</span>.price = price;
}
<span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">getNumber</span><span class="hljs-params">()</span> </span>{
<span class="hljs-keyword">return</span> number;
}
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setNumber</span><span class="hljs-params">(String number)</span> </span>{
<span class="hljs-keyword">this</span>.number = number;
}
<span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">getAdmin</span><span class="hljs-params">()</span> </span>{
<span class="hljs-keyword">return</span> admin;
}
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setAdmin</span><span class="hljs-params">(String admin)</span> </span>{
<span class="hljs-keyword">this</span>.admin = admin;
}
}
测试类:
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CarDemo</span></span>{
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span></span>{
Car c = <span class="hljs-keyword">new</span> Car();
<span class="hljs-comment">//调用方法</span>
c.setAdmin(<span class="hljs-string">"老王"</span>);
c.setColor(<span class="hljs-string">"绿色"</span>);
c.setPinPai(<span class="hljs-string">"三蹦子"</span>);
c.setPrice(<span class="hljs-number">250.38</span>);
c.setNumber(<span class="hljs-string">"JP74110"</span>);
c.yunShu(<span class="hljs-string">"猪"</span>);
c.douFeng(<span class="hljs-string">"柳岩"</span>);
}
}
运行结果:
**属性:**颜色(String)、品牌(String)、价格(double)
**行为:**打电话、发短信
手机类:
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Phone</span> </span>{
<span class="hljs-comment">//品牌</span>
String brand;
<span class="hljs-comment">//价格</span>
<span class="hljs-keyword">int</span> price;
<span class="hljs-comment">//颜色</span>
String color;
<span class="hljs-comment">//打电话</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">call</span><span class="hljs-params">(String name)</span> </span>{
System.out.println(<span class="hljs-string">"给"</span> + name + <span class="hljs-string">"打电话"</span>);
}
<span class="hljs-comment">//发短信</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">sendMessage</span><span class="hljs-params">()</span> </span>{
System.out.println(<span class="hljs-string">"群发短信"</span>);
}
}
测试类:
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">PhoneDemo</span> </span>{
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> </span>{
<span class="hljs-comment">//创建对象</span>
Phone p = <span class="hljs-keyword">new</span> Phone();
<span class="hljs-comment">//输出成员变量值</span>
System.out.println(<span class="hljs-string">"品牌:"</span> + p.brand);<span class="hljs-comment">//null</span>
System.out.println(<span class="hljs-string">"价格:"</span> + p.price);<span class="hljs-comment">//0</span>
System.out.println(<span class="hljs-string">"颜色:"</span> + p.color);<span class="hljs-comment">//null</span>
System.out.println(<span class="hljs-string">"------------"</span>);
<span class="hljs-comment">//给成员变量赋值</span>
p.brand = <span class="hljs-string">"锤子"</span>;
p.price = <span class="hljs-number">2999</span>;
p.color = <span class="hljs-string">"棕色"</span>;
<span class="hljs-comment">//再次输出成员变量值</span>
System.out.println(<span class="hljs-string">"品牌:"</span> + p.brand);<span class="hljs-comment">//锤子</span>
System.out.println(<span class="hljs-string">"价格:"</span> + p.price);<span class="hljs-comment">//2999</span>
System.out.println(<span class="hljs-string">"颜色:"</span> + p.color);<span class="hljs-comment">//棕色</span>
System.out.println(<span class="hljs-string">"------------"</span>);
<span class="hljs-comment">//调用成员方法</span>
p.call(<span class="hljs-string">"唐嫣"</span>);
p.sendMessage();
}
}
运行结果:
对象由new关键字创建,如同数组,实体存在于堆内存中;任何事物均可以定义成类,创建的对象,属于引用类型;
通过上图,我们可以理解,在栈内存中运行的方法,遵循"先进后出,后进先出"的原则。变量dw指向堆内存中的空间,寻找方法信息,去执行该方法。
但是,这里依然有问题存在。创建多个对象时,如果每个对象内部都保存一份方法信息,这就非常浪费内存了,因为所有对象的方法信息都是一样的。
对象调用方法时,根据对象中方法标记(地址值),去类中寻找方法信息。这样哪怕是多个对象,方法信息只保存一份,节约内存空间。
引用类型作为参数,传递的是地址值。