5.2-全栈Java笔记:面向对象的特征继承 | 下
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5.2-全栈Java笔记:面向对象的特征继承 | 下相关的知识,希望对你有一定的参考价值。
上节我们聊到「Java面向对象的特征:继承」这节我们继续聊一下继承的应用。
Object类
Object类基本特性
Object类是所有Java类的根基类,也就意味着所有的JAVA对象都拥有Object类的属性和方法。如果在类的声明中未使用extends关键字指明其父类,则默认继承Object类。
【示例1】Object类
public class Person { ... } //等价于: public class Person extends Object { ... } |
toString方法
Object类中定义有public String toString()方法,其返回值是 String 类型。Object类中toString的源码为:
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); } |
根据如上源码得知,默认会返回“类名[email protected]+16进制的hashcode”。
在打印输出或者字符串连接对象时,会自动调用该对象的toString()方法
【示例2】toString()方法测试和重写toString()方法
class Person { String name; int age; @Override public String toString() { return name+",年龄:"+age; } } public class Test { public static void main(String[] args) { Person p=new Person(); p.age=20; p.name="李东"; System.out.println("info:"+p);
Test t = new Test(); System.out.println(t); } } |
示例2 重写toString方法
==和equals方法
“==”代表比较双方是否相同。如果是基本类型则表示值相等,如果是引用类型则表示地址相等是同一个对象。
Object类中定义有:public boolean equals(Object obj)方法,提供定义“对象内容相等”的逻辑。比如,我们在公安系统中认为id相同的人就是同一个人、学籍系统中认为学号相同的就是同一个人。
Object 的 equals 方法默认就是比较两个对象的hashcode,是同一个对象的引用时返回 true 否则返回 false。但是,我们可以根据我们自己的要求重写equals方法。
JDK提供的一些类,如String、Date、包装类等,重写了Object的equals方法,调用这些类的equals方法, x.equals (y) ,当x和y所引用的对象是同一类对象且属性内容相等时(并不一定是相同对象),返回 true 否则返回 false。
【示例3】equals方法测试和自定义类重写equals方法
public class TestEquals { public static void main(String[] args) { Person p1 = new Person(123,"高淇"); Person p2 = new Person(123,"高小七");
System.out.println(p1==p2); //false,不是同一个对象 System.out.println(p1.equals(p2)); //true,id相同则认为两个对象内容相同
String s1 = new String("上学"); String s2 = new String("上学"); System.out.println(s1==s2); //false, 两个字符串不是同一个对象 System.out.println(s1.equals(s2)); //true, 两个字符串内容相同 } }
class Person { int id; String name; public Person(int id,String name) { this.id=id; this.name=name; } public boolean equals(Object obj) { if(obj == null){ return false; }else { if(obj instanceof Person) { Person c = (Person)obj; if(c.id==this.id) { return true; } } } return false; } } |
super关键字
super:可以通过super来访问直接父类中被子类覆盖的方法或属性。 super仅仅表示一种继承关系,不是直接父类对象的引用。
【示例4】super关键字的使用
public class TestSuper01 { public static void main(String[] args) { new ChildClass().f(); } } class FatherClass { public int value; public void f(){ value = 100; System.out.println ("FatherClass.value="+value); } } class ChildClass extends FatherClass { public int value; public void f() { super.f(); value = 200; System.out.println("ChildClass.value="+value); System.out.println(value); System.out.println(super.value); } } |
示例4 运行效果图
继承树追溯
·属性/方法查找顺序:(比如:查找变量h)
1. 查找当前类中有没有属性h
2.依次上溯每个父类,查看每个父类中是否有h,直到Object
3.如果没找到,则出现编译错误。
4.上面步骤,只要找到h变量,则这个过程终止。
·构造方法调用顺序:
构造方法第一句总是:super(…)来调用父类对应的构造方法。所以,流程就是:先向上追溯到Object,然后再依次向下执行类的初始化块和构造方法,直到当前子类为止。
注:静态初始化块调用顺序,与构造方法调用顺序一样,不在重复。
【示例5】 构造方法向上追溯执行测试
public class TestSuper02 { public static void main(String[] args) { System.out.println("开始创建一个ChildClass对象......"); new ChildClass(); } } class FatherClass { public FatherClass() { System.out.println("创建FatherClass"); } } class ChildClass extends FatherClass { public ChildClass() { System.out.println("创建ChildClass"); } } |
示例5 运行效果图
「全栈Java笔记」是一部能帮大家从零到一成长为全栈Java工程师系列笔记。笔者江湖人称 Mr. G,10年Java研发经验,曾在神州数码、航天院某所研发中心从事软件设计及研发工作,从小白逐渐做到工程师、高级工程师、架构师。精通Java平台软件开发,精通JAVAEE,熟悉各种流行开发框架。
笔记包含从浅入深的六大部分:
A-Java入门阶段
C-手刃移动前端和Web前端
D-J2EE从了解到实战
E-Java高级框架精解
B-数据库从入
F-Linux和Hadoop
门到精通
本文出自 “12931675” 博客,请务必保留此出处http://12941675.blog.51cto.com/12931675/1942394
以上是关于5.2-全栈Java笔记:面向对象的特征继承 | 下的主要内容,如果未能解决你的问题,请参考以下文章