Java 基础知识汇总 - 02

本文深入探讨了Java中的重要概念,包括==与equals的区别、静态变量与实例变量的特点、int与Integer的不同之处、Math类中的常用方法、空指针异常的避免、访问修饰符的作用域、方法重载与重写的区别、构造函数的特性等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.== 和 equals 究竟有什么区别?

1)==是比较两个变量的值是否相等或者,要比较两个基本类型的数据或者两个引用变量是否相等,就要使用==

2)如果一个变量指向的数据是引用类型的,那么就涉及到两块内存,对象本身占一块内存(堆内存),变量也要占一块内存。比如StringBuilder builder = new StringBuilder(),这里builder要占用一块内存,new StringBuilder()也要占用一块内存,builder里面存储的值是new StringBuilder()内存的首地址。如果要比较两个变量是否指向同一个对象,即要看两个变量对应的内存中的数值是否相等,这时候需要使用==,equals是用来判断两个独立对象里面的内容是否相同,比如String str1 = new String("str"); String str2 = new String("str"); 由于str1 和 str2 指向两个不同对象,内存地址不同,所以str1==str2 返回false,但是str1和str2里面的内容是相同的,所以str1.equals(str2)返回true.

指的注意的是:一个类如果没有定义自己的equals方法,那么将集成Object的equals方法,Object类的equals方法实现是使用==进行比较的。

boolean equals(Object o){
      return this == o
}

对于字符串这种非基本类型的比较,判断两个对象内容是否相同不能使用==,只能使用equals.如果你要比较两个引用类型,必须自己重写Object的equals方法!

2.静态变量和实例变量

1)静态变量前加static关键字,实例变量前不加。

2)静态变量是属于类的,实例变量是属于类的实例的。对于静态变量来说,类还没有实例化的时候就已经为其分配了内存,而实例变量必须在类实例化之后才能分配内存。无论创建多少类的实例,都只有一份静态变量的内存,而实例变量的内存随着实例的创建而创建。

3.static方法能否调用非static方法?

答:不能,非static方法是和类的实例相关联的,而static方法跟类的实例没关系。static方法在类还没有初始化时即可创建,调用非static方法,无法确定是调用哪个对象的非static方法。

4.int和Integer的区别

int 是java中8个原始基本数据类型之一,而Integer是基于int的封装类。int默认值是0,而Integer的默认值是null,所以,Integer可以区分未赋值和赋值的区别,但是int是无法区别的。(类似于.NET中的int?这种形式)为表单设计数据类型时,最好使用Integer,因为可以区别赋值情况。Integer封装了很多与整数相关的操作方法,比如将字符串转化为整数,还定义了整数的最大值和最小值常量。

5.Math中的ceil,floor和round

ceil的意思是"天花板",即向上取整数。floor的意思是地板,即向下取整,round意思是四舍五入。Math.Round(11.5) = 12; Math.Round(-11.5) = -11.

6.注意空指针

如下代码不妥:

public static void main(String[] args) {
	String username = null;
	if(username.equals("justin")){
		System.out.print("yes");
	}
	else{
		System.out.print("no");
	}
}

这个错误不会在编译时出现,但是会在运行时出现,因为null无法调用equals。正确做法如下:

public static void main(String[] args) {
	String username = null;
	if("justin".equals(username)){
		System.out.print("yes");
	}
	else{
		System.out.print("no");
	}
}

7.public,private,friendly和 protected的作用域

一图胜千言!


8.overload和override的区别

overload是重载,一个类中有多个同名的方法,但是参数列表不同。overload允许返回类型不同。

public class Hello {
	
	public static void main(String[] args) {
		System.out.println(Add(2));
		System.out.println(Add(2,3));
		System.out.println(Add(2,3,4));
		System.out.println(Add(2d,3d,4d));
	}
	
	private static int Add(int x){
		return x + 2;
	}
	
	private static int Add(int x,int y){
		return x + y;
	}
	
	private static double Add(double x,double y,double z){
		return x + y + z;
	}
	
	//private static int Add(double x,double y,double z){
		//return 10;
	//}
	
	private static int Add(int x,int y,int z){
		return x + y + z;
	}
}

输出结果:

4
5
9
9.0

代码里面有个注释掉的方法,参数列表和类型相同,返回类型不同,这样是不行的,因为编辑器根本不知道调用哪个方法!

override是子类重写父类的方法,通常父类的这个方法没有实现,或者实现很简单,需要子类根据需要个性化进行定制。被重写(覆盖)的方法不可以为private的,否则是重新定义,因为子类不可以访问父类的private方法,子类重写后的可访问程度必须>=父类,比如父类为protected,子类需要为protected或者public。

public class Hello {
	
	public static void main(String[] args) {
		Person p = new Employee();
		p.Print();
	}
}

class Person
{
	protected void Print(){
		System.out.println("I am a person.");
	}
}

class Employee extends Person{

	@Override
	protected void Print() {
		// TODO Auto-generated method stub
		super.Print();
		System.out.println("I am a employee too!");
	}	
}

输出结果:

I am a person.
I am a employee too!

9.构造函数能否被override?

构造函数不可以被override(覆盖重写),但可以被重载!子类可以调用父类的构造函数来实现自己的构造函数。

class Person
{
	private String name;
	Person(String name){
		this.name = name;
	}
}

class Employee extends Person{

	Employee(String name) {
		super(name);
		// TODO Auto-generated constructor stub
	}
}


 


 

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值