【Java】this与static关键字

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


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值