1.为何需要继承? 先念一遍定义?:利用继承,人们可以基于已存在的类构造一个新类。继承已存在的类就是复用(继承)这些类的方法和属性。在此基础上,还可以添加一些新的方法和属性,以满足新的需求。这是Java程序设计中的一项核心技术。 举个具体的栗子:我们有一个Employee类来表示公司的员工,这个公司中经理的待遇与普通雇员的待遇存在这一些差异。不过,他们之间也存在这很多相同的地方例如,他们都领薪水。只是普通的员工在完成本质工作后仅领取薪水,而经理在完成了预期的业绩之后还能得到奖金。这种情况就需要使用继承。这是因为需要为经理定义一个新类Manager,以便增加一些新功能。但可以重用Employee类中已经编写的部分代码。 敲黑板了,下面是具体的格式。 //创建一个Manager类继承employee类//关键字:extends(继承)public class Manager extends Employee{ private double bonus; ...//此处省略 public void setBonus(double bonus) { this.bonus = bonus; }}
关键字extends表明正在构造的新类派生于一个已存在的类。已存在的类称为超类、基类或父类(Employee);新类称为子类(Manager)。 2.继承到了什么? 现在我们先写父类(Employee)与子类(Manager)的代码 //定义父类public class Employee{ public String name; private int id; private double salary; public void setName(String name){ this.name = name;} public void Name(){ System.out.println("Employee类中的方法,员工名是"+name);} public double getSalary(){ return salary;} public int getId(){ return id;}}//创建一个子类Managerpublic class Manager extends Employee{ private double bonus; public void setBonus(double bonus){ this.bonus = bonus;} public static void main(String[] args){ Manager m1 = new Manager(); //调用方法:这些方法是从父类中继承来的 m1.setName("张三"); m1.Name();} }
Manager类时Employee类的子类,当Manager继承了Employee后,Manager中就自动具有了Employee中定义的属性和方法。 如运行下列代码: 程序输出如下: 这就证明,我们创建的Manager对象调用Name方法时,实际上时调用它从父类中继承来的方法: 当然,Manager类中还可以再定义他自己特有的方法,以此来应对不同的情况。 - 注意:对于子类特有的方法,一定是子类类型的对象才能调用,如我们定义的setBonus方法,必须是Manager类型的对象才能调用!
3.自动转型与强制转型 当Manager类继承Employee类后,我们可以这样说:一个Manager的对象一定是一个Employee对象。所以我们可以在程序这如此表述: 自动转型示例:// Employee E1 = new Manager(); public static void main(String[] args){ //创建一个Manager类对象,将对象类型定义为Employee类型 Employee E1 = new Manager(); E1.setName("我是张三"); E1.Name(); //子类转型为父类类型后不能调用子类特有的方法 E1.setBonus(50); //false //将父类类型的对象强制转成子类类型 Manager E2 = (Manager)E1; //强制转型后我们就可以调用子类特有的方法了 E2.setBonus(50);}
如上例所述:如果一个对象被自动转型为父类类型后还想调用子类特有的方法,则必须要强制转型。 - 注意:如果一个对象可以被强制转型,那么肯定是在前面某个地方被自动转型过!
4.方法的重写 子类继承父类后,就可以直接调用父类中的方法,但是在很多时候,父类定义的只是一个很抽象的方法,无法精细具体地解决问题,或者是不同的情况,这个方法需要变通。比如说大学生和小学生都要学习,但是学的方法和内容都不一样。那这种情况怎么办呢? 这个时候有一个办法叫做方法的重写。即子类可以据需要来重写定义父类中的方法。 代码示例: public class Manager extends Employee{ //重写父类中的Name方法 public void Name(){ System.out.println(name+"经理是这个部门的主管。");}}
调用后的输出结果是: 这个时候有人就会问了访问权限是啥子? 现在我来简述一下访问权限的种类及区别: default是默认的意思,就是你省略不打时的状态。 2. 返回值类型 方法名 (参数类型 x,参数类型 y, ... ){ } 上述格式中的”返回值类型“,”方法名“ 及 ”参数类型“都得与父类中的方法保持一致。 重写的是方法体。
5.多态的概念 多态是指由于继承和重写机制,相同类型的对象调用相同的方法,得到的结果可能不一样。 在前面的例子中Manager对象和Employee对象我们都可以认为是Employee对象,他们都在调用Name()方法,但是结果可能不一样,这是因为每个子类对象都可能会重写了这个方法。 |