1.重载

子类覆写父类的方法称为重载Override。

父类和子类拥有一摸一样的方法(方法的名字、返回值、参数是相同的,但是方法的语句是不一样的)

  • 方法签名如果不同就不是重载,而是创建了一个新的方法。
  • 加上@Override可以让编译器帮助检查是否进行了正确的覆写
  • @Override不是必需的

    Person.java
public class Person /*extends Object */{
protected String name;
private int age;
public Person(){
this.name = "王重阳";
}
public Person(String name){
this.name = name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return this.age;
}
public void run(){
System.out.println(name+" is running!\n");
};
}

Student.java

public class Student extends Person{
private int score;
public Student(String name){
super(name);
}
public Student(){
super();
}
public int getScore(){
return this.score;
}
public void setScore(int score){
this.score = score;
}
@Override
public void run(){
System.out.printf("Student %s is running\n", name);
}
}

Hello.java

public class Hello {
public static void main(String[] args){
//Person和Student拥有相同的run方法,
Person s = new Student("张三丰");
Person p = new Person();
s.run();
p.run();
}
}


# 2.多态
引用变量的声明类型可能与其实际类型不符。如s是Person引用类型的变量,但其指向的实例是Student类型实例。从运行结果得出,实例对象的方法调用总是对应实际类型。Java的实例方法调用是基于运行时实际类型的动态调用。这种动态调用成为多态。
* 多态是针对某个类型的方法调用,其真正执行的方法取决于运行时期实际类型的方法。
* 对某个类型调用某个方法,执行的方法可能是某个子类的覆写方法
* 利用多态,允许添加更多类型的子类实现功能扩展。

Object定义的几个重要方法:

  • toString:把instance输出为String
  • equals:判断两个instance是否逻辑相等
  • hashCode:计算一个instance的哈希值

Person.java使用Object的toString方法

public class Person /*extends Object */{
protected String name;
private int age;
public Person(){
this.name = "王重阳";
}
public Person(String name){
this.name = name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return this.age;
}
public void run(){
System.out.println(name+" is running!\n");
};
}

Person.java覆写toString方法

public class Person /*extends Object */{
protected String name;
private int age;
public Person(){
this.name = "王重阳";
}
public Person(String name){
this.name = name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return this.age;
}
public void run(){
System.out.println(name+" is running!\n");
};
public String toString(){
return "Person "+this.name;
}
}

Hello.java


public class Hello {
public static void main(String[] args){
Person p = new Person();
System.out.println(p);
System.out.println(p.toString());
}
}

覆写前和覆写后的Person,分别运行Hello.java。



3.super可以调用父类的被Override的方法

Person.java

public class Person /*extends Object */{
protected String name;
private int age;
public Person(){
this.name = "王重阳";
}
public Person(String name){
this.name = name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return this.age;
}
public void run(){
System.out.println(name+" is running!");
};
}

Student.java

public class Student extends Person{
private int score;
public Student(String name){
super(name);
}
public Student(){
super();
}
public int getScore(){
return this.score;
}
public void setScore(int score){
this.score = score;
}
@Override
public void run(){
super.run();
System.out.printf("Student %s is running\n", name);
}
}

Hello.java

public class Hello {
public static void main(String[] args){
Person s = new Student();
s.run();
}
}


# 4.final
* 用final修饰的方法不能被Override
* 用final修饰的类不能被继承
* 用final修饰的字段在初始化后不能被修改
```#java
public class Person{
public final void serName(String name){ }
}
public final class Student{
private final int score;
}
```
# 5.总结:
* 子类可以覆写父类的方法Override
* 覆写在子类中,改变了父类方法的行为
* 多态:Java的方法调用总是作用于对象的实际类型
* final修饰的方法可以阻止被覆写
* final修饰的class可以阻止被继承
* final修饰的field必须在创建对象时初始化

廖雪峰Java2面向对象编程-3继承和多态-2多态的更多相关文章

  1. 廖雪峰Java2面向对象编程-3继承和多态-1继承

    1.继承 继承是一种代码复用的方式. Student与Person有相同部分的代码. Student可以从Person继承,这样Student获得了Person的所有功能,只需要编写新增的功能即可.通 ...

  2. 廖雪峰Java2面向对象编程-1面向对象-1面向对象基础

    1.对象的概念 面向对象编程:Object-Oriented Programming 对现实世界建立计算机模型的一种编程方法. 现实世界 计算机模型 Java代码 人 类/class class Pe ...

  3. 廖雪峰Java2面向对象编程-4抽象类和接口-2接口

    1.接口的定义 抽象方法本质上是定义接口规范. 在抽象类中定义了一个抽象方法,子类中必须实现这个抽象方法. public abstract class Person{ public abstract ...

  4. 廖雪峰Java2面向对象编程-4抽象类和接口-1抽象类

    每个子类都可以覆写父类的方法 如果父类的方法没有实际意义,能否去掉方法的执行语句?子类会报编译错误 如果去掉父类的方法,就失去了多态的特性 可以把父类的方法声明为抽象方法. 如果一个class定义了方 ...

  5. 廖雪峰Java2面向对象编程-6Java核心类-6常用工具类

    1.Math Math提供了数学计算的静态方法 序号 方法 描述 1 abs() 返回参数的绝对值.Math.abs(-9)//9 2 ceil() 返回大于等于( >= )给定参数的的最小整数 ...

  6. 廖雪峰Java2面向对象编程-6Java核心类-5枚举类

    直接定义常量 public class Weekday { //定义int常量 public static final int SUN = 0; public static final int MON ...

  7. 廖雪峰Java2面向对象编程-6Java核心类-3包装类型

    Java的数据类型: 基本类型:int boolean float 引用类型:所有class类型 为一个基本类型int赋值为null,会提示"incompatible types" ...

  8. 廖雪峰Java2面向对象编程-5包和classpath-3作用域

    1.访问权限 Java的类.接口.字段和方法都可以设置访问权限 访问权限是指在一个类的内部,能否引用另一个类以及访问它的字段和方法 访问权限有public.protected.private和pack ...

  9. 廖雪峰Java2面向对象编程-6Java核心类-4JavaBean

    1.JavaBean定义 符合以下命名规范的class被成为JavaBean private 类型的field 针对这个field的get和set方法 public class Person { pr ...

随机推荐

  1. django cookie与session组件

    本文目录 1 会话跟踪技术 2 cookie介绍 Django中操作Cookie Session Django中Session相关方法 Django中的Session配置 CBV中加装饰器 回到目录 ...

  2. mac电脑读写NTFS格式的移动硬盘命令

    diskutil info /Volumes/SAMSUNG | grep UUID echo "UUID=38EBE5E4-016F-44B7-9D55-BB4AF6DC3E1D none ...

  3. LA3485 Bridge

    题意 PDF 分析 以<训练指南>上的分析为准. 二分法时间复杂度\(O(\log v)\) 代码 #include<bits/stdc++.h> #define rg reg ...

  4. 【转载】Win10桌面图标有小箭头怎么去掉?Win10去掉桌面图标小箭头的方法

    以下文章转载至系统之家 网址:http://www.xitongzhijia.net/xtjc/20190104/146560.html Win10桌面图标有小箭头怎么去掉?Win10去掉桌面图标小箭 ...

  5. Add task bar to ubuntu

    http://www.howtogeek.com/189819/how-to-add-a-taskbar-to-the-desktop-in-ubuntu-14.04/ sudo apt-get in ...

  6. 預約申領往來港澳通行證及簽注x

    http://www.ctshk.com/passport/talent_bookrep.htm 換領往來港澳通行證和申請簽注延期須知 為方便持<往來港澳通行證>以內地逗留簽注在香港工作. ...

  7. ES9新特性

    这篇文章主要介绍ES2018(ES9)的新特性, 以及使用方法 JS是一门跨平台的语言, ES6也就是ECMAScript 2015 花费了5年的时间敲定, 是一次非常大的改版, 之后每年都有一个小版 ...

  8. taro 列表渲染

    元素的 key 在他的兄弟元素之间应该唯一 数组元素中使用的 key 在其兄弟之间应该是独一无二的.然而,它们不需要是全局唯一的.当我们生成两个不同的数组时,我们可以使用相同的 key key 的取值 ...

  9. node-sass 安装失败的原因及解决办法

    出处:https://segmentfault.com/a/1190000010984731 windows 上用 yarn add node-sass --dev 也可以安装上.

  10. java Collections.sort()

    sort()是Collections中的静态方法,用于对List容器中的元素排序. 如容器list中存储的是Integer对象 List<Integer> list =Arrays.asL ...