java里面什么时候可以直接用方法名来调用是谁来调用类还是对象可以讲简单点吗我菜鸟一只

java里面什么时候可以直接用方法名来调用是谁来调用类还是对象可以讲简单点吗我菜鸟一只,第1张

1如果方法是静态的,则用类名加加方法名来调用。

2如果方法是非静态,则用本类对象加加方法名来调用。

举个例子:

public class Test{

public static void print(){

Systemoutprint(“in static method:print”);

}

public int random(){

return (int)(Mathrandom()

1000000);

}

public static void main(String[] args){

//static method

Testprint();

//not static method

new Test()random();

}

注意:

非静态方法可以调用静态方法,静态方法只能调用静态方法和构造函数。

import javalangreflectInvocationTargetException;

import javalangreflectMethod;

public class TheReflect {

/

@param args

@throws NoSuchMethodException

@throws SecurityException

@throws InvocationTargetException

@throws IllegalAccessException

@throws IllegalArgumentException

/

public static void main(String[] args) throws SecurityException,

NoSuchMethodException, IllegalArgumentException,

IllegalAccessException, InvocationTargetException {

// TODO Auto-generated method stub

/ 详细的API使用方法参加JDK的doc文档中的javalangClass和javalangreflectMethod /

/ 相当于你在Spring的Context中获取bean对象 /

TheBeanClazz theBean = new TheBeanClazz();

/ 通过获取到bean对象得到该对象的类定义 /

Class clazz = theBeangetClass();

/ 通过上面得到的类定义对象clazz得到指定名称和参数类型列表的方法定义 /

Method m = clazzgetMethod("sayHello", Stringclass);

/

在指定的对象(theBean)上调用符合上面方法定义的方法,

并且制定方法的入口参数值列表(这个方法只有一个参数,

如果是多个参数用逗号分隔)

/

String msg = (String) minvoke(theBean, "床上等你");

Systemoutprintln("返回的结果 :" + msg);

}

}

class TheBeanClazz {

public String sayHello(String s) {

Systemoutprintln("Hello :" + s);

return "Hello :" + s;

}

}

你可以从左往右一点一点的看。

DecimalFormat 类,DecimalFormatgetCurrencyInstance() 调用了这个类里的静态方法,DecimalFormatgetCurrencyInstance()format() 说明前面DecimalFormatgetCurrencyInstance()返回了一个对象,这个对象含有format()方法。

其实这个也可以拆开写:

NumberFormat a = DecimalFormatgetCurrencyInstance();

String b = aformat(1234567);

这样写比较麻烦,连起来写比较方便

区分是调用哪个test是由你调用的时候的参数决定的。

例如:调用时test(1),那么你调用的是

test(int i){

new A()getMethod();

}

这个方法

如果调用的时候是test("str")调用的就是

test(String i){

new A()getMethod();

}

了。

Foible 朋友的说法不对。

B b=new B(); 这种方式,实际上是实例化了子类的对象,注意:内存中还是子类对象。

((A)b)m(); 表面上看起来是父类对象了,但是由于内存中是子类对象,所以调用的还是子类方法。

A b=new B();

bm();

这种方法和你写的实际是一个效果,虽然上溯造型到了父类,由于子类重写了父类的方法,调用的还是子类的方法(也就是所:方法的实现,最后是在子类中实现的)。

所以,总结如下:

如果子类没有重写父类的方法,调用父类的方法的时候,实际上是去父类的内存中实现,可以调用父类方法。

如果子类重写了父类的方法,那么,你虽然上溯造型到了父类,由于内存还是子类,该方法的实现还是在子类,所以用实例化的对象是调用不到父类的,这种情况下,只能用super关键字。

用static的情况不讨论的情况下不讨论是这样的,不知道到您是否不满意,不满意的话可以发消息继续讨论。

java中利用反射获取方法:

1先找到方法所在类的字节码

2找到需要被获取的方法

Class类中获取方法:

public Method[] getMethods();获取包括自身和继承(实现)过来的所有的public方法——Method不支持泛型<>,即后面不接<>

public Method[] getDeclaredMethods();获取自身所有的方法(private、public、protected,和访问权限无关),不包括继承的

public Method[] getMethod(String methodName, Class<T>parameterTypes);表示获取指定的一个公共的方法,包括继承的

参数: methodName:表示获取的方法的名字

parameterTypes:表示获取的方法的参数的Class类型

public Method[] getDeclaredMethod(String methodName, Class<T>parameterTypes);//表示获取本类中的一个指定的方法(private、protected、public,与访问权限无关),不包括继承的方法。

参数:methodName: 表示被调用方法的名字

parameterTypes:表示被调用方法的参数的Class类型如Stringclass只有通过方法签名才能找到唯一的方法,方法签名=方法名+参数列表(参数类型、参数个数、参数顺序)。

public Method getDeclaredMethod(String name,Class parameterTypes):表示调用指定的一个本类中的方法(不包括继承的)

参数: methodName: 表示被调用方法的名字

parameterTypes:表示被调用方法的参数的Class类型如Stringclass

举例:

class P{

public void t1(){}

void t2(){}

private void t3(){}

}

class People extends P{

public void sayHi() {

    Systemoutprintln("sayHi()");

}

public void sayHello(String name) {

    Systemoutprintln("sayHello(String name)   " + "name = " + name);

}

private void sayGoodBye(String name, int age) {

    Systemoutprintln("sayGoodBye(String name, int age)   " + "name = " + name + "  age = " + age);

}

}

public class MethodDemo {

public static void main(String[] args) throws Exception {

    Class clazz = Peopleclass;

    //获取类自身及父类所有public方法

    Method ms[] = clazzgetMethods();

    for (Method m : ms) {

        Systemoutprintln(m);

    }

    Systemoutprintln("---------------------------");

    //获取类自身所有方法(不会获取父类方法)

    ms = clazzgetDeclaredMethods();

    for (Method m : ms) {

        Systemoutprintln(m);

    }

    Systemoutprintln("---------------------------");

    //只能获取父类中的public方法,无法获取到父类的默认权限和private权限方法

    Method m = clazzgetMethod("t1", null);//public void comreflexPt1()

    Systemoutprintln(m);

    m = clazzgetMethod("sayHello", Stringclass);

    Systemoutprintln(m);

    //Exception in thread "main" javalangNoSuchMethodException: comreflexPeoplesayGoodBye(javalangString, int)

    //getMethod方法只能获取public的

//        m = clazzgetMethod("sayGoodBye", Stringclass,intclass);

//        Systemoutprintln(m);

    m = clazzgetDeclaredMethod("sayGoodBye", Stringclass,intclass);

    Systemoutprintln(m);

    //带Declared的无法获取父类中的方法

//        m = clazzgetDeclaredMethod("t1", null);//Exception in thread "main" javalangNoSuchMethodException:comreflexPeoplet1()

//        Systemoutprintln(m);

}

}

以上就是关于java里面什么时候可以直接用方法名来调用是谁来调用类还是对象可以讲简单点吗我菜鸟一只全部的内容,包括:java里面什么时候可以直接用方法名来调用是谁来调用类还是对象可以讲简单点吗我菜鸟一只、怎么根据类名和方法名调用方法、请问java中类名.方法名().方法名()是什么意思等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9302262.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-26
下一篇2023-04-26

发表评论

登录后才能评论

评论列表(0条)

    保存