JAVA基础9-多态性

	System.out.println(animal.kind);

	//未知 表示只能调用父类中属性

}

}

class Animal{

String kind="未知";

public void eat(){

    System.out.println("吃");

}

public void walk(){

    System.out.println("跑或走");

}

}

class dog extends Animal{

String kind="dog";

public void eat(){

    System.out.println("吃骨头");

}

public void shout(){

    System.out.println("汪!汪!汪!");

}

}




[]( )虚拟方法调用(多态情况下)

================================================================================



1.  子类中定义了父类同名参数的方法,在多态情况下,将此时父类的方法称为虚拟方法

2.  父类根据赋给它子类不同,动态调用子类的方法,该方法在编译期无法确定

3.  理解多态在编译时不确定,只有在运行时才确定



import java.util.Scanner;

public class AnimalEatTest {

public static void main(String[] args) {

    AnimalEatTest animalEatTest=new AnimalEatTest();

    Scanner scan=new Scanner(System.in);

    System.out.print("输入0-2");

    int index = scan.nextInt();

    switch (index){

        case 0:

            animalEatTest.show(new dog());

            //这里我们传参时不确定的,编译时并不知道结果是什么,只有当拿到输入信息才能确定是什么动物吃东西

            break;

        case 1:

            animalEatTest.show(new cat());

            break;

        case 2:

            animalEatTest.show(new cattle());

    }

}

public void show(Animal animal){

    animal.eat();

}

}

class Animal{

public void eat(){

    System.out.println("吃");

}

}

class dog extends Animal{

public void eat(){

    System.out.println("吃骨头");

}

}

class cat extends Animal{

public void eat(){

    System.out.println("吃鱼");

}

}

class cattle extends Animal{

public void eat(){

    System.out.println("吃草");

}

}




[]( )instanceof操作符

================================================================================



1.  有了对象多态性后,内存中实际是加载了子类中声明的属性和方法,但由于声明的是父类类型,所以不能调用

2.  使用子类特有的属性和方法需要向下转型使用强制类型转换(跟数据类型转换相似)

3.  示例:



public class PersonTest {

public static void main(String[] args) {

    Person p1=new Man();

    p1.eat();

    //大口吃

    Man m1=(Man)p1;//这里通过强制类型转换成Man类型,就可以调用man中自己定义的方法了

    m1.getMoney();

    //挣钱

}

}

class Person{

public void eat(){

    System.out.println("吃");

}

}

class Man extends Person{

public void eat(){

    System.out.println("大口吃");

}

public void getMoney(){

    System.out.println("挣钱");

}

}




4.  当类型转换时可能出现异常ClassCastException(类型转换异常),可以通过instaceof判定是否可以强转

5.  语法:a instaceof A (判断对象a是否是类A的实例)

6.  示例:



public class PersonTest {

public static void main(String[] args) {

    Person p1=new Man();

    p1.eat();

    //大口吃

   if(p1 istanceof Man){//这里执行判定防止出错

   		 Man m1=(Man)p1;//这里通过强制类型转换成Man类型,就可以调用man中自己定义的方法了

    	 m1.getMoney();

    	 //挣钱

   }

  

}

}

class Person{

public void eat(){

    System.out.println("吃");

}

}

class Man extends Person{

public void eat(){

    System.out.println("大口吃");

}

public void getMoney(){

    System.out.println("挣钱");

}

}




[]( )Oject类的使用

============================================================================



1.  Object类是所有JAVA类的根父类,当类中没有extends指明其父类时,默认为java.lang.Object类

2.  Object没有属性,并只声明了一个空参构造器

3.  equals()方法

    *   Object类中equals()与 ==是相同的,都是比较对象地址值是否相同

    *   但String,Date,File,包装类等重写了Object类中equals()方法,比较的两个对象实体内容是否相同

4.  重写equals()



public class CustomerTest {

public static void main(String[] args) {

    Person2 p1=new Person2("jack",20);

    Person2 p2=new Person2("jack",20);

    System.out.println(p1 == p2);

    //false

    System.out.println(p1.equals(p2));

    //true

}

}

class Person2{

String name;

int age;

public Person2(String name,int age){

    this.name=name;

    this.age=age;

}

public boolean equals(Object object){

    if(this == object){//地址是否相同

        return true;

    }

    if(object instanceof Person2){

        Person2 p2=(Person2) object;

        return this.age == p2.age && this.name.equals(p2.name);

    }

    return false;

}

}




[]( )toString()

=============================================================================



1.  当我们输出一个对象的引用时,实际上就是调用toString()方法

2.  String,Date,File,包装类等重写了Object类中toString()方法,使得在调用时返回"实体内容"

3.  示例:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值