方法重载:
定义:
同一个类中的方法,方法名称相同,参数列表不同,我们称之为方法重载
注意事项:
不能根据方法的返回值来区分方法是否重载,因为java调用方法时可以忽略方法的返回值,假如现在同一个类中有两个方法,int f(),void f(),这两个方法方法名称相同,参数列表相同,只有返回值不同,当你调用f()时,你知道调用的是哪个方法吗?这时你糊涂了,那么java系统也会糊涂,所以不能根据返回值来判断一个方法是否重载
This关键字:
定义:
this关键字总是指向调用该方法的对象。根据this出现位置的不同,this作为对象的引用有两种情况:1、构造器中引用该构造器正在初始化的对象;2、在方法中引用调用该方法的对象
注意事项:
- 静态方法中不能使用this关键字,因为静态方法通过类名直接调用,可以不用对象调用,既然连对象都没有了,何来的this
- 在类的某个方法中调用该类的另一个方法时,可以省略this关键字比如在run()方法中调用jump()方法,可以直接jump();调用,虽然这里的this省略了,但是本质上还是通过this来调用jump()方法
成员变量和局部变量:
定义:
成员变量:指的是在类中定义的变量,成员变量分为类变量和实例变量
- 类变量:用static关键字修饰的变量,可以直接通过类名来访问
- 实例变量:没有用static关键字修饰的变量,只能通过类的实例来访问
局部变量:指的是在方法中定义的变量
多态:
Java引用变量有两个类型:一个是编译时类型,一个是运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致,就可能出现多态
现在有如下代码:
class BaseClass{ public int book=6; public void base() { System.out.println("父类的普通方法"); } public void test() { System.out.println("父类被覆盖的方法"); }}public class SubClass extends BaseClass { public String book="java编程思想"; public void test() { System.out.println("子类覆盖父类的方法"); } public void sub() { System.out.println("子类的普通方法"); } public static void main(String[] args) { BaseClass bc=new BaseClass();//测试1 System.out.println(bc.book); bc.base(); bc.test(); System.out.println("==========="); SubClass sc=new SubClass();//测试2 System.out.println(sc.book); sc.base(); sc.test(); System.out.println("==========="); BaseClass bs=new SubClass();//测试3 System.out.println(bs.book); bs.base(); bs.test(); //bs.sub();这行代码编译时报错 }}
运行结果:
6父类的普通方法父类被覆盖的方法===========java编程思想父类的普通方法子类覆盖父类的方法===========6父类的普通方法子类覆盖父类的方法
测试1和测试2编译时类型和运行时类型相同,所以没有多态发生,测试3编译时类型是BaseClass,而运行时类型是SubClass,所以当执行bs.base()时首先去SubClass类中查找此方法,发现没有base方法,则去父类中查找,发现存在该方法,则调用父类的base方法,接着执行bs.test(),由于之类重写了父类的test方法,所以此时执行的是之类的test方法,大家可能会有疑问,为什么bs.book的值不是java编程思想,而是6呢?照理说应该访问的是子类的book。与方法不同的是,对象的实例变量不具备多态性,所以这里输出的是父类的实例变量。bs.sub()编译时报错,因为BaseClass bs=new SubClass();这行代码编译的类型是BaseClass,而BaseClass中没有sub()方法,所以编译错误