「java多态检测」java多态的理解和使用 阿猫阿狗

博主:adminadmin 2023-03-18 07:14:07 401

本篇文章给大家谈谈java多态检测,以及java多态的理解和使用 阿猫阿狗对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

java多态

看的是孙鑫的视频教程吧。

这个当然是可以的罗。我回答你的两个问题:

1.多态。

关于java的多态,有的书上是这样讲的,它讲java的多态分成静态的多态,和动态的多态,而所谓静态的多态就是只函数的重载,动态的多态就是方法的覆写。

如下面:

class Test

{

void print()

{

System.out.println("hello world");

}

void print(int x)

{

System.out.println("hello world"+i);

}

public static void main(String []args)

{

Test ts=new Test();

ts.print();

ts.print(10);

}

}

/*

上面的程序就是在一个类中成员方法的重载例子。也就是一个静态的多态性。系统会在你编译的时候根据你调用的方法的参数列表来动态的决定调用那一个函数。

*/

动态的多态:

class Test

{

void print()

{

System.out.println("hello Test");

}

public static void main(String []args)

{

A a=new A();

a.print();

}

}

class A extends Test

{

void print()

{

System.out.println("hello A");

}

}

/*

这时由于子类覆写了父类的方法,所以调用的是子类覆写后的方法。

这是动态的多态。

*/

你上面的问题,是把一个子类的实例赋值给一个父类。这是可以的,其实我个人觉得这好像不是什么多态的问题。请看下面的程序:

class A

{

public static void main(String []args)

{

A [] a=new A[3];

a[0]=new B();

a[1]=new C();

a[2]=new D();

for(int i=0;ia.length;i++)

{

a[i].print();

}

}

}

class B extends A

{

void print()

{

System.out.println("hello B");

}

}

class C extends A

{

void print()

{

System.out.println("hello C");

}

}

class D extends A

{

void print()

{

System.out.println("hello D");

}

}

/*

上面的程序执行的结果:

hello B

hello C

hello D

可以看出,程序不会调用父类的print()方法,再说父类根本就没有print()方法,但是它不会报错。这就是JVM (java虚拟机),能在程序运行时,动态的识别变量的类型。就像上面一样。这主要是考java的运行时的类型识别机制实现的,当然我认为这其实也可以看成是java多态的一种表现。

*/

在java中子类是父类的实例,这就像是说 鱼是动物。但不能说动物就一定是鱼,这也是符合了人们对现实世界的认识规律。另外java为我们提供了一个关键字,在孙鑫的教程里面也讲到了吧。它是instanceof

你可以用这来判断一个对象是否是一个类的实例。还是上面的A ,B,C ,D类的例子:

在mian函数中写上下面的代码:(把原来的代码删掉)

B b=new B();

if(b instanceof A)

System.out.println("b instanceof A");

//输出:b instanceof A

说明b是A类的实例。

再看下面的例子。

A a=new B();

if(a instanceof B)

System.out.println("a instanceof B");

//输出:a instanceof B

但此时不能这样,B b=a;

虽然a是B的实例但是这里不能这样赋值,要像下面:

B b=(B)a;

//进行类型的强制转换

关于这部分你还是自己体会吧。

2.关于你所说的函数的参数是对象的问题:

函数的参数当然可以是一个对象,类是我们自定义的类型,他可以像基本的数据类型(int ,float等)一样用来定义变量,在java中类用的是相当多的,类属于引用类型,而基本类型的变量属于值类型。在函数传递参数的过程中,实际上是传的是对象的地址。

Java中怎样判断一个变量是否属于哪种类型

变量类型识别有3种方法:

1、通过反射拿到变量的类型;

2、instanceof关键字判断;

3、通过java的多态(方法重载)来DIY类型识别。

举例如下:

package com.cxyapi.oo;  

  

/** 类型识别工具测试类 

 * @author cxy @  

 */  

public class TypeToolsTest  

{  

    public static void main(String[] args)  

    {  

        int i=0;  

        TypeObject to=new TypeObject();  

        //1.反射  

        System.out.println("to的类型:"+to.getClass().getSimpleName());  

        System.out.println(int.class.getSimpleName());  

        System.out.println(Integer.class.getSimpleName());  

        //但是对于一个不确定类型的基本数据类型变量我们没法用反射来获取其类型。  

        System.out.println("----------------------");  

          

        //2.instanceof  

        if(to instanceof TypeObject){ System.out.println("to是TypeObject类型的");}  

        //但是这种办法貌似也没法确定基本数据类型  

        System.out.println("----------------------");  

          

        //以上两种方式对于对象,引用类型的都很好用,但是对基本数据类型就不那么好用了。  

        //3.通过多态(方法的重载)  

        System.out.println("i是:"+TypeTools.getType(i));  

        System.out.println("to是:"+TypeTools.getType(to));  

        System.out.println("\"cxyapi\"是:"+TypeTools.getType(""));  

        //可以看出来 最后一种方式使用多态的方式达到了检测类型(基本类型和引用类型)的目的  

        //除了弥补其他两种方式不能检测基本数据类型的不足在外,还能自己DIY类型信息  

    }  

}  

  

//定义一个类,为了演示引用类型的类型检测  

class TypeObject{}

自定义的类型识别工具:

package com.cxyapi.oo;  

  

import java.util.HashMap;  

import java.util.Map;  

  

/** 类型识别工具 

 * @author cxy @  

 */  

public class TypeTools  

{  

    //获得类型  

    public static MapString,String getType(Object o)  

    {  

        MapString,String typeInfo=new HashMapString,String();  

        typeInfo.put("类型", o.getClass().getSimpleName());  

        typeInfo.put("描述", "引用类型");  

        return typeInfo;  

    }  

      

    public static MapString,String getType(int i)  

    {  

        MapString,String typeInfo=new HashMapString,String();  

        typeInfo.put("类型", "int");  

        typeInfo.put("描述", "整形");  

        return typeInfo;  

    }  

      

    public static MapString,String getType(long l)  

    {  

        MapString,String typeInfo=new HashMapString,String();  

        typeInfo.put("类型", "long");  

        typeInfo.put("描述", "长整型");  

        return typeInfo;  

    }  

      

    public static MapString,String getType(boolean b)  

    {  

        MapString,String typeInfo=new HashMapString,String();  

        typeInfo.put("类型", "boolean");  

        typeInfo.put("描述", "布尔类型");  

        return typeInfo;  

    }  

      

    public static MapString,String getType(char b)  

    {  

        MapString,String typeInfo=new HashMapString,String();  

        typeInfo.put("类型", "char");  

        typeInfo.put("描述", "字符");  

        return typeInfo;  

    }  

      

    public static MapString,String getType(float f)  

    {  

        MapString,String typeInfo=new HashMapString,String();  

        typeInfo.put("类型", "float");  

        typeInfo.put("描述", "单精度浮点型");  

        return typeInfo;  

    }  

      

    public static MapString,String getType(double d)  

    {  

        MapString,String typeInfo=new HashMapString,String();  

        typeInfo.put("类型", "double");  

        typeInfo.put("描述", "双精度浮点型");  

        return typeInfo;  

    }  

      

    public static MapString,String getType(String s)  

    {  

        MapString,String typeInfo=new HashMapString,String();  

        typeInfo.put("类型", "String");  

        typeInfo.put("描述", "字符串类型");  

        return typeInfo;  

    }  

      

}

JAVA中多态是怎么一回事,能不能举个例子,嗷嗷感谢!

java多态其实很简单的....java多态必须满足三个条件:1、继承2、子类重写父类方法3、父类引用调用子类对象接下来用例子一步一步解释分别是什么意思......继承:公司员工 有测试员、开发员和项目经理 他们都有一些共同的属性比如 年龄、性别、家庭地址、工资等。这时就可以将她们抽象出一个类出来 person 包括这些共同的属性。然后测试员、开发员和项目经理去继承这个类person后,就拥有了这些属性了。子类重写父类方法:测试员、开发员和项目经理的工资是不一样的,他们又从继承了工资这个属性,显然不能达到要求。此时就必须重写从父类继承过来的这个方法。父类引用调用子类对象:Person person = new Manager() 代码:pulbic Person {

public void 工资() { System.out.println(3000);

}}

//=========================================

public Manager extends Person { //满足条件1 继承 public void 工资() { //满足条件2 子类重写父类方法 System.out.println(5000);

}

}//=========================================public Demo { public static void main(String[] args) {

Person person = new Manager(); //满足条件3 父类引用调用子类对象

person.工资(); //打印 出5000;

}

}

关于java多态性

该问题的关键有两点:

一是子类与父类的关系,二是重载方法的调用问题。

子类对象可以直接当成父类对象使用,但反过来就不可以。举例来说,人是父类,学生是人的子类,所以学生对象一定具备人对象的属性,但是人对象就未必具有学生对象的特性。所以学生对象可以当做人对象来使用,但是人对象就不能当做学生对象使用。注意当把子类对象当成父类对象使用时,子类对象将失去所有的子类特性,只保留与父类同名的属性和方法(同名方法不仅是函数名相同,而且参数类型也要一样,否则不予保留)。

一个类中如果定义了重载的方法,则系统在调用方法时,会根据参数的类型自动选择调用合适的方法。

1 a1.shows(b),在A中没有含有B类参数的方法,但是含有A类参数的方法,根据子类对象父类可用的原则,所以调用方法

public String show(A obj)...{return ("A and A");}

2 a1.show(c),C类是B类的子类,而B类又是A类的子类,所以C类对象可以当制作A类对象使用。结果同上。

3 a1.show(d),根据参数类型直接调用A中的方法

public String show(D obj)...{

return ("A and D");

}

4 a2.show(b),a2本来是一个B对象,但是将其赋给了A类变量,所以a2只保留了与父类A同名的属性和方法。a2.show(b)调用B类中的保留的与父类同名同参方法

public String show(A obj)...{

return ("B and A");

}

5 a2.show(c),B类的保留方法中没有C类参数方法,但是有含有C的父类A的参数方法,所以调用的方法

public String show(A obj)...{

return ("B and A");

}

6 a2.show(d),调用的是A类中的

public String show(D obj)...{

return ("A and D");

}

7 b.show(b),调用B类中的

public String show(B obj)...{

return ("B and B");

}

8 b.show(c),B类中没有C类参数的方法,但是有B类参数的方法,所以调用方法 public String show(B obj)...{

return ("B and B");

}

9 b.show(d),解释同8

java多态检测的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java多态的理解和使用 阿猫阿狗、java多态检测的信息别忘了在本站进行查找喔。