重写(Override)
1.概念
重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!
2.功能
重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。
3.注意点
1.参数列表必须完全与被重写方法的相同。
2.返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类(java5 及更早版本返回类型要一样,java7 及更高版本可以不同)。
3.访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected。
4.父类的成员方法只能被它的子类重写。
5.声明为 final 的方法不能被重写。
6.声明为 static 的方法不能被重写,但是能够被再次声明。
7.重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
8.构造方法不能被重写。
重载(Overload)
1.概念
重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
2.功能
一个类的多态性表现
3.注意点
1.被重载的方法必须改变参数列表(参数个数或类型不一样);
2.被重载的方法可以改变返回类型;
3.被重载的方法可以改变访问修饰符;
4.被重载的方法可以声明新的或更广的检查异常;
5.方法能够在同一个类中或者在一个子类中被重载。
6.无法以返回值类型作为重载函数的区分标准。
总结 重写和重载的区别
基础案例
package day04_0220;
/*
* inherit 继承
* extends 继承、扩展
* 人类 Person 类别较大 父类 super class
* 学生类型 Student 类别较小 子类 sub class
* 老师类型 Teacher 类别较小 子类 sub class
* java语言中,使用extends关键字,来描述类之间有继承关系
* 子类 extends 父类 子类 继承于/扩展于 父类,子类是对父类的延申
*
*/
public class inheritDemo {
public static void main(String[] args) {
Student s = new Student();
//System.out.println(s);
Teacher t = new Teacher("jack",23,'男',"js001");
//System.out.println(t.age);
}
}
//人类
class Person {
String name;
int age;
char gender;
public Person() {
System.out.println("执行Person()方法");
}
public Person(String name, int age, char gender) {
this.name = name;
this.age = age;
this.gender = gender;
System.out.println("执行Person(String name,int age,char gender)方法");
}
}
//学生类
class Student extends Person // 声明学生类,继承于人类。
{
// 可以在子类中,添加当前类特有的属性
String sno;
// 父类构造方法,不会从父类继承到子类
// 子类构造器中,会默认先调用父类的无参构造方法,以完成对 从父类继承下来属性的 赋值初始化的工作
public Student() {
super();
System.out.println("执行Student()方法");
}
public Student(String name, int age, char gender, String sno)
{
super(name,age,gender);
this.sno = sno;
}
}
class Teacher extends Person
{
String tno;
public Teacher() {
super();
System.out.println("执行Teacher()方法");
}
public Teacher(String name, int age, char gender, String tno)
{
super(name,age,gender);
this.tno = tno;
System.out.println("Teacher(String name, int age, char gender, String tno)");
}
}
package day04_0220;
public class inheritDemo2 {
public static void main(String[] args) {
Dog dog = new Dog("哈巴狗",'公',"京巴");
dog.showPet();//调用父类继承下来的方法
dog.showDog();
//向上造型
//一个子类型的对象 可以向上造型为 父类的类型
// 定义 父类的引用 指向 子类的对象
//将子类对象当作父类型来看待,不能再调用子类方法
Pet p = dog;//将狗对象当作宠物看待,不当作狗看待
p.showPet();//编译时会根据引用变量类型检查,是否有相应方法
//方法的重写/覆盖 Overwrite/Override
// 在子类中可以重写 从父类中继承来的方法
//要求:方法名,参数列表,和父类相同
p.cry();
//编译时,会根据引用变量类型,进行语法检查判断
//运行时,会调用具体对象的方法(调用到子类重写方法)
//运行时绑定,即运行时才绑定调用具体对象的方法
Cat cat = new Cat("小花",'母',"黄色");
cat.showCat();
cat.cry();
Pet c2 = cat;
//c2.cry();
}
}
class Pet {
String name;
char gender;
public Pet() {
System.out.println("执行Pet()");
}
public Pet(String name, char gender) {
super();
this.name = name;
this.gender = gender;
System.out.println("执行Pet(String name, char gender)");
}
public void showPet() {
System.out.println("名字:"+name+" 性别:"+gender);
}
public void cry() {
System.out.println(name + "在叫");
}
}
class Dog extends Pet{
String strain;
public Dog() {
System.out.println("执行Dog()");
}
public Dog(String name, char gender, String strain) {
super(name, gender);
this.strain = strain;
System.out.println("执行Dog(String name, char gender, String strain)");
}
public void showDog() {
//super.showPet();//明确调用父类showPet方法
showPet();
System.out.println("品种:"+strain);
}
public void cry() {
System.out.println(name + "在叫:汪!汪!汪!");
}
}
class Cat extends Pet{
String eyeColor;
public Cat() {
System.out.println("执行Cat()");
}
public Cat(String name, char gender, String eyeColor) {
super(name, gender);
this.eyeColor = eyeColor;
System.out.println("执行Cat(String name, char gender, String eyeColor)");
}
public void showCat() {
//super.showPet();//明确调用父类showPet方法
showPet();
System.out.println("颜色:"+eyeColor);
}
public void cry() {
System.out.println(name + "在叫:喵!喵!喵!");
}
}
数组
package day04_0220;
import java.util.Arrays;
public class ArrayDemo {
public static void main(String[] args) {
int[][] ary = new int[3][];
System.out.println(Arrays.toString(ary));
ary[0] = new int[] {10,20,30,14};
ary[1] = new int[] {13,24,564};
ary[2] = new int[] {1,3};
System.out.println(Arrays.toString(ary));
for (int i = 0; i < ary.length; i++) {
System.out.println(Arrays.toString(ary[i]));
}
}
}