背景:方法调用上的分类方式
方法可以按本类中的方法和外部类中的方法分类;方法又可以按静态方法和非静态的一般方法分类,其中又包含类中继承方面的知识。而本文也是介于此分类方式来进行方法调用方式讨论的。
一、调用本类中的方法
1. 本类方法为静态方法
调用方式:直接使用方法名调用
例子:
1)继承于父类的静态方法:直接使用父类方法名调用
public class test extends a {
public static void main(String[] args) {
print();
}
}
class a {
public static void print() {
System.out.println("我是类型A的print方法!");
}
}
控制台输出:我是类型A的print方法!
2)子类的新方法:直接使用子类新方法调用
public class test extends a {
public static void print() {
System.out.println("我是类型B的print方法!");
}
public static void main(String[] args) {
print();
}
}
class a {
public static void print() {
System.out.println("我是类型A的print方法!");
}
}
控制台输出:我是类型B的print方法!
注意事项:父类中的静态方法是不能被重写的,子类中同名静态方法只能是新方法。换句话说,父类和子类中含有的其实是两个没有关系的方法,它们的行为也并不具有多态性。相关链接
2.本类方法为一般方法(无static修饰)
调用方式:在非静态代码块直接调用,静态代码块需要构造对象调用。
1)继承于父类的一般方法:创建子类对象调用与直接调用
public class test extends a {
public static void main(String[] args) {//main方法是静态方法
test t = new test();
t.print();
}
public test(){//非静态方法可以直接使用方法名调用,例如构造方法
print();
}
}
class a {
public void print() {
System.out.println("我是类型A的print方法!");
}
}
控制台输出:我是类型A的print方法!
2)子类重写的方法:创建子类对象调用与直接调用
public class test extends a {
public void print(){
System.out.println("我是类型B的print方法!");
}
public static void main(String[] args) {
test t = new test();
t.print();
}
public test(){
print();
}
}
class a {
public void print() {
System.out.println("我是类型A的print方法!");
}
}
控制台输出:我是类型B的print方法!
3)子类的新方法:创建子类对象调用与直接调用
public class test extends a {
public void print2(){
System.out.println("我是类型B-2的print方法!");
}
public static void main(String[] args) {
test t = new test();
t.print2();
}
public test(){
print2();
}
}
class a {
public void print() {
System.out.println("我是类型A的print方法!");
}
}
控制台输出:我是类型B-2的print方法!
二、调用外部的类的方法
1.调用外部类的静态方法
调用方式:使用 类名.方法 进行调用
public class test{
public static void main(String[] args) {
A.print();
}
}
class A {
public static void print() {
System.out.println("我是类型A的print方法!");
}
}
2.调用外部类的一般方法
调用方式:用外部类构造的对象进行方法调用
public class test{
public static void main(String[] args) {
A a = new A();
a.print();
}
}
class A {
public static void print() {
System.out.println("我是类型A的print方法!");
}
}
三、方法调用的注意事项
-
本类的静态方法(可以继承于父类)可以直接(不通过类名和对象调用)在子类的静态方法中调用,但是不能使用this.方法名。所以“在该类的内部调用该类的方法是可以不写类名的,默认了用this调用”这句话在很多回答中出现,但是这是不够严谨的,原因是其与this关键字不能在静态方法中调用相矛盾。不妨将其认为是JVM提供给程序员的编译器蜜糖。
-
任何类由于都继承了Object类,但是Object类中没有public修饰的静态方法。但是Object类中有native方法,其虽然不能放在子类的静态方法中,但是在子类的一般方法中可以直接通过方法调用,比如
wait()
方法,但要额外注意方法的异常处理,如下的非静态方法test01()
public class test{ public void test01(){ try { wait(100); } catch (InterruptedException e) { e.printStackTrace(); } } }