标签:std tab ref 删除 ring move java基础 过程 父类
实习培训——Java基础(3)
super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
this关键字:指向自己的引用。
package yqq.study; public class SuperDemo { public static void main(String[] args) { new Subclass().showMessage(); } } class Superclass { int i = 50; } class Subclass extends Superclass { int i = 100; public void showMessage() { System.out.printf("super.i=%d,this.i=%d\n", super.i, this.i); } }
子类不能继承父类的构造器(构造方法或者构造函数),但是父类的构造器带有参数的,则必须在子类的构造器中显式地通过super关键字调用父类的构造器并配以适当的参数列表。
如果父类有无参构造器,则在子类的构造器中用super调用父类构造器不是必须的,如果没有使用super关键字,系统会自动调用父类的无参构造器。
package yqq.study; class SuperClass { private int n; SuperClass() { System.out.println("SuperClass()"); } SuperClass(int n) { System.out.println("SuperClass(int n)"); this.n = n; } } class SubClass extends SuperClass { private int n; SubClass() { super(300); System.out.println("SubClass"); } public SubClass(int n) { System.out.println("SubClass(int n):" + n); this.n = n; } } public class TestSuperSub { public static void main(String args[]) { SubClass sc = new SubClass(); SubClass sc2 = new SubClass(200); } }
输出结果为:
SuperClass(int n) SubClass SuperClass() SubClass(int n):200
为什么会有这样的结果?可以在eclipse中打断点,进行debug。
重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!
重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。
重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如: 父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的父类,只能抛出 IOException 的子类异常。
在面向对象原则里,重写意味着可以重写任何现有方法。实例如下:
class Animal { public void youyong() { System.out.println("可以游泳"); } public void move() { System.out.println("动物可以移动"); } } class Dog extends Animal { public void move() { System.out.println("狗可以跑和走"); } public void bark() { System.out.println("狗可以叫"); } } public class TestDog { public static void main(String[] args) { Animal a = new Animal(); Animal b = new Dog(); Dog c = new Dog(); a.move(); a.youyong(); a.bark(); // 编译不通过 b.move(); b.youyong(); b.bark(); // 编译不通过 c.bark(); c.youyong(); c.bark(); } }
重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
最常用的地方就是构造器的重载。
重载规则
public class Overloading { public int test(){ System.out.println("test1"); return 1; } public void test(int a){ System.out.println("test2"); } //以下两个参数类型顺序不同 public String test(int a,String s){ System.out.println("test3"); return "returntest3"; } public String test(String s,int a){ System.out.println("test4"); return "returntest4"; } public static void main(String[] args){ Overloading o = new Overloading(); System.out.println(o.test()); o.test(1); System.out.println(o.test(1,"test3")); System.out.println(o.test("test4",1)); } }
区别点 | 重载方法 | 重写方法 |
---|---|---|
参数列表 | 必须修改 | 一定不能修改 |
返回类型 | 可以修改 | 一定不能修改 |
异常 | 可以修改 | 可以减少或删除,一定不能抛出新的或者更广的异常 |
访问 | 可以修改 | 一定不能做更严格的限制(可以降低限制) |
方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。
菜鸟教程
标签:std tab ref 删除 ring move java基础 过程 父类
原文地址:http://www.cnblogs.com/myfrank/p/7308332.html