Java的方法和this关键字如何理解与应用

目录
  • 步骤 1 、给顾客增加一个吃饭的方法
  • 步骤 2 、 没有加static的属性和方法,一定需要先new对象
  • 步骤 3 、 用new出来的对象去执行eat方法
  • 步骤 4 、 怎么理解c.eat()
  • 步骤 5 、 消息接受器
  • 步骤 6 、 如果有两个顾客?
  • 步骤 7 、 答案
  • 步骤 8 、其实有个this
  • 步骤 9 、 在eat方法里面直接使用this
  • 步骤 10 、 构造方法
  • 步骤 11 、 总结:this的意义是什么?
  • 步骤 12 、 道理我都懂,那static又是什么?
  • 步骤 13 、 本节完整源码

java类的方法,我特别喜欢《java编程思想》里面的描述,这本书说java类之间的相互通信是通过消息。比如顾客类的对象调用一个eat方法,可以看成是我们向顾客类发送了一条消息,命令他去吃饭。

步骤 1 、给顾客增加一个吃饭的方法

假设我们有一个顾客类:

class Customer {
	String name;		// 客户姓名
	String sex;		//性别
	String birthDate;	//生日
	String phoneNumber;	//电话号码
        int status;	//客户状态(1:正常,2:不正常)

        void eat(){
           System.out.println("eating...");
        }

}

void代表方法没有返回值。

步骤 2 、 没有加static的属性和方法,一定需要先new对象

这是一句口诀,new的意思是新建一个对象,Customer类只是一个声明式的东西,不是真实存在的对象。
只要你没有加static,就必须要在运行的时候创建了对象,才可以使用!

说得武断一点,只要你没有加static,你要运行eat方法,就必须要new一个对象。

至于为什么,现在先不管,就这么强记一下吧。

步骤 3 、 用new出来的对象去执行eat方法

class Demo {

   public static void main(String[] args){

		Customer c = new Customer();

                c.eat();  

   }

}

运行,就可以看到eat方法被调用了。

步骤 4 、 怎么理解c.eat()

c是顾客对象的一个引用,或者叫指针。c就是一个标记,本身不会保存顾客对象的数据,但是我们操作c,就和操作顾客对象是一样的。

这行代码代表我们向这个顾客发送了一条吃饭消息,顾客很聪明的,一下子就懂了,于是他就用一个句点 . 加上eat(方法名),再打一个圆括号的方式,执行了这个方法。

这是一次成功的通讯。

步骤 5 、 消息接受器

一个类里面的方法,我们可以把它称为​​消息接收器,这样非常有利于理解。

步骤 6 、 如果有两个顾客?

问个问题,如果有两个顾客,一个叫亚瑟,一个叫安琪拉。那么他们调用的eat方法是相同的还是不同的。

如果这个出面试题,是很有区分度的。

步骤 7 、 答案

答案是相同的方法,没想到吧。
原因是类加载器把class文件加载到虚拟机,内存的划分会把类的所有方法都放到一个叫做方法区的地方。不管你new多少个对象,调用的都是同一个方法。因为如果你每new一个对象,都专门开辟一个内存空间来存放方法的话,未免也太浪费了。

现在就有一个新的问题,既然方法是同一份,我怎么知道是谁呢?

步骤 8 、其实有个this

事情的真相是这样的…
Demo.java被javac命令编译成Demo.class和Customer.class,然后运行的时候,首先是类加载器去加载Demo.class,发现还用到了Customer.class,于是顺便把Customer.class也加载了。

在这个例子中,JVM里面有两个地方需要我们关注,一个是堆,一个是方法区。

什么是堆?堆是一块存放对象的区域,你每次new一个对象,这个对象就是放在堆里面。比如有这样的代码:

class Demo {
   public static void main(String[] args){
		Customer c1 = new Customer();
		Customer c2 = new Customer();
		c1.name = "亚瑟";
		c2.name = "安其拉";
   }
}

我们new了两个对象,其中c1和c2是他们的引用,这两个对象是放在堆里面的。

而eat方法,是放在方法区,只有一份。

然后重头戏来了,当你用其中某一个对象去调用eat方法的时候,其实会传过去一个this。

c1.eat();

this会神不知鬼不觉地作为eat方法的参数,传入eat方法。
每一个对象都有一个this,this并不是你设置的某个属性,而是java给每一个类都设置的标记,你察觉不到它的存在,但是它一直都在。

步骤 9 、 在eat方法里面直接使用this

我们在eat方法里面直接使用this,就是这样的:

void eat(){
   System.out.println(this.name + " eating...");
}

效果:

其实,它的底层是这样的,虽然我们不能这么写:

void eat(this){
   System.out.println(this.name + " eating...");
}

我们在方法里面调用某个变量,这个变量要么就是参数传进来的,要么就是这个类的属性,这个你同意不?基于这个常理,这个this不是我们定义的属性,那么只能是参数传进来的。只不过,这个过程是JVM做的,我们察觉不到。

步骤 10 、 构造方法

每一个类都有构造方法,写法是这样的。

public Customer(){

}

这是空的构造方法,你不写也没事,就算不写也会有这么一个方法。构造方法的作用就是在你new对象的时候,直接调用。

记住一个口诀:

1.类名打括号 = 调用构造方法,左边一定会有个new。
2.方法名打括号 = 调用这个方法,默认传入一个this(没有static的情况)

3.方法名打括号 = 调用这个方法,不传入this(有static的情况)

​现在再回过头来看new的语句,是不是对上了?

Customer c1 = new Customer();

步骤 11 、 总结:this的意义是什么?

因为方法是独一份,所有类的对象共享这些方法,JVM为了搞清楚到底是谁去调用某个方法,就在每一个类里面维护一个this。当类被实例化(就是new的时候),这个this就指向这个对象,然后在调用方法的时候,隐式地传入this,就可以在那个方法中获取到当前真实对象的数据了。

就有点像什么呢,有点像花名。

什么叫花名,比如小区的物业会设置一个花名,他们对外会宣称,管理1-10栋的物业管家的名字是小芳,这个小芳就是花名。这是一个虚拟的名字,业主也只知道物业管家是小芳,但是小芳可能今天是张三,明天是李四。张三李四都离职了,王五成为物业管家,对外的说法也是他叫管家小芳。

物业设置管家这个职位,并不知道究竟谁来做,于是先设置好,管家就叫做小芳。小芳就相当于this,只有等到张三来任职了,这个this就是张三。张三跑路,李四来了,这个this就是李四。

步骤 12 、 道理我都懂,那static又是什么?

我们已经不止一次提到static了,static到底是啥啊,别急,下节我们来分享,先把这一节的知识点消化一下吧。

步骤 13 、 本节完整源码

class Customer {
	String name;		// 客户姓名
	String sex;		//性别
	String birthDate;	//生日
	String phoneNumber;	//电话号码
	int status;	        //客户状态(1:正常,2:不正常)

	public Customer(){

	}

	void eat(){
	   System.out.println(this.name + " eating...");
	}
}

class Vip {

}

class Demo {
   public static void main(String[] args){
		Customer c1 = new Customer();
		Customer c2 = new Customer();
		c1.name = "亚瑟";
		c2.name = "安其拉";
		c1.eat();
   }
}

视频讲解:

https://www.bilibili.com/video/BV1df4y1c7Pe/

https://www.bilibili.com/video/BV1N341127CZ/

到此这篇关于Java的方法和this关键字如何理解与应用的文章就介绍到这了,更多相关Java 方法 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java字符串的intern方法有何奥妙之处

    学习背景 进入正文学习字符串的intern()方法之前,先给下这4个问题,看下自己是否都知道答案? 1.String s1 = "a" + "b"; //创建了几个对象? 2.String s2 = new String("ab"); //创建了几个对象? 3.String s3 = new String("a") + new String("b"); //创建了几个对象? 4.String s4= new

  • Java中为什么this可以调用当前实例

    目录 1. 前言 2. 栈帧 3. 分析 4. 总结 1. 前言 在刚开始学习Java的时候,大家肯定都接触过this关键字,尤其是在构造函数赋值的时候,如下示例: public class Person { private String name; private int age; public Person(String name, int age) { // 必须加this关键字,否则无法完成成员变量的赋值 this.name = name; this.age = age; } } 在构造

  • Java杂谈之类和对象 封装 构造方法以及代码块详解

    目录 1. 类和对象的初步认知 2. 类的实例化 3. 类的成员 字段(属性/成员变量) 方法 static 关键字 修饰字段 修饰方法 修饰代码块(暂不讲) 修饰类(暂不讲) 4. 封装 5. 构造方法 6. this 用法 关于引用的几个注意事项: 7. 代码块 Java当中的类和对象 1. 类和对象的初步认知 java 是一门面向对象的语言,所谓面向对象有别于面向过程,面向对象是只需对象之间的交互即可完成任务,但是面向过程的话,需要我们将每一个步骤都详细地做出来.比如,以洗衣服为例,如果是

  • 浅析JAVA中的内存结构、重载、this与继承

    一.对象在JVM的内存结构 JAVA内存管理由JVM来管理. 1)堆,所有new出来的对象(包括成员变量) 2)栈,所有局部变量(包括方法的参数) 3)方法区,class字节码文件(包括方法,静态数据) 1.引用变量指向null时,会发生空指针异常 public class student { int age; String name; public student(int age,String name){ this.age=age; this.name=name; } public stat

  • Java基础之this关键字的使用

    一.this关键字的作用 this关键字除了可以强调本类中的方法还具有以下作用. 1.表示类中的属性 2.可以使用关键字调用本类中的构造方法 3.this表示当前对象 1.1表示类中的属性 package thiss; class Person{ private int age; private String name; public Person(int age,String name){ this.age=age;//为类中的age属性赋值 this.name=name;//为类中的name

  • Java关键字详解之final static this super的用法

    目录 1. final 关键字: 2. static 关键字: 3. this 关键字: 4. super 关键字: final,static,this,super 关键字总结 正文开始@Assassin 1. final 关键字: final 关键字,意思是最终的.不可改变的,初始化之后就不能再次修改 ,用来修饰类.方法和变量,具有以下特点: final 修饰的类不能被继承,final类中的所有成员方法都会被隐式的指定为 final 方法: final 修饰的方法不能被重写: final 修饰

  • Java的方法和this关键字如何理解与应用

    目录 步骤 1 .给顾客增加一个吃饭的方法 步骤 2 . 没有加static的属性和方法,一定需要先new对象 步骤 3 . 用new出来的对象去执行eat方法 步骤 4 . 怎么理解c.eat() 步骤 5 . 消息接受器 步骤 6 . 如果有两个顾客? 步骤 7 . 答案 步骤 8 .其实有个this 步骤 9 . 在eat方法里面直接使用this 步骤 10 . 构造方法 步骤 11 . 总结:this的意义是什么? 步骤 12 . 道理我都懂,那static又是什么? 步骤 13 . 本

  • java 中newInstance()方法和new关键字的区别

    java 中newInstance()方法和new关键字的区别 * 它们的区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类. * 那么为什么会有两种创建对象方式?这主要考虑到软件的可伸缩.可扩展和可重用等软件设计思想. * 我们使用关键字new创建一个类的时候,这个类可以没有被加载.但是使用newInstance()方法的时候, * 就必须保证:1.这个类已经加载:2.这个类已经连接了. * newInstance()实际上是把new这个方式分解为两步,即首先调用Class

  • PHP的构造方法,析构方法和this关键字详细介绍

    一.什么是构造方法    构造方法是类的一种特殊的方法,它的主要作用是完成对新对象初始化.    特点:1.    没有返回值.2.    在创建一个新的对象时,系统会自动调用该类的构造方法完成对新对角的初始化.    语法:    php5:        修饰符 function __construct() {                            //code }    php4:        修饰符 function 类名() {                    

  • 谈谈Java中Volatile关键字的理解

    volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以重获生机.volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情. 一.前言 JMM提供了volatile变量定义.final.synchronized块来保证可见性. 用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最的值.volatile很容

  • Java中的static关键字深入理解

    在学习Java以来很长一段时间,我都不能理解为什么修饰一个方法的关键字各不相同,为什么有的方法可以直接调用,而有的方法需要用对象才能调用.毫不夸张的说,最近一次让我决定去整理清楚static关键字,是因为在写jdbc工具类时,其中通过静态代码块来实现加载驱动才让我对它有了新的认识. 通俗来讲,归为几点: 由static关键字修饰的方法或成员变量,不需依赖对象,就可直接访问.(通过 类名.方法名() 或 类名.属性 直接调用) static关键字不会影响到变量或方法的作用域 static关键字不允

  • 老生常谈Java中instanceof关键字的理解

    java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. 用法: result = object instanceof class 参数: Result:布尔类型. Object:必选项.任意对象表达式. Class:必选项.任意已定义的对象类. 说明: 如果 object 是 class 的一个实例,则 instanceof 运算符返回 true.如果 object

  • java中sleep方法和wait方法的五个区别

    目录 区别一:语法使用不同 区别二:所属类不同 区别三:唤醒方式不同 区别四:释放锁资源不同 sleep 不释放锁 wait 释放锁 区别五:线程进入状态不同 总结 前言: sleep 方法和 wait 方法都是用来将线程进入休眠状态的,并且 sleep 和 wait 方法都可以响应 interrupt 中断,也就是线程在休眠的过程中,如果收到中断信号,都可以进行响应并中断,且都可以抛出 InterruptedException 异常,那 sleep 和 wait 有什么区别呢?接下来,我们一起

  • Java线程中的常见方法(start方法和run方法)

    目录 start方法和run方法 示例代码 注意 sleep方法与yield方法 sleep yield 线程优先级 sleep的应用-防止cpu占用100% join方法 有实效的等待 interrupt方法 打断正常运行的线程,不会清空打断状态 守护线程 start方法和run方法 $start()$方法用来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到$cpu$时间片,就开始执行$run()$方法.而直接调用$run()$方法,仅仅只是调用了一个类里的方法,其本质上还

  • 详解java中List中set方法和add方法的区别

    目录 前言 相同点 不同点 总结 前言 在Java中的常用的集合接口List中有两个非常相似的方法: E set(int index, E element); void add(int index, E element); 这两个方法都是在集合的指定位置插入指定的元素,那么这两个方法到底有什么区别呢?接下来我们通过ArrayList这个我们常用集合实现来看一下这两个方法的差异 相同点 首先我们来看一下这两个方法在ArrayList中的相同点 他们都会在集合的指定位置插入新的元素,例如下面的例子:

  • 学习Java的static与final关键字

    static:(静态修饰符)面向对象中static修饰的内容是隶属于类,而不是直接隶属于对象的,所以static修饰的成员变量一般称作类成员变量,而static修饰的方法一般称作类方法. 分类: 1.static变量,也叫作静态变量或者类变量.另一种是没有被static修饰的变量,叫实例变量. 2.static方法,也叫作静态方法或者类方法,静态方法中不能定义静态变量,实例方法也不能. 3.static代码块,静态块中,可以访问静态变量,调用静态方法. 注意事项: 1.static不依附于任何对

随机推荐