avaSE学习笔记之几个关键字this、super、final、static

this:

1.        解决局部变量与成员变量同名问题

2.        解决方法参数与成员变量同名问题

3.        调用该类的另一个构造方法:在一个类的构造方法中调用另一个构造方法,可以使用this()的方式调用,括号中的参数表示目标构造方法的参数。this()必须作为构造方            法的第一条语句,this只能在非static中使用。

public class ConstructorOverload
{
    public ConstructorOverload()
    {
        this(3);
        
        System.out.println("test");
    }

    public ConstructorOverload(int i)
    {
        System.out.println(++i);
    }

    public static void main(String[] args)
    {
        ConstructorOverload col = new ConstructorOverload();


    }
}

super

1.        子类使用super()显示调用父类的某个构造方法,super()也必须作为构造方法的第一条语句。super(参数)

2.        在子类中调用父类中被覆盖的方法: super.methodName(参数)

3.          在子类中访问父类中被隐藏的成员变量: super.variableName

public class SuperTest2
{
    public static void main(String[] args)
    {
        Dog dog = new Dog();
        dog.run();
    }    
}

class Animal
{
    public void run()
    {
        System.out.println("animal is running");
    }
}

class Dog extends Animal
{
    public void run()
    {    
        super.run(); //调用父类的run方法}}

final

1.        修饰属性,表示该属性必能被改写(常量):当修饰基本数据类型时,表示值不能发生改变,当修饰引用类型时,表示该应用类型不能指向其他对象了(所指的地址不能             改变),但该引用所指向的对象的内容是可以发生变化的。

2.        修饰方法:终态方法,不能被重写(override)。

3.        修饰类:终态类,不能被继承(exetend)

public class FinalTest
{
    public static void main(String[] args)
    {
        H h = new H();
        h.output();
    }
}

class G
{
    public final void output() //不能被重写(override)
    {
        System.out.println("G");
    }
}

class H extends G
{
    public void output()
    {
        System.out.println("H");
    }
}

static

1.        修饰属性:无论一个类生成了多少个对象,所有这些对象,共同使用唯一一份静态的成员变量;一对象对该静态成员变量进行了修改,其他对象的该静态成员变量的值也             会随之发生变化。可以使用类名.方法名访问

public class StaticTest
{
    public static void main(String[] args)
    {
        /*
        MyStatic myStatic = new MyStatic();

        MyStatic myStatic2 = new MyStatic();

        myStatic.a = 10;

        System.out.println(myStatic2.a);
        */


        MyStatic myStatic = new MyStatic();

        MyStatic.a = 10;

        System.out.println(myStatic.a);
    }
}


class MyStatic
{
    static int a;
}

2.        修饰方法:静态方法只能继承,不能被子类重写。可使用类名.方法名访问

public class StaticTest3
{
    public static void main(String[] args)
    {
        M m = new N();

        m.output();
    }
}

class M
{
    public <span style="font-family: Arial, Helvetica, sans-serif;">static  </span>void output()
    {
        System.out.println("M");
    }
}

class N extends M
{
    public static void output()
    {
        System.out.println("N");
    }
}

输出j结果:M   //若不用static修饰则输出N

3.        修饰代码块

  静态代码块的作用是完成一些初始化工作。首先执行静态代码块,然后执行构造方法。 静态代码块在类被加载的时候执行,而构造方法是在生成对象的时候执行;要想调用某个类来生成对象,首先需要将类加载到 Java 虚拟机上(JVM),然后由 JVM 加载这个类来生成对象。

 类的静态代码块只会执行一次,是在类被加载的时候执行的,因为每个类只会被加载一次,所以静态代码块也只会被执行一次;而构造方法则不然,每次生成一个对象的时候都会调用类的构造方法,所以 new 一次就会调用构造方法一次

如果继承体系中既有构造方法,又有静态代码块,那么首先执行最顶层的类的静态代码块,一直执行到最底层类的静态代码块,然后再去执行最顶层类的构造方法,一直执行到最底层类的构造方法。注意:静态代码块只会执行一次。

public class StaticTest
{
    public static void main(String[] args)
    {
        new S();
        new S();
    }
}

class P
{
    static
    {
        System.out.println("P static block");    
    }

    public P()
    {
        System.out.println("P constructor");
    }    
}

class Q extends P
{
    static
    {
        System.out.println("Q static block");
    }

    public Q()
    {
        System.out.println("Q constructor");
    }
}

class S extends Q
{
    static
    {
        System.out.println("S static block");
    }
    
    public S()
    {
        System.out.println("S constructor");
    }
}

4.小结:不能在静态方法中访问非静态成员变量;可以在静态方法中访问静态的成员变量。可以在非静态方法中访问静态的成员变量。(静态的只能访问静态的;非静态的可以访问一切)

猜你喜欢

转载自www.cnblogs.com/glgod/p/9769952.html