对于属性修饰符,它可以是public,protected.private.static,final,其中public.protected.private三个最多只能出现一个,可以与static.final组合起来修饰属性;对于方法修饰符,它可以是public,protected.private.static,final,abstract其中public.protected.private三个最多只能出现一个;abstract.final最多只出现其中一个,它们可以与static.修饰方法。对此我们认识static,this,对象引用之间的关系有助于深入了解类和类的单个实例对方法、属性的调用规则。
1.关于static的一些特点:
static 是一个特殊的关键字,它可以修饰方法,属性等成员,由于在英文中是静态的意思,因此把用static修饰的属性和方法称为静态属性和静态方法,把不用static修饰的属性和方法称为非静态属性和非静态方法;
static修饰的成员表明它属于这个类共有的,而不属于该类的单个实例,故把static修饰的也称为类属性,类方法。不使用static修饰的普通方法、属性则属于该类的单个实例,而不属于该类,因此把不使用static修饰的属性和方法也称为实例属性、实例方法;既然static修饰的方法和属性是属于这个类共有,那么它们既可以通过类来调用,也可以通过实例来调用,没有static修饰的普通方法和属性,则只能通过实例来调用。
2.关于this的一些特点:
- this关键字是一个对象的默认引用,它总是指向调用该方法的对象。根据this出现位置的不同,this作为对象的默认引用有两种情况:
1.构造器中引用该构造器执行初始化的对象;
2.在方法中引用调用该方法的对象。
没有static 修饰时 的方法
public class Dog
{
//定义一个jump方法,属于普通方法
public void jump()
{
System.out.println(""正在执行jump方法!")
public void run()
{
Dog d= new Dog();
d.jump();
System.out.println("正在执行run方法");
}
}
}
public class TestDog
{
pubilc static void main(String[] args)
{
//创建Dog对象
Dog dog = new Dog();
dog.run();
}
}
此方法可以实现在run方法中调用jump方法,但是不是最好的方法,因为上面产生两个Dog对象,一个是在run方法中,d的引用变量指向该Dog对象,一个是在main方法中,dog的引用变量指向该类Dog对象。
问题1:在run方法中调用jump方法时是否一定需要Dog对象?
答案是一定,因为没有使用static修饰的属性和方法使用对象来调用。
问题2:是否需要重新创建一个Dog对象呢?
答案是否定的,因为当程序调用run方法时,一定会提供一个Dog对象,这样就可以直接使用这个已经存在的Dog对象,而无需重新创建新对象了。
以上总结,我们要想在run方法中获得该方法的对象,通过this关键字可以满足,在没有static 修饰时,方法之间的调用需要通过单个实例对象来获得,this就相当于该方法的对象,这样的理论是一致的。
- this可以代表任何对象,当this出现在某个方法中时,它所代表的对象是不确定的,但它的类型是确定的,它所代表的的对象只能是当前类;只有当这个方法被调用 时,它所代表的的对象才被确定下来:谁在调用这个方法,this就代表谁。
由于对象的一个方法依赖于另一个方法的情形很常见,故java允许对象一个成员直接调用一个对象,上面的run方法可以直接调用。这样符合this作为对象的默认引用(在方法中引用调用该方法的对象)这一理论,所以可以省略this前缀。
public void run()
{
jump();
System.out.println("正在执行run方法");
}
3.static,this,类,类的单个实例(对象)
static修饰的方法,是使用类来调用该方法,如果在static修饰的方法中使用this关键字,则这个关键字就无法指向适合的对象,所以static修饰方法中不能使用this引用。由于static修饰的方法不能使用this引用,所以修饰的方法不能访问不使用static修饰的普通成员。这与前面所指的静态成员不能访问非静态成员的结论完全一致。
- 如果确实要在静态方法中访问另外一个普通方法,则只能重新创建一个对象。如下代码:
public class StaticAccessNonStatic
{
public void info()//为普通方法
{
System.out.println("简单的info方法!");
}
public static void main(String[] args)
{
new StaticAccessNonStatic().info();
}
}
- 如果构造器中有一个与属性同名的局部变量,又必须在构造器中访问这个被覆盖的属性,则必须使用this。如下代码:
pubic class ThisInConstructor
{
//定义一个名为foo的属性
public int foo;
public ThisInConstructor()
{
//在Test构造器里定义一个foo变量
int foo = 0;
//使用this 代表此构造器进行初始化的对象
//下面的代码会把刚才创建的对象的foo属性设置为6
this.foo = 6;
}
public static void main(String[] args)
{
//所有使用ThisInContructor创建的对象的foo属性
//都将被设为6,所以下面的代码将输出为6。
System.out.println(new ThisInContructor().foo);
}
}
如果访问权限允许,类里定义的方法和属性都可以通过类或者实例来调用。类或者实例访问方法或者这属性的语法是:类.属性|方法,或者实例.属性|方法,在这种方式中,类或者实例是主调者,用于访问该类或者该实例的指定属性或者方法。
关于 this,非static成员,类的单个实例(实例属性和方法),static,类(类属性和类方法),它们之间有很微妙的关系,所以我们细细理解。