欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

笔记12

程序员文章站 2022-07-13 12:40:15
...
//getClass()是Object类中的方法,因为Object类是所有类的基类,所以所有的东西(除了基本类型,但注意基本类型的数组是数组类对象的引用,它属于一个类)都可以用该方法
//它返回的是调用它的那个东西的类型 class表示这是一个类 [表示这是一个数组 I表示类型为int
//Integer表示类型为Integer   C表示类型为char  Character表示类型为Character A表示是A类型
//这么细的说明不是为了让您记住...只是为了方便回过头来查看代码啊,别搞错了目的。
//然后,忘了的话就像haha.g1(new Integer[]{1,2,3,4});这样调用一下函数您就明白怎么回事了,这玩意不用记。
//数组.length返回数组中原元素的个数
//从这个例子可以看出 参数表为:类型... a 时,a就是该类型的数组,而不是别的什么东西
class A
{
}
public class H
{
    public void f(String... args)
    {
        printnb("args的类型为 "+args.getClass()+"     ");
        print("args数组中元素的个数为"+args.length);
    }


    public void g(int... args)
    {
        printnb("args的类型为 "+args.getClass()+"     ");
        print("args数组中元素的个数为"+args.length);
    }
    public void g1(Integer... args)
    {
        printnb("args的类型为 "+args.getClass()+"     ");
        print("args数组中元素的个数为"+args.length);
    }


    public void h(char... args)
    {
        printnb("args的类型为 "+args.getClass()+"     ");
        print("args数组中元素的个数为"+args.length);
    }
    public void h1(Character... args)
    {
        printnb("args的类型为 "+args.getClass()+"     ");
        print("args数组中元素的个数为"+args.length);
    }


    public void t(A... args)
    {
        printnb("args的类型为 "+args.getClass()+"     ");
        print("args数组中元素的个数为"+args.length);
    }


    public static void main(String[] args)
    {
        H haha=new H();
        haha.f("hi","lo");
        haha.f();

        haha.g(1,2,3);
        haha.g();

        haha.g1(1,2,3);
        haha.g1();
        haha.g1(new Integer[]{1,2,3,4});

        haha.h('a','b','c');
        haha.h();//注意这种,调用后仍会显示类型,但是元素个数为0

        haha.h1('a','b','c');
        haha.h1();

        haha.t(new A(),new A());

    }

输出:

args的类型为 class [Ljava.lang.String;     args数组中元素的个数为2
args的类型为 class [Ljava.lang.String;     args数组中元素的个数为0
args的类型为 class [I     args数组中元素的个数为3
args的类型为 class [I     args数组中元素的个数为0
args的类型为 class [Ljava.lang.Integer;     args数组中元素的个数为3
args的类型为 class [Ljava.lang.Integer;     args数组中元素的个数为0
args的类型为 class [Ljava.lang.Integer;     args数组中元素的个数为4
args的类型为 class [C     args数组中元素的个数为3
args的类型为 class [C     args数组中元素的个数为0
args的类型为 class [Ljava.lang.Character;     args数组中元素的个数为3
args的类型为 class [Ljava.lang.Character;     args数组中元素的个数为0
args的类型为 class [Lnet.mindview.A;     args数组中元素的个数为2

关于这个getClass()函数,我觉的书上说的太少了,让我们做进一步的测试,以分析这个函数的功能

public class Hello
{
    public static void main(String[] args)
    {

        /*
        int a=3;
        System.out.println(a.getClass());
        报错
        */

        Integer b=new Integer(1);
        System.out.println(b.getClass());

        /*
        char c='*';
        System.out.println(c.getClass());
        报错
        */

        Character d=new Character('*');
        System.out.println(d.getClass());

        /*
        double e=1.1;
        System.out.println(e.getClass());
        报错
        */

        Double f=new Double(1.1);
        System.out.println(f.getClass());

    }

}

输出:
class java.lang.Integer
class java.lang.Character
class java.lang.Double
这可以看出来,getClass()函数对基本类型是不适用的。
所以就有个问题…为什么对基本类型的数组是适用的…可以这样理解:数组名其实是数组类对象的引用,也就是说数组名其实是数组类的对象,也就是说它属于一个类…但基本类型就是基本类型,它不属于任何类。

//下面这段代码,主要告诉我们:在函数参数表中只有一个参数时,例如:,
//这种参数形式: 类型... 名字  它的包装器在起作用
//例如Integer..args 它会把它的int 参数转化为Integer   反过来也行哦
//例如Character..args 它会把它的char 参数转化为Character   反过来也行哦
//其实以上可以总结为一句话:char Character这种,基本类型和它的类在使用上没差别

public class H
{
    void f(Integer... args)
    {
        for(Integer e:args)
        {
            printnb(e+" ");
        }
        print();
    }

    void g(Character... args)
    {
        for(Character e:args)
        {
            printnb(e+" ");
        }
        print();
    }
    void f_(int... args)
    {
        for(int e:args)
        {
            printnb(e+" ");
        }
        print();
    }
    void g_(char... args)
    {
        for(char e:args)
        {
            printnb(e+" ");
        }
        print();
    }
    public static void main(String[] args)
    {
        H haha=new H();
        haha.f(new Integer(1),2,3);
        haha.f(1,2,3,4);
        haha.f(new Integer(1),new Integer(2),new Integer(3),new Integer(4),new Integer(5));

        haha.g('a','b');
        haha.g(new Character('a'),'b','c');
        haha.g(new Character('a'),new Character('b'),new Character('c'),new Character('d'));

        haha.f_(1,new Integer(2));
        haha.g_('a',new Character('b'));

    }

}  

输出:

1   2   3   
1   2   3   4   
1   2   3   4   5   
a   b   
a   b   c   
a   b   c   d   
1   2   
a   b   
//以下几段代码告诉我们的是:  类型... 名字 这种参数形式在函数重载时容易产生麻烦
//本书作者给您的警告是:在函数重载时,最多只有一个函数使用 :类型 ... 名字这种形式。也就是不定个数的参数表的形式。
//关于产生怎样的麻烦:下面这段代码使用a()报错 因为编译器不知道该调用哪个a()函数

public class H
{
    void a(Integer... args)
    {
        printnb("a:  ");
        for(Integer e:args)
        {
            printnb(e+"   ");
        }
        print();
    }

    void a(Character... args)
    {
        printnb("b:  ");
        for(Character e:args)
        {
            printnb(e+"   ");
        }
        print();
    }
    void a(Long... args)
    {
        printnb("c:   ");
        for(Long e:args)
        {
            printnb(e+"   ");
        }
        print();
    }
    public static void main(String[] args)
    {
        H haha=new H();
        haha.a(1,2);
        haha.a(11L);
        haha.a('c');
        //haha.a(args);//报错。编译器不知道该调用哪个a()函数
    }

}   

输出:

a:  1   2   
c:   11   
b:  c