关键字

来源:互联网 发布:erp软件二次开发 编辑:程序博客网 时间:2024/05/18 00:17

this关键字:

1.每个每个非静态方法(没有被static修饰的方法)都会隐含一个this引用名称,它指向调用这个方法的对象(即当前对象

2.当在方法中使用本类的非静态属性时,都会隐含的使用this名称

3.this可以看作是一个变量,而它的值就是当前对象的引用

总之,this就是当前类的引用对象,那个对象调用方法,该方法内部的this就代表那个对象

用法一:

当类中某个非静态方法的参数名跟类的某个成员变量名相同时,为了避免参数的作用范围覆盖了成员变量的作用范围,我们可以明确的使用this关键字来指定成员变量

例如:在带参构造方法中,为了见名知意我们通常使成员变量名称和形参名称相同,为了区分他们,我们就可以使用this关键字来指定成员变量:

public Student(Sting name){

 this.name=name;

}

用法二:

如果某个构造方法的第一条语句具有形式this(...),那么这个构造方法将调用本类中的其他构造方法

注意:this(...)必须是第一条语句

例如:在一个学生类(Student)中

public Student(){


}

public Student(String name)

{

  this(); //调用第一个构造方法

  this.name=name;

}

public Student(String name,int age)

{

this(name);  //调用第二个构造方法

thia.age=age;

}

注意:调用构造方法时注意,一定要有出口,否则会进入死循环



super关键字

Java类中使用super来引用父类成员

1)super可用来访问父类中定义的属性

2)super可用来访问父类中定义的成员方法

3)super(...)可用于在子类构造方法的第一行调用父类的构造方法

示例:使用super调用父类的属性

class Father{public int value=200;}class Child extends Father{public int value;public void print(){value=100;super.value=50;System.out.println(“value的值”+value);System.out.println(“super.value的值”+super.value);}

super调用父类构造方法:

创建子类对象会先调用父类的构造方法,默认调用父类的无参构造方法。若要调用父类的其他构造方法则使用super调用。

例如:

Class Father{private int n;public Father(){System.out.println(“父类无参构造”);}public Father(int n){this.n=n;System.out.println(“父类中带参构造”+n);}}class Child extends Father{private int n;public Child(){super(300); //调用父类的带参构造System.out.println(“子类无参构造”);}public Child(int n){this.n=n;System.out.println(“子类带参构造”+n);}} 

使用super关键字的注意事项:

1)当子类和父类都有同名属性时,在子类中如果要使用父类的属性则super.属性

2)super只能应用在成员方法和构造方法中,不能应用在静态方法中(和this一样)

3)如果在构造方法中使用super时必须放在第一行

4)在构造方法中this()和super()不能同时出现

易错点:当子类构造方法中没有super()时则默认调用父类无参构造,而父类中若没有无参构造则会编译错误。

this和super关键字对比




static关键字

类中static声明成员变量静态成员变量,它是该类的公用变量,对于该类的所有对象来说,static成员变量只有一份。如下图所示:


static声明方法静态方法,该方法独立于类的实例,所以也叫做类方法

静态方法只能调用本类中其他的静态成员(变量和方法)

静态方法中不能使用this和super关键字

静态成员可以通过类名(不需要实例化)或类的实例去访问

静态的特点:

1)随着类的加载而加载,随着类的消失而消失

2)优先于对象存在

3)被类的所有对象共享

静态代码块:

类中可以使用不包含在任何方法静态代码块(static block),当类被JVM(Java虚拟机)载入时,静态代码块被执行,且只被执行一次

静态代码块常被用来初始化类的静态成员变量

static{

//静态代码块内容

}

单例模式设计

1)私有化构造方法

2)在类的内部实例化该类的对象,该类的对象必须是static全局变量

3)编写获取该单例对象的static方法

单例设计模式可以保证所有的对象都访问同一个实例对象,避免了对共享资源的多重占用。

“饿汉式”单例模式:当类加载到JVM时单例对象直接创建

public class HungrySingleInstance {   // 在该类内部实例化对象private static HungrySingleInstance single=new HungrySingleInstance();// 私有化构造方法,防止外部实例化该类的对象private HungrySingleInstance(){}// 静态方法,获取单例对象public static HungrySingleInstance getSingleInstance() {return single;}}

“懒汉式”单例模式:当类加载到JVM时,并不直接创建单例对象,用户请求单例对象时,才实例化该单例对象

package single;public class LazySingleInstance {   // 在该类内部实例化对象private static LazySingleInstance single;// 私有化构造方法,防止外部实例化该类的对象private LazySingleInstance(){}// 静态方法,获取单例对象public static synchronized LazySingleInstance getSingleInstance() {if(single==null){System.out.println("第一次访问单例,创建......");single=new LazySingleInstance();}return single;}}

静态变量和成员变量的区别:

1)所属不同:

静态变量:属于类,是类变量

成员变量:属于对象。是对象变量、实例变量

2)存储位置不同:

静态变量:方法区的静态区

成员变量:堆内存

3)生命周期不同:

静态变量:随着类的加载而加载,消失而消失

成员变量:随着对象的创建而存在,对象的消失而消失

4)调用不同:

静态变量:通过类名调用,也可以通过对象名调用

成员变量:只能通过对象名调用