this关键字
this关键字调用成员变量和成员方法
Java中,this关键字代表对本类对象的引用,可以用“this.成员变量”和“this.成员函数”的方式调用成员变量和成员函数
public class MainClass {
String propertyStr = "Use this";
public static void main(String[] args)
{
MainClass mainInstant = new MainClass();
mainInstant.say();
}
private void say()
{
this.print(this.propertyStr);//等价于print(propertyStr);
}
private void print(String str)
{
System.out.println(str);
}
}
一般这种情况下,this关键字可以省略。 但是当局部变量或方法参数覆盖成员变量,即与成员变量同名的时候,成员变量前必须添加this关键字予以区分。
public class MainClass {
String propertyStr = "Use this";
public static void main(String[] args)
{
MainClass mainInstant = new MainClass();
mainInstant.say();
}
private void say()
{
this.print("this关键字不能省略");
}
private void print(String propertyStr)
{
this.propertyStr = propertyStr;//this不能省略
System.out.println(this.propertyStr);
}
}
this关键字返回本类的一个对象
public class MainClass {
String propertyStr = "this返回对象";
public static void main(String[] args)
{
MainClass mainInstant = new MainClass();
MainClass instant = mainInstant.getInstant();
instant.say();
}
public MainClass getInstant()
{
return this;//返回MainClass的对象
}
private void say()
{
this.print(propertyStr);
}
private void print(String propertyStr)
{
System.out.println(this.propertyStr);
}
}
this关键字调用有参构造函数
public class MainClass {
String propertyStr;
public static void main(String[] args)
{
MainClass mainInstant = new MainClass();
MainClass instant = mainInstant.getInstant();
instant.say();
}
public MainClass()
{
this("调用有参构造函数MainClass(String str)");
}
public MainClass(String str)
{
propertyStr = str;
}
public MainClass getInstant()
{
return this;
}
private void say()
{
this.print(propertyStr);
}
private void print(String propertyStr)
{
System.out.println(this.propertyStr);
}
}
此时,this关键字只能在无参构造函数的第一句使用。
static关键字
静态变量、常量、方法
被声明为static的变量、常量和方法称为静态成员,属于类所有,静态的成员属性为类的不同对象共享。一般用“
类名.静态成员”的形式访问。“
对象.静态成员”也可以访问,但是
为了区分静态成员与非静态成员,请使用第一种形式。
public class MainClass {
private static String propertyStr = "调用静态属性";
public static void main(String[] args)
{
MainClass mainInstant = new MainClass();
MainClass.print(MainClass.propertyStr);//OK
MainClass.print("类调用静态方法");//OK
MainClass.print(mainInstant.propertyStr);//warning
mainInstant.print("对象调用静态方法");//warning
}
private static void print(String propertyStr)
{
System.out.println(propertyStr);
}
}
在elipse中用对象访问静态成员会得到警告
静态方法中不能使用this
之所以上述代码在main函数中,用new的对象来调用类的成员,而不是直接用this,是因为Java规定,static方法中不能使用this关键字。
静态方法中不能直接调用非静态方法
如果方法声明为static,那么方法体里面不能直接调用非static方法,这个时候便需要new一个对象,然后通过对象调用非static方法方法体中局部变量不能声明为static
Java中规定,在方法内部不能声明static的局部变量(
Object-C中局部变量可以声明为static)
private void print()
{
static String str = "Hello";//Error only final is permitted
System.out.println(str);
}
static定义类的初始化动作
public class HelloWorld {
static
{
//do something
}
}
这个时候static定义了一个静态区域,每次这段代码被执行时,首先执行static块中的动作,且只会执行一次。对需要类先执行一些初始化操作的情况下,可以使用。