您的位置:首页 > 编程语言 > Java开发

【Java】this与static关键字

2013-08-25 17:58 260 查看

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块中的动作,且只会执行一次。对需要类先执行一些初始化操作的情况下,可以使用。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: