zoukankan      html  css  js  c++  java
  • TIJ读书笔记05-this关键字

     

     

    概述

    两个对象同时调用一个方法,那么jvm怎么知道是哪个方法调用的呢. 我们在书写的时候会写成a.fun(1) 或者b.fun(1)如果按照更容易理解的角度来看的话,或许可以写成:
    Banana.fun(a,1)这样就更符合OOP的”发送消息给对象”的原则了. 但是java帮助我们做了很多事情,在调用每个方法的时候,默认第一个传入的参数就是调用该方法的对象的引用. 让我们可以写成a.fun(1).
    理解了函数调用的方法,那么对于this就很好理解了. this是一个特殊的引用. 它表示调用方法的那个对象.

    在一个类的内部调用该类的其他方法,可是省略this,因为编译器会自动添加”this”

    埃尔克,埃大爷说在一个类的内部调用该类的其他方法的时候,不建议写this. 因为编译器已经自动帮你做了这个事情,你还去写,你是不是傻. 但是,我还是觉得,至少看上去代码格式比较统一,而且我的eclipse的自动提示触发只保留了”.”,写this.会自动提示…既然没有什么性能上的区别,这个就看个人风格了.

    this的用法

    this代表调用方法的那个对象的引用. 理解了这一点this就可以用来做很多很神奇的事情.
    返回该对象
    比如下面这个例子这样,可以返回当前调用函数的对象.

    public class Leaf {
    int i=0;
    public Leaf increment(){
    i++;
    return this;
    }
    public void print(){
    System.out.println("i="+this.i);
    }
    public static void main(String[] args) {
    Leaf x = new Leaf();
    x.increment().increment().increment().print();
    }
    }

    this作为参数传入给一个方法
    比如这个例子

    class Person{
    public void eat(Apple apple){
    Apple peeled = apple.getPeeled();
    System.out.println("eat apple...");
    }
    }
    class Peeler{
    public static Apple peel(Apple apple){
    System.out.println("peeled...");
    return apple;
    }
    }
    class Apple{
    public Apple getPeeled(){
    return Peeler.peel(this);
    }
    }
    public class PassingThis {
    public static void main(String[] args) {
    new Person().eat(new Apple());
    }
    }

    在构造方法中调用另外一个构造方法
    在构造函数中可以去调用另外一个构造函数. 但是有一点需要注意,这种调用只能使用一次,而且必须写在起始行.

    public class PersonTest {
    private String name;
    private int age=18;
    public PersonTest() {

    }
    PersonTest(String name){
    this.name = name;
    }
    public PersonTest(String name,int age) {
    this(name);
    this.age=age;
    }
    @Override
    public String toString() {
    return "PersonTest [name=" + name + ", age=" + age + "]";
    }
    public static void main(String[] args) {
    PersonTest pt1 = new PersonTest("tom");
    PersonTest pt2 = new PersonTest("jim",20);

    System.out.println(pt1);
    System.out.println(pt2);
    }
    }

    static方法

    理解了this之后,static方法就很好理解. static方法又叫静态方法,有点像全局方法. 埃大爷的说,static方法就是没有this的方法. 也就是说不需要通过实例来调用的方法.

    这个解释简直精辟到无以附加,对埃大爷的崇拜突然如滔滔江水连绵不绝. 因为没有this,所以无法调用非静态方法.前面说了实例方法调用的时候默认第一个形参传入的是this. static方法没有传入this,那么在其中是无法调用实例方法的. 同理也没有办法调用实例变量.

    反证法,如果static方法可以调用实例方法和实例变量. 因为static方法是属于一个类的. 通过类名来调用. 那么在调用static方法的时候,很有可能根本就没有创建这个类的实例,那么问题来了. 既然没有实例,那么不可能调用到实例方法和实例变量. 所以static方法不能调用实例方法和实例变量.

    一个正常的类不应该存在过多的static方法.这玩意儿更像是一个全局方法,java中是禁止全局方法的. 但是有个特例,工具类中的方法绝大部分都应该是static.

  • 相关阅读:
    055——VUE中vue-router之路由参数的随意设置与伪静态链接地址处理:
    将PCM格式存储成WAV格式文件
    pcm、wav、amr说明
    使用ffmpeg.exe进行转码参数说明
    使用Java调用exe可执行文件
    函数和宏实现打印的增强myprintf
    va_start和va_end使用详解
    为何windows自带的文件搜索这么慢,而Everything的这么快
    clearfix清除浮动
    DISCUZ! X2.5设置仅允许QQ登录注册论坛 加固会员注册机制
  • 原文地址:https://www.cnblogs.com/thecatcher/p/5843971.html
Copyright © 2011-2022 走看看