java中关键字this的使用

  在团队代码中看到对于当前类中的方法,使用了this关键字。经过测试发现,在此种情况下,this关键字的使用可有可无。因此,对java中this的使用做下总结:

package testTHIS;

public class TestTHIS {

    int flag = 0;

    public static void main(String[] args) {
        Test test = new Test();
        test.main();

        TestTHIS tt = new TestTHIS();
        tt.say(); // 不能使用this.say();
    }

    public void say() {
        MyTest mt = new MyTest();
        mt.main();
        int i = this.flag;
        int k = flag;
    }
}

class Test {

    public void main() {
        say1();
        this.say1();
        say2();
        this.say2();
        say3();
        this.say3();
        say4();
        this.say4();
    }

    public void say1() {
        System.out.println("111111111111111");
    }

    protected void say2() {
        System.out.println("222222222222222");
    }

    void say3() {
        System.out.println("333333333333333");
    }

    private void say4() {
        System.out.println("444444444444444");
    }
}

class MyTest extends Test {

    @Override
    public void main() {
        this.say1();
    }
}

Java中不推荐使用this关键字的情况

  对于两种情况,必须使用关键字this。构造方法中和内部类调用外部类当中的方法,demo如下:

public class Test {
    private final int number;

    public Test(int number){
        this.number = number; // 输出5
        // number = number; 输出0
    }

    public static void main(String[] args) {
        Test ts = new Test(5);
        System.out.println(ts.number);
    }
}

  上面的示例代码展示了构造方法中使用this的情况,如果不使用会出错。此外我们可以查看JDK的源码,如String类中的多种构造方法,都使用了this关键字。此外,我倒是觉得this很多情况下只是标识作用了,比如区分一下this.name 跟 super.name 一个是自己的,一个是父类的。仅仅是为了代码可读。

public class A {
    int i = 1;
    public A(){
        // thread是匿名类对象,它的run方法中用到了外部类的run方法
        // 这时由于函数同名,直接调用就不行了
        // 解决办法: 外部类的类名加上this引用来说明要调用的是外部类的方法run
        // 在该类的有事件监听或者其他方法的内部若要调用该类的引用,用this就会出错,这时可以使用类名.this,就ok了
        Thread thread = new Thread() {

            @Override
            public void run() {
                for (;;) {
                    A.this.run();
                    try {
                        sleep(1000);
                    } catch (InterruptedException ie) {
                    }
                }
            }
        };
        thread.start();
    }

    public void run() {
        System.out.println("i = " + i);
        i++;
    }

    public static void main(String[] args) throws Exception {
        new A();
    }
}

  上述展示了匿名内部类中使用关键字this的用法,当内部类中的方法和外部类中的方法同名的时候,如果想在内部类中使用外部类中的同名方法,要用外部类.this.方法类,来显示的使用外部类中的同名方法。

时间: 2024-08-04 13:56:41

java中关键字this的使用的相关文章

Java中关键字continue、break和return的区别

Java中关键字continue.break和return的区别: continue:跳出本次循环继续下一次循环 break:   跳出循环体,继续执行循环外的函数体 return:   跳出整个函数体,函数体后面的部分不再执行 有代码才有真相: [java] view plain copy <span style="font-family:SimSun;font-size:14px;"><span style="font-family:SimSun;fon

java中关键字volatile的作用

用在多线程,同步变量. 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的是B.只在某些动作时才进行A和B的同步.因此存在A和B不一致的情况.volatile就是用来避免这种情况的.volatile告诉jvm, 它所修饰的变量不保留拷贝,直接访问主内存中的(也就是上面说的A) =========================分割线1================================= 版权声明 :转载时请以超链接形式标明文章原始出处和作者信息及本

java中关键字super

super关键字的作用 java中的super关键字是一个引用变量,用于引用父类对象.关键字“super”以继承的概念出现在类中. 主要用于以下情况:1.调用父类的方法   2.调用父类的变量  3.调用父类的构造方法 1.调用父类的方法 当我们要调用父类方法时使用.父类和子类都具有相同的命名方法,那么为了解决歧义,我们使用super关键字.这段代码有助于理解super关键字的使用情况. /* Base class Person */ class Person { void message()

【转】java中关键字volatile的作用

在Java内存模型中,有main memory,每个线程也有自己的memory (例如寄存器).为了性能,一个线程会在自己的memory中保持要访问的变量的副本.这样就会出现同一个变量在某个瞬间,在一个线程的memory中的值可能与另外一个线程memory中的值,或者main memory中的值不一致的情况. 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的是B.只在某些动作时才进行A和B的同步.因此存在A和B不一致的情况.volatile就是用来避免这种情况

转!!java中关键字volatile的作用

用在多线程,同步变量. 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的是B.只在某些动作时才进行A和B的同步.因此存在A和B不一致的情况.volatile就是用来避免这种情况的.volatile告诉jvm, 它所修饰的变量不保留拷贝,直接访问主内存中的(也就是上面说的A) =========================分割线1================================= 版权声明 :转载时请以超链接形式标明文章原始出处和作者信息及本

Java 中关键字transient引出序列化与反序列化

一:transient(临时的)关键字 1.transient关键字只能修饰变量,而不能修饰方法和类.注意,本地变量是不能被transient关键字修饰的. 2.被transient关键字修饰的变量不能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化. 3.一旦变量被transient修饰,变量将不再是持久化的一部分,该变量内容在序列化后无法获得访问.也可以认为在将持久化的对象反序列化后,被transient修饰的变量将按照普通类成员变量一样被初始化. 二:java对象序列

Java中关键字final、static的使用总结

一.final 根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量. final类不能被继承,没有子类,final类中的方法默认是final的. final方法不能被子类的方法覆盖,但可以被继承. final成员变量表示常量,只能被赋值一次,赋值后值不再改变. final不能用于修饰构造方法. 注意:父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的.

java中关键字volatile

1.用在多线程同步变量时, 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的是B.只在某些动作时才进行A和B的同步.因此存在A和B不一致的情况.volatile就是用来避免这种情况的.volatile告诉jvm, 它所修饰的变量不保留拷贝,直接访问主内存中的(也就是上面说的A) 2.在Java内存模型中,有main memory,每个线程也有自己的memory (例如寄存器).为了性能,一个线程会在自己的memory中保持要访问的变量的副本.这样就会出现同一个

Java中关键字volatile 和 synchronized 的作用和区别

volatile是变量修饰符,而synchronized则是作用于一段代码或方法:如下三句get代码: 1 int i1; 2 int geti1() {return i1;} 3 4 volatile int i2; 5 int geti2() {return i2;} 6 7 int i3; 8 synchronized int geti3() {return i3;} geti1() 得到存储在当前线程中i1的数值.多个线程有多个i1变量拷贝,而且这些i1之间可以相互不同.换句话说,另一个