static_final_instanceof_equals关键字的解析

1.static关键字:这个关键字修饰的是静态的成员。我们知道静态的成员是从属于类的,不是某个对象私有。所有对象都可以访问和使用。static修饰的代码块叫做静态代码块:这个是来初始化类的,注意,这里是初始化类,不是对象。对象的初始化由构造器完成。我们来看一段代码:

package D1;
public class test1
{
	
	public static void main(String []args)
	{
		B b=new B(10,20);
	}
	
}

class A
{
	int height;
	A(int height)
	{
		this.height=height;
		System.out.println("Height:"+height);
	}
	
	static String s=null;
	public static void prints()
	{
		System.out.println(s);
	}
	//静态初始化块
	static 
	{
		s="this is A";
		prints();
		System.out.println("A has overloaded");
	}
}
class B extends A
{
	int  length;
	static String s1=null;
    public static void printB()
    {
    	System.out.println(s1);
    }
	static 
	{
		s1="this is B";
		printB();
		System.out.println("B has overloaded");
	}
	B(int height) 
	{
		super(height);
		// TODO Auto-generated constructor stub
	}


	B(int height,int length)
	{
		super(height);
		this.length=length;
		System.out.println("B has constructed");
	}
}

 这段代码的逻辑很简单,就是一个继承的关系,但是我们通过这个就可以很清楚的明白类初始化和对象初始化的全过程。首先,我们是new一个B的对象(这里需要注意一下,一个.java文件只能有一个public类,并且与文件名相同)。JVM就要把B相关的信息加载到堆里面,但是B继承A,所以就先加载A。加载完成之后,我们就开始执行初始化,注意,这个时候是初始化类,而不是对象。类的初始化我们知道是由类的静态块完成的,所以就执行类的静态块里面的代码,开始还是执行A的静态块的代码,执行完成之后,执行B的静态块。这样,类的加载和初始化就完成了这个时候的输出是:

this is A
A has overloaded
this is B
B has overloaded

然后就是开始初始化对象了,初始化对象需要调用这个类的构造函数,这个时候的顺序和类的初始化是一样的那么就是先调用A的构造,再调用B的构造。

最后程序总得输出就是这样:

this is A
A has overloaded
this is B
B has overloaded
Height:10
B has constructed

2.这就是static关键字的一些作用了,注意好执行的顺序就行,其实这是有很强的逻辑在里面的,首先肯定是父类的操作,之后才是子类。说完这个,我们再看一下final关键字。这个关键字的作用就是:

final修饰的关键字:
final修饰变量:这个变量是一个常量
final修饰的方法:不能被重写,但是可以重载
final修饰的类不能被继承。

3.instanceof的用法:判断一个对象是不是某个类的对象,来一段简单的代码:

4.equals与==.首先,在基本数据类型上,而这并没有大的区别,但是在引用上就区别很大了。我们来一段代码:

package D1;
public class test1
{
	
	public static void main(String []args)
	{
		A a1=new A(11);
		A a2=new A(11);
		System.out.println(a1==a2);
		System.out.println(a1.equals(a2));
	}
	
}
class A
{
	
	A(int id)
	{
		this.id=id;
	}
	int id;
	public boolean equals(Object obj)
	{
		if(this==obj)
			return true;
		if(obj==null)
			return false;
		if(getClass()!=obj.getClass())
			return false;
		A a=(A)obj;
		if(id==a.id)
			return true;
		return  false;
	}
}

这段代码就很明显的体现出二者的区别了。==只是比较这两个对象的hashcode(可以理解为地址)是否相等,就是判断两个对象是不是同一个对象,但是eqals方法,我们可以重写它,让它根据对象的某个属性判断。注意,这里有一个问题,就是如果你不重写equals方法,并且你用的类也没有重写,那么equals方法和==是一样的效果(可以打开他的源码看一下,其实内部最开始的实现就是==)。

以上就是JAVA初学者比较疑惑的一些问题了,希望对你有帮助。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值