目录
一:Object类的定义
取得对象信息:toString()
对象比较:equals()
二:Object类与引用数据类型
接收数组数据
接收接口对象
三:修改链表
Object类是所有类的父类,也就是说任何一个类在定义时候如果没有明确的继承一个父类的话,那么它就是Object类的子类。
由于Java里面的类的继承关系一直都存在(除了Object类)
class Book extends Object{ }等价于class Book{ }
Object类是所有类的父类的好处:利用Object类可以接收全部类的对象,因为可以向上自动转型
class Book extends Object{ }//等价于class Book{ }
public class transfer {
public static void main(String[] args) {
Object obja=new Book();//向上转型(大范围父类对象被小范围子类对象实例化)
Object objb="Hello";//向上转型,接收String子类对象
Book a=(Book) obja;//向下转型,强制父类对象转换成子类对象
String b=(String) objb;//向下转型
}
}
所以如果不确定参数的实际类型,那么Object类就是最好的选择,最后强制向下转型为所需类型即可。
Object类提供了一个无参构造方法:public Object(),因为:类对象实例化时,子类构造方法一定会默认调用父类的无参构造。
理论上说:任意一个简单Java类都应该覆写Object地三个方法(一般不遵守)
方法 | 类型 | 描述 |
public String toString() | 普通 | 取得对象信息 |
public boolean equals(Object obj) | 普通 | 对象比较 |
public int hashCode() | 普通 | 取得对象哈希码 |
发现:直接输出对象和调用了toString()方法后再输出对象是一样的功能。也就是说,在输出一个对象时,不管是否调用toString(),最后都是调用toString()将对象信息转换为String进行输出。Object类的toString()默认返回的是对象的编码,但是String类覆写了toString()方法,所以输出的是:字符串的的内容。
下面Book类自己定义:toString()方法
class Book{
private String title;
private double price;
public Book(String title,double price) {
this.title=title;
this.price=price;
}
public String toString() {//覆写toString()方法
return "书名:"+this.title+";价钱:"+this.price;
}
}
public class transfer {
public static void main(String[] args) {
Book a=new Book("java开发",99.8);
System.out.println(a);
}
}
发现在进行对象输出时候,toString()是直接输出的。
class Book{
private String title;
private double price;
public Book(String title,double price) {
this.title=title;
this.price=price;
}
public boolean equals(Object obj) {
if(this == obj) {//地址相同
return true;}
if(obj == null) {
return false;}
if(!(obj instanceof Book)) {//防止向下转型出错
return false;
}
Book book=(Book) obj;//向下转型
if(this.title.equals(book.title)&&this.price==book.price) {//属性比较
return true;
}
return false;
}
}
public class transfer {
public static void main(String[] args) {
Book a1=new Book("java开发",99.8);
Book a2=new Book("java开发",99.8);
System.out.println(a1.equals(a2));//对象比较
}
}
由于Object类可以接收引用类型,也就是说可以接收引用数据类型的数据,包括数组,接口,类。
向下转型别忘了加上判断语句:对象Instanceof类名
主程序:先实例化接口对象,Object接收了接口对象a,然后Object向下转型为接口实例。(前3行)
解决:链表不能统一数据类型的问题
class Link{
private class Node{//内部类Node
private Object data;
private Node next;
public Node(Object data) {
this.data=data;
}
public void addNode(Node newNode) {//增加节点
if(this.next==null) {
this.next=newNode;
}
else {
this.next.addNode(newNode);
}
}
public Object getNode(int index) {//查询节点
if(Link.this.foot++==index) {
return this.data;
}
else {
return this.next.getNode(index);
}
}
public void setNode(int index,Object data) {//修改节点
if(Link.this.foot++==index) {
this.data=data;
}
else {
this.next.setNode(index, data);
}
}
public boolean containsNode(Object data) {//判断指定节点是否存在
if(data.equals(this.data))
return true;
else {
if(this.next!=null) {
return this.next.containsNode(data);
}
else {
return false;
}
}}
public void removeNode(Node pre,Object data) {//删除节点
if(data.equals(this.data)) {
pre.next=this.next;
}
else {
this.next.removeNode(this, data);
}
}
public void toArrayNode() {//访问数据
Link.this.ret[Link.this.foot++]=this.data;
if(this.next!=null) {
this.next.toArrayNode();
}
}
}
private Node root;//根节点
private int count=0;
private int foot;
private Object[] ret;
public void add(Object data) {//增
Node newNode=new Node(data);
if(this.root==null) {
this.root=newNode;
}
else {
this.root.addNode(newNode);
}
this.count++;
}
public Object get(int index) {//查
if(this.count
1:链表所有数据的对象类型都是Object;
2:主程序输出时:把Object对象转型为String输出即可。