继承

1、定义:

    继承是指声明一些类,可以再进一步声明这些类的子类,而子类具有父类已经拥有的一些方法和属性,这跟现实中的父子关系是十分相似的,所以面向对象把这种机制称为继承

    继承就是在现有类的基础上构建新类以满足新的要求

    子类==派生类,子类只能有一个父类,父类可以有多个子类

    注意:final类 方法 变量 不能被继承

2、声明:class 子类 extends 父类

    比如:public class VipUser extends User

    注意:子类构造函数是层层父类构造函数的调用,从最顶层的基类开始往下一层层的调用默认构造函数

	public VipUser(){
super();// 调用父类的构造函数
System.out.println("子类构造器");
}
public VipUser(String name){
// super("vip"+name);// 调用父类的构造函数 如果不调用的话 就会默认调用父类无参数构造器
System.out.println("子类有参数构造器");// 子类构造器内容
}

多态

    指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)

    多态的实现:接口实现,继承父类进行方法重写,同一个类中进行方法重载。(接口下篇再讲)

3、方法重载和重写(覆盖)

  覆写(重写):

    父类的方法被子类重写,使用override ,如需使用父类中原有的方法,可使用super关键字

    子类访问权限大于等于父类方法访问权限 并且重写方法只能重写父类非私有的方法

    子类抛出异常小于等于父类方法抛出异常

    子类返回值类型和父类相同

    方法名相同参数类型相同

    不同类,继承父类与父类有所不同

  重载:同一个类中方法名相同参数类型不一致或者参数数量不一致

    可以抛出不同的异常

    可以有不同的访问修饰符

    参数类型不一致或者参数数量不一致

    方法名相同

    同一个类中

4、绑定

    前提是继承关系  子类并复写了父类的方法

    子类和父类存在同一个方法,子类重写了父类的方法,程序运行时选择调用何种方法实现或者变量的操作叫做绑定

  静态绑定:早期绑定,发生在编译时期

    使用private或static或final修饰的变量或者方法

    静态绑定使用类信息来完成

    重载(Overload)的方法使用静态绑定完成

  动态绑定:后期绑定,发生在运行时  1、有继承2、有重写3、父类引用指向子类对象

    在执行期间(而非编译期间)判断所引用对象的实际类型,根据其实际类型调用其相应的方法可以被子类重写的方法也称为虚方法

    动态绑定则需要使用对象信息来完成

    重写(Override)的方法则使用动态绑定完成

动态绑定使用方式:

父类   父类引用 =new 子类();

    父类引用.method();   //该method方法在子类被覆写  此时调用的是子类的method

附:

public class TestVipUser {

	/**
* @param args
*/
public static void main(String[] args) {
/*
* 动态绑定过程
* 创建父类引用 并指向子类对象
* 通过父类引用调用子类覆写的方法
*/
User user=new VipUser();
user.speak(); /*
* 静态绑定过程
* 根据参数选择protected void speak(String name){
* 还是 protected long speak(int age)
*/
User user1=new User();
user1.speak(11);
}
}

User

public class User {

	// 静态变量
public static String nationality = "china";
// 非静态变量
public String name;
private int age; public User(){
System.out.println("父类构造器");
}
// 带参数构造函数
public User(String name){
// this 的使用
this.name=name;
System.out.println("父类有参数构造器");
} /*
* 方法重载
* 同一类中
* 方法名一直
* 参数类型不一致或者参数数量不一致
*/
public void speak(){
System.out.println("汉语");
}
protected void speak(String name){
System.out.println(name);
} protected void speak(String name,String age) throws RuntimeException{ //参数数量不一致
System.out.println(name+age);
} protected long speak(int age) { // 参数类型不一致
System.out.println(age+"");
return age;
} // 不能被继承
public static final String getNation(){
return "china";
} // 静态方法
public static String getNationality() {
return nationality;
}
public static void setNationality(String nationality) {
User.nationality = nationality;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
} }

VipUser

public class VipUser extends User{

	private  int vipCode;

	public VipUser(){
super();// 调用父类的构造函数
System.out.println("子类构造器");
}
public VipUser(String name){
// super("vip"+name);// 调用父类的构造函数 如果不调用的话 就会默认调用父类无参数构造器
System.out.println("子类有参数构造器");// 子类构造器内容
} //覆写父类方法 参数列表必须完全与被重写的方法相同
@Override
public void speak() {
System.out.println("chinese");
}; //父类是protect 子类是public
@Override
public void speak(String name) {
System.out.println(name);
}; // 不能抛出其他异常 只能是父类异常的子类 ClassCastException是RuntimeException的子类
@Override
protected void speak(String name, String age) throws ClassCastException {
System.out.println(name+age);
}; // 子类返回值类型和父类相同
@Override
protected long speak(int name) {
return name;
}; public int getVipCode() {
return vipCode;
} public void setVipCode(int vipCode) {
this.vipCode = vipCode;
} }

java 基础知识十 继承和多态的更多相关文章

  1. java基础知识(二)-----多态和构造函数

    一:前言 最近由于面试了新浪公司,面试官问我的问题我都不知道,觉得自己好菜,所以最近决定再把java基础给搞一遍,真的觉得自己好菜.每天看一点,那个家伙说<java编程思想>最少要看三遍, ...

  2. java基础知识总结--继承和接口

    什么是继承?什么是接口?他们之间的区别和联系是什么? 什么是继承? 继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能.多个类中存在相同属性和行 ...

  3. Java基础再复习(继承、多态、方法内部类**、HashMap用法**、参数传递**)

    ###继承: package com.shiyan; public class Animal { public int legNum; //动物四肢的数量 //类方法 public void bark ...

  4. java基础知识(7)---多态

    多 态:(面向对象特征之一):函数本身就具备多态性,某一种事物有不同的具体的体现.体现:父类引用或者接口的引用指向了自己的子类对象.//Animal a = new Cat();多态的好处:提高了程序 ...

  5. Scanner、String(java基础知识十二)

    1.Scanner的概述和方法介绍 * A:Scanner的概述 * 是一个从键盘输入的类,有final修饰,不能被子类继承 * Scanner sc = new Scanner(System.in) ...

  6. 包、修饰符、内部类、匿名内部类(java基础知识十)

    1.package关键字的概述及作用 * A:为什么要有包     * 将字节码(.class)进行分类存放  * B:包的概述     *   * C:包的作用     * 包名要定义在第一行,   ...

  7. Java基础知识强化11:多态的两道基础题

    1.第1题 class Base { public void method() { System.out.print("Base method"); } } class Child ...

  8. 集合框架、泛型、迭代(java基础知识十六)

    1.ArrayList存储自定义对象并遍历 此类的 iterator 和 listIterator 方法返回的迭代器是快速失败的:在创建迭代器之后,除非通过迭代器自身的 remove 或 add 方法 ...

  9. 对象数组、集合、链表(java基础知识十五)

    1.对象数组的概述和使用 * 需求:我有5个学生,请把这个5个学生的信息存储到数组中,并遍历数组,获取得到每一个学生信息. Student[] arr = new Student[5]; //存储学生 ...

随机推荐

  1. SVN的具体使用方法介绍(安装以及操作)

    今天由于项目的需要安装了SVN,在这里和大家分享一下SVN安装的详细过程和分享一些资料. (1)首先是客户端的安装. 1)获取客户端安装包. --安装包的获取路径: TortoiseSVN的官方下载地 ...

  2. Socket的应用案例

    java提供网络功能的四大类1.InetAddress :用于标识网络上的硬件资源.2.URL:统一资源定位符,通过URL可以直接读取和写入网络上的数据.3.Socket:使用TCP协议实现网络通信的 ...

  3. 第28篇 js中let和var

      let与var 在js中声明一个变量除了一个var 还有一个let的声明.对于var 在前面的作用域中已经讲过,这次主要说下二者的区别: 在MDN上有这样的一个demo: var list = d ...

  4. Number()、parseInt()、parseFloat()的区别

    最近在一个项目中遇到:需要在前台页面用javascript去处理很数值的计算. 各种用法都有,为了统一且保证处理方式正确,特地总结了一下相关的数值转换的用法: 作用: Number():可以用于任何数 ...

  5. 用C#代码实现类似QQ窗体的“上、左、右”停靠功能

    大家都知道QQ有一个自动停靠功能,即“上.左.右”,当你把窗体拖到屏幕边缘,然后移开鼠标它会自动缩放,然后只显示一小小点出来,我们仔细观察会发现其实它只露3像素左右的边缘,当你鼠标移上去它又会伸出来, ...

  6. Jmeter+Badboy实战经验三 Jmeter关联相关知识

    1. 什么时候需要使用关联? 有些参数是动态变化的,获取之后,再次操作的时候,参数的值已经发生了变化,这种情况下就会出现脚本不可运行的问题,就需要用到了关联 2. 关联是什么概念? 3.jmeter ...

  7. [LeetCode]Rotate Image(矩阵旋转)

    48. Rotate Image     Total Accepted: 69437 Total Submissions: 198781 Difficulty: Medium You are give ...

  8. 1059: [ZJOI2007]矩阵游戏

    1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2154  Solved: 1053[Submit][Stat ...

  9. ubuntu auto mount自动挂载硬盘

    Ubuntu 挂载的文章在网上也不少,推荐一个: http://wenku.baidu.com/link?url=N2c7axijp_KYaYkt2CrZFNZPzzS8xBHLQSTUcI2F85I ...

  10. (转载)一个生动的NIO描述

    原文地址:http://blog.csdn.net/zhouhl_cn/article/details/6568119 传统的socket IO中,需要为每个连接创建一个线程,当并发的连接数量非常巨大 ...