Object类、包装类

Object类
在java中一切都是继承关系,以下代码:

public class ObjectDemo01 {
}

如上如果一个类没有明确指定继承哪个类,那么默认都是继承Object类。即:

public class ObjectDemo01 extends Object {
}

所有任何类对象都可以使用Object进行接收。

package com.smw.objectdemo;
class Person2 extends Object{
}
public class ObjectDemo02 {
	public static void main(String[] args) {
		Object obj1 = new Person2();
		Object obj2 = "Hello";
	}
}

那么对于Object接收来讲,不光可以接收类的引用,只要是引用数据类型都可以使用Object类接收。如下接收接口:

package com.smw.objectdemo;
interface National{}
class Person3 extends Object implements National{
}
public class ObjectDemo03 {
	public static void main(String[] args) {
		National na = new Person3();		//子类为借口实例化
		Object obj = na;		//Object接收借口实例
		National temp = (National) obj;
	}
}

如下接收数组:

package com.smw.objectdemo;
public class ObjectDemo04 {
	public static void main(String[] args) {
		int i[] = {1,2,3,4,5};		//定义一个数组
		Object obj = i;			//使用Object接收数组
		int x[] = (int[])obj;	//向下转型
		for (int j = 0; j < x.length; j++) {
			System.out.print(x[j]+"、");
		}
	}
}

Object类的功能不止于此,对于一个完整的类来讲,应该覆写Object中以下三个方法:
toString():对象打印是调用 public String toString()
equals():对象比较时调用,实际上String类就已经覆写好了此方法
public boolean equals(Object obj)
hashCode():暂时不看
先看toString()方法:

package com.smw.objectdemo;
class Person5{
	public String toString(){
		return "Hello";
	}
}
public class ObjectDemo05 {
	public static void main(String[] args) {
		System.out.println(new Person5());
	}
}

发现此时直接输出对象时,实际上就是调用了类中的toString方法,因为此方法被子类覆写了,所以最终调用的是覆写过的方法。
也就是说toString是表示对象信息的。

package com.smw.objectdemo;
class Person6{
	private String name;
	private int age;
	public Person6(String name, int age) {
		this.name = name;
		this.age = age;
	}
	public String toString(){
		return "姓名:"+this.name+","+"年龄:"+this.age;
	}
}
public class ObjectDemo06 {
	public static void main(String[] args) {
		System.out.println(new Person6("傻逼波", 38));
	}
}

在Object类中标准的对象比较方法就是equals方法,那么如果要进行对象比较,在系统中找的也是equals方法。
package com.smw.objectdemo;
class Person7{
	private String name;
	private int age;
	public boolean equals(Object obj){	//完成对象的比较操作
		if (this == obj) {		//两个地址相等
			return true;
		}
		if (!(obj instanceof Person7) ) {	//不是同一个类型
			return false;
		}
		Person7 per = (Person7) obj;
		if (this.name.equals(per.name) && this.age == per.age) {
			return true;
		}else{
			return false;
		}
	}
	public Person7(String name, int age) {
		this.name = name;
		this.age = age;
	}
	public String toString(){
		return "姓名:"+this.name+","+"年龄:"+this.age;
	}
}
public class ObjectDemo07 {
	public static void main(String[] args) {
		System.out.println(new Person7("傻逼波", 38).equals("Hello"));
	}
}

Object可以接收任意类型的对象引用。
匿名内部类
内部类:在类的内部还有一个类。
以下正常代码:

package com.smw.nonamedemo;
interface A{
	public void fun();
}
class B implements A{
	public void fun() {
		System.out.println("Hello World");
	}
}
class X{
	public void fun1(A a){
		a.fun();
	}
	public void fun2(){
		this.fun1(new B());
	}
}
public class NoNameDemo01 {
	public static void main(String[] args) {
		new X().fun2();
	}
}

假如B类只是用一次,那么有必要将其定义成一个单独的类吗?
此时就可以使用匿名内部类:

package com.smw.nonamedemo;
interface A{
	public void fun();
}
class X{
	public void fun1(A a){
		a.fun();
	}
	public void fun2(){
		this.fun1(new A(){
			public void fun() {
				System.out.println("Hello World");
			}
		});
	}
}
public class NoNameDemo01 {
	public static void main(String[] args) {
		new X().fun2();
	}
}

在一般的java开发中,匿名内部类 比较少见,只有以下两种情况系常见:
java的图形界面
Spring开发框架
包装类
在java中提倡:一切皆对象,但是这样一来就会出现矛盾点,数据类型分为基本数据类型和引用数据类型。基本数据类型是类吗?
为了解决这样的矛盾,在java中针对八种数据类型,设置了八个包装类,以类的形式表示出基本数据类型。

基本数据类型包装类
intInteger
charCharacter
byteByte
shortShort
longLong
doubleDouble
floatFloat
booleanBoolean

这八种包装类中实际上分为以下两组:
数值型: Integer,Byte,Short,Double,Long,Float
都是Number的子类。
其它类型:Character,Boolean

以上方法的返回值都是基本数据类型。
在包装类的操作中存在装箱和拆箱操作:
装箱操作:将基本数据类型变为包装类称为装箱操作。
拆箱操作:将包装类变为基本数据类型称为拆箱操作。
Integer例子:

package com.smw.integerdemo;
public class IntegerDemo01 {
	public static void main(String[] args) {
		int i = 10;
		Integer i2 = new Integer(i);	//装箱操作
		int j = i2.intValue();		//拆箱操作
		System.out.println(j*j);
	}
}

Float例子:

package com.smw.integerdemo;
public class FloatDemo01 {
	public static void main(String[] args) {
		float i = 10.3f;
		Float i2 = new Float(i);	//装箱操作
		float j = i2.floatValue();		//拆箱操作
		System.out.println(j*j);
	}
}

以上的做法是JDK 1.5之前的,在JDK 1.5之前,所有的数据必须进行手工的装箱和拆箱操作。而且包装类本身不能进行任何的数学运算。
但是在JDK 1.5之后增加了许多新特性,例如:foreach,可变参数,自动装箱,拆箱操作。

package com.smw.integerdemo;

public class IntegerDemo02 {
	public static void main(String[] args) {
		int i = 10;
		Integer i2 = i;	//自动装箱操作
		int j = i2;		//自动拆箱操作
		System.out.println(j*j);
	}
}

实际上通过包装类也能取得最大值和最小值。

package com.smw.integerdemo;
public class IntegerDemo03 {
	public static void main(String[] args) {
		System.out.println(Integer.MAX_VALUE);
		System.out.println(Integer.MIN_VALUE);
	}
}

对于包装类来讲,虽然自动装箱和拆箱是一个很重要的特点,但重要的特点还有一个:
将字符串转化为基本数据类型。
范例:将字符串变为int类型。
方法:public static int parseInt(String s)

package com.smw.integerdemo;
public class IntegerDemo04 {
	public static void main(String[] args) {
		String str = "123";
		int i = Integer.parseInt(str);
		System.out.println(i++);
	}
}

注意:要转换的字符串必须是由数字组成,不能有非数字。
既然可以将字符串变为int型数据,也可以变为float数据。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值