java笔记10 多态 Object类
来源:互联网 发布:淘宝与天猫的关系 编辑:程序博客网 时间:2024/06/06 01:13
1. 多态
1.1 可以理解为事物存在的多种体现形态
1.2 多态的体现
父类引用指向子类对象
例:动物中猫,狗。
猫这个对象对应的类型是猫类型:猫 x = new 猫();
同时猫也是动物中的一种,也可以把猫称为动物:动物 y = new 猫();
动物是猫和狗具体事物中抽取出来的父类型。
当父类型引用指向了子类对象的时候,就产生了多态。
1.3 多态的前提
必须是类与类有关系,继承或者实现。
通常还有一个前提:子类覆盖父类方法。
1.4 示例
public class H_0802Duotai{ public static void main(String[] args) { function(new Dog()); function(new Cat()); function(new Pig()); Animal a=new Cat(); a.eat(); //System.out.println(a.x); } public static void function(Animal a) { a.eat(); }}abstract class Animal{ int x=3; abstract void eat();//抽象方法}class Cat extends Animal{ int x=5; public void eat() { System.out.println("吃鱼");//复写 } public void catchMouse() { System.out.println("抓老鼠");//特有方法 }}class Dog extends Animal{ public void eat() { System.out.println("吃骨头"); } public void kanJia() { System.out.println("看家"); }}class Pig extends Animal{ public void eat() { System.out.println("吃饲料"); } public void gongDi() { System.out.println("拱地"); } }
结果:
吃骨头
吃鱼
吃饲料
吃鱼
1.5 多态的局限性
只能使用父类的引用访问父类中的成员
1.6 多态的好处
提高了代码的扩展性,前期定义的代码可以使用后期的内容。
2. 多态的转型
2.1 Animal a=new Cat();
转型时使用子类方法
属性还是父类属性。
2.2 向上转型。要调用猫的特有方法(catchMouse),强制转型
Cat c=(Cat)a;//a本身必须是猫
可以将父类引用进行转换,不可以将父类对象转换成子类对象
注意:多态自始至终都是子类对象在做变化。
2.3 判断类型是否符合用instanceof关键字
格式:<对象 instanceof类型> ,判断一个对象是否所属于指定的类型。
If(a instanceof Cat){}
3. 多态时成员的特点
3.1 成员变量
编译时:参考引用型变量所属的类中的是否有调用的成员变量。有,编译通过,没有,编译失败。
运行时:参考引用型变量所属的类中的是否有调用的成员变量,并运行该所属类中的成员变量。
简单说:编译和运行都参考等号的左边(父类)。
3.2 成员函数
编译时:参考引用型变量所属的类中是否有调用的函数。有,编译通过。没有,编译失败。
运行时:参考的是对象所属的类中是否有调用的函数。
简单说:编译看左边(父类有没有),运行看右边(子类复写后)。
3.3 静态函数
编译时:参考的是对象所属的类中是否有调用的函数。
运行时:参考的是对象所属的类中是否有调用的函数。
简单说:编译和运行看左边。
示例
public class H_0805Duotai{ public static void main(String[] args) { Fu f=new Zi(); f.method1(); f.method2(); //f.method3(); 编译失败,编译时先找f类型中的方法,如果没有,编译失败。 //运行时,是看newZi() 对象中的方法,没有的时候调用父类(继承) //方法:编译看左边 运行看右边 System.out.println(f.x);//结果是5,看父类 // 成员属性:多态过程中,无论编译和运行,都是参考左边。 //静态函数不会重写,谁调用谁使用。 Zi z=new Zi(); z.method1();//zi method 1 z.method2();//fu method 2 子类没有,调用父类 z.method3();//zi method 3 } } class Fu{ int x=5; void method1() { System.out.println("fu method 1"); } void method2() { System.out.println("fu method 2"); }}class Zi extends Fu{ int x=3; void method1() { System.out.println("zi method 1"); } void method3() { System.out.println("zi method 3"); }}
结果:
zi method 1
fu method 2
5
zi method 1
fu method 2
zi method 3
4. Object类
Object类:所有类的直接或者间接父类。Java认为所有的对象都具备一些基本的共性内容,这些内容可以不断的向上抽取,最终就抽取到了一个最顶层的类中的,该类中定义的就是所有对象都具备的功能。
重要方法:
1、 boolean equals(Object obj):
用于比较两个对象是否相等,其实内部比较的就是两个对象地址。
而根据对象的属性不同,判断对象是否相同的具体内容也不一样。所以在定义类时,一般都会复写equals方法,建立本类特有的判断对象是否相同的依据。
public class ObjectTest{ public static void main(String[] args){ Person p1 = new Person(20); Person p2 = new Person(20); System. out.println(p1.equals(p2)); }}class Person{ private int age ; Person( int age) { this.age =age; } //比较Person的年龄,是否是同龄人 //一般都会覆盖此方法,根据对象的特有内容,建立判断对象是否相同的依据。 public boolean equals(Object obj) { if(!(objinstanceof Person)) throw new ClassCastException("类型错误"); Person p = (Person)obj; return this .age == p.age; }}
结果: true
2、 String toString():
将对象变成字符串;默认返回的格式:类名@哈希值 = getClass().getName() + '@' + Integer.toHexString(hashCode())
为了对象对应的字符串内容有意义,可以通过复写,建立该类对象自己特有的字符串表现形式。
public String toString(){
return "person :"+age;
}
3、Class getClass():获取任意对象运行时的所属字节码文件对象。
4、int hashCode():返回该对象的哈希码值。
- java笔记10 多态 Object类
- java学习笔记-object类
- Java学习笔记Object类
- 多态Object类equals方法学习笔记ObjectDemo.java
- 多态Object类toString方法学习笔记ObjectDemo.java
- JavaSE学习笔记_6:Java-Object类
- Java 学习笔记(0x09) object类
- java笔记--day11--类object之toString()
- java笔记--day11--类object之equals()
- Java基础学习笔记--Object类
- java学习笔记(1)-Object类
- Java学习笔记(37)--Object类
- Java学习笔记【Object】
- Java基础——Java笔记——Object类
- java刷题笔记-java数组、Object类
- Java-API学习笔记---Object
- Object类学习笔记
- Java学习笔记(10)Object-Oriented Thinking
- swift struct
- DB2v9.1目录结构
- Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果
- 强引用与弱引用
- 解析mediaTypes+viewResolvers+viewResolvers+ContentNegotiatingViewResolver
- java笔记10 多态 Object类
- POJ 1017 Packets
- 欢迎使用CSDN-markdown编辑器
- swift class
- 我的MySQL使用手记
- linux常用命令
- 搭建VTK+ITK+Python系统
- mysql group by 使用技巧及其with rollup使用
- RedHat5.4安装oracle11g