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)调用不同:
静态变量:通过类名调用,也可以通过对象名调用
成员变量:只能通过对象名调用