目录
什么是方法的返回值?方法有哪几种类型?
1、无参数无返回值的方法
2、有参数无返回值的方法
3、有返回值无参数的方法
4、 有返回值有参数的方法
静态方法为什么不能调用非静态成员?
静态方法和实例方法有何不同?
1、调用方式
2、访问类成员是否存在限制
重载和重写有什么区别?
重载
重写
什么是可变长参数?
什么是方法的返回值?方法有哪几种类型?
方法的返回值 是指我们获取到的某个方法体中的代码执行后产生的结果
1、无参数无返回值的方法
public void f1() {System.out.println("无参无返回值方法");}// 下面这个方法也没有返回值,虽然用到了 returnpublic void f(int a) {if (a == 1) {// 表示结束方法的执行,下方的输出语句不会执行return;}System.out.println(a);}
2、有参数无返回值的方法
public void f2(int a) {System.out.println(a);}
3、有返回值无参数的方法
public int f3() {int x = 2;return x;}
4、 有返回值有参数的方法
public int f4(int a, int b) {return a * b;}
静态方法为什么不能调用非静态成员?
- 静态方法是属于类的,在类加载的时候就会分配内存,可以通过类名直接访问。而非静态成员属于实例对象,只有在对象实例化之后才存在,需要通过类的实例对象去访问。
- 在类的非静态成员不存在的时候静态方法就已经存在了,此时调用在内存中还不存在的非静态成员,属于非法操作。
// 定义一个字符型常量public static final char LETTER_A = 'A';// 定义一个字符串常量public static final String GREETING_MESSAGE = "Hello, java!";public static void main(String[] args) {// 输出字符型常量的值System.out.println("字符型常量的值为:" + LETTER_A);// 输出字符串常量的值System.out.println("字符串常量的值为:" + GREETING_MESSAGE);}
静态方法和实例方法有何不同?
1、调用方式
在外部调用静态方法时,可以使用类名.方法名的方式,也可以使用对象.方法名的方式,而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象 。
不过,需要注意的是一般不建议使用对象.方法名的方式来调用静态方法。这种方式非常容易造成混淆,静态方法不属于类的某个对象而是属于这个类。
因此,一般建议使用的方式来调用静态方法。
public void method() {System.out.println("method");}public static void staicMethod(){System.out.println("staicMethod");}public static void main(String[] args) {Test3 test3 = new Test3();// 调用实例方法test3.method();// 调用静态方法Test3.staicMethod();}
2、访问类成员是否存在限制
静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),不允许访问实例成员(即实例成员变量和实例方法),而实例方法不存在这个限制。
重载和重写有什么区别?
重载就是同样的一个方法能够根据输入数据的不同,做出不同的处理
重写就是当子类继承自父类的相同方法,输入数据一样,但要做出有别于父类的响应时,你就要覆盖父类方法
重载
发生在同一个类中(或者父类和子类之间),方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同。
如果多个方法(比如StringBuilder的构造方法)有相同的名字、不同的参数, 便产生了重载。
StringBuilder sb1 = new StringBuilder();
StringBuilder sb2 = new StringBuilder("HelloJava");
编译器必须挑选出具体执行哪个方法,它通过用各个方法给出的参数类型与特定方法调用所使用的值类型进行匹配来挑选出相应的方法。 如果编译器找不到匹配的参数, 就会产生编译时错误, 因为根本不存在匹配, 或者没有一个比其他的更好(这个过程被称为重载解析(overloading resolution))。
Java 允许重载任何方法, 而不只是构造器方法。
重写
重写发生在运行期,是子类对父类的允许访问的方法的实现过程进行重新编写。
- 方法名、参数列表必须相同,子类方法返回值类型应比父类方法返回值类型更小或相等,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类。
- 如果父类方法访问修饰符为private/final/static则子类就不能重写该方法,但是被static修饰的方法能够被再次声明。
- 构造方法无法被重写
// 父类
public class Test4 {public void show(int a){System.out.println("父类a:"+a);}
}// 子类
public class Test5 extends Test4{public void show(int a){a = 1;System.out.println("子类a:"+a);}
}
什么是可变长参数?
从 Java5 开始,Java 支持定义可变长参数,所谓可变长参数就是允许在调用方法时传入不定长度的参数。就比如下面这个方法就可以接受 0 个或者多个参数。
另外,可变参数只能作为函数的最后一个参数,但其前面可以有也可以没有任何其他参数。
public class Test6 {public static void show(String... args) {for (String s : args) {System.out.println(s);}}public static void show(String arg1, String arg2) {System.out.println(arg1 + arg2);}public static void main(String[] args) {show("a", "b");show("a", "b", "c", "d");}
}