1、Object类
先对Object类进行简单的了解和学习: 学习类知识呢,当然还是应该看JDK文档,先看一下
也就是说所有的类都是Object类的子类 看一下主要的方法摘要:
这次的学习主要是对这两个方法进行系统性的学习
生成构造方法,父类只有Object
按住Ctrl,用鼠标点击Super,进去到Object类中,查看Object类的所有方法,这里查看所有方法也可以快捷键Ctrl+o进行查看。下图的有变就是Object类的所有方法。
基本上已经了解的差不多了,下面开始对这两个方法进行简单的学习
1、toString方法
返回的是对象的字符串的表示形式,现在创建一个类进行简单的测试。 代码:package Page25; public class People { private String name; public People(String name) { super(); this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public static void main(String[] args) { People p1=new People("张三"); System.out.println(p1.toString()); } } 结果 其实也可以这样写的
上面的直接对p1的输出的本质就是下面的调动的toString方法。我们是通过Object类中的toString方法进行输出的,而所有的类都是Object的子类,因此在这里,我可以对toString这个方法进行重写,然后再输出对象的字符串的时候,输出的就是我重写出来的新的字符串。
alt+shirt+s,弹出构造框的选择,我们选择toString方法的构造。
生成了这样一段代码。
完整版代码如下:
package Page25; public class People { private String name; public People(String name) { super(); this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } //这里其实就是重写父类的方法 @Override public String toString() { return "People [name=" + name + "]"; } public static void main(String[] args) { People p1=new People("张三"); System.out.println(p1); System.out.println(p1.toString()); } }
运行结果如下:
这里的输出显然和上面的输出不一样了,我们原本输出的是对象的字符串,但是现在输出的是这个,是因为,我们对Object类中的toString方法进行重写了,并且我们在重写构造方法的时候,继承了这个类的父类,这个类的父类就是Object,因此我们是不需要再在类名的后面extend
Object这个类了,可以直接重写这个父类中的方法,上面看到的就是重写方法之后的效果。
2、equals方法
改一下上面的People类的代码
改动之后的如下:package Page25; public class People { private String name; public People(String name) { super(); this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } //这里其实就是重写父类的方法 @Override public String toString() { return "People [name=" + name + "]"; } public static void main(String[] args) { People p1=new People("张三"); People p2=new People("李四"); System.out.println(p1.equals(p2)); } }
就是main函数中变了一下。 运行
点进这个方法看一下:
这里比较的是引用是否相同,这里的引用可以理解成指针里面学的地址,可以近似这样理解,既然比较的是引用,那么,内容一致的时候也是会false的,注意这里常量池的概念,我们是new的新对象,所以不会引进常量池的知识的。不太理解的可以看一下我对string类的相关学习,我的string类的学习。
都是false,可以看到我运行的结果,这样的结果是必然的,因为我们比较的是引用,那么,怎么改成比较的是内容呢,毕竟equals的使用,更多的时候是比较内容的,比较引用直接p1==p2就能得到我们要的效果!
现在就要把它改成比较内容了,方法很简单,就像上面的toString一样的操作,重写方法。
下面是生成的equals方法
稍微改一下重写的构造方法,不改是不行的,不改还是用的对引用的比较。
这里虽然是向下转型,但是这里的People是知道的,因此是安全的,一般情况下别向下转型。
下面是改完之后的运行效果
People的源代码如下:
package Page25; public class People { private String name; public People(String name) { super(); this.name = name; } @Override public boolean equals(Object obj) { String name = ((People)obj).getName(); return this.name==name; } public String getName() { return name; } public void setName(String name) { this.name = name; } //这里其实就是重写父类的方法 @Override public String toString() { return "People [name=" + name + "]"; } public static void main(String[] args) { People p1=new People("张三"); People p2=new People("李四"); People p3=new People("张三"); System.out.println(p1.equals(p2)); System.out.println(p1.equals(p3)); System.out.println(p1==p2); System.out.println(p2==p3); } }
2、instanceof关键字
主要作用是判断一个对象是否属于一个类
返回的是boolean类型的值。
1、创建一个父类的对象和两个子类的对象,然后分别用两个子类继承父类,然后在测试类中进行测试。 如下: 动物父类
package page25;public class Animal { public void say() { System.out.println("我是一个动物!"); } } 子类猫 package page25; public class Cat extends Animal{ //重写一下父类的方法 public void say() { System.out.println("我是一只猫!"); } }
子类狗 package page25;
public class Dog extends Animal{ //重写一下父类的方法 public void say() {
System.out.println(“我是一只狗!”); } }测试类
package Page25; public class Test { public static void main(String[] args) { Animal dog=new Dog(); //主要用于向下转型的时候的判断,向下转型是不安全的 System.out.println("dog是否属于animal类:"+(dog instanceof Animal)); System.out.println("dog是否属于Dog类:"+(dog instanceof Dog)); System.out.println("dog是否属于Cat类:"+(dog instanceof Cat)); } }
运行效果
这个类主要用于转型的时候,我写的多态的知识的时候里面有提到,可以去简单的看一下,转型其实和强转是一个道理,向上转,没毛病,向下转,可能出现数据丢失,和你把一碗水倒进一个盆子一样,盆子肯定装的下,但是你把一盆水倒进碗里,那就会出现问题了。
这个是多态学习的:多态学习