java 基础知识十 继承和多态
继承
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 基础知识十 继承和多态的更多相关文章
- java基础知识(二)-----多态和构造函数
一:前言 最近由于面试了新浪公司,面试官问我的问题我都不知道,觉得自己好菜,所以最近决定再把java基础给搞一遍,真的觉得自己好菜.每天看一点,那个家伙说<java编程思想>最少要看三遍, ...
- java基础知识总结--继承和接口
什么是继承?什么是接口?他们之间的区别和联系是什么? 什么是继承? 继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能.多个类中存在相同属性和行 ...
- Java基础再复习(继承、多态、方法内部类**、HashMap用法**、参数传递**)
###继承: package com.shiyan; public class Animal { public int legNum; //动物四肢的数量 //类方法 public void bark ...
- java基础知识(7)---多态
多 态:(面向对象特征之一):函数本身就具备多态性,某一种事物有不同的具体的体现.体现:父类引用或者接口的引用指向了自己的子类对象.//Animal a = new Cat();多态的好处:提高了程序 ...
- Scanner、String(java基础知识十二)
1.Scanner的概述和方法介绍 * A:Scanner的概述 * 是一个从键盘输入的类,有final修饰,不能被子类继承 * Scanner sc = new Scanner(System.in) ...
- 包、修饰符、内部类、匿名内部类(java基础知识十)
1.package关键字的概述及作用 * A:为什么要有包 * 将字节码(.class)进行分类存放 * B:包的概述 * * C:包的作用 * 包名要定义在第一行, ...
- Java基础知识强化11:多态的两道基础题
1.第1题 class Base { public void method() { System.out.print("Base method"); } } class Child ...
- 集合框架、泛型、迭代(java基础知识十六)
1.ArrayList存储自定义对象并遍历 此类的 iterator 和 listIterator 方法返回的迭代器是快速失败的:在创建迭代器之后,除非通过迭代器自身的 remove 或 add 方法 ...
- 对象数组、集合、链表(java基础知识十五)
1.对象数组的概述和使用 * 需求:我有5个学生,请把这个5个学生的信息存储到数组中,并遍历数组,获取得到每一个学生信息. Student[] arr = new Student[5]; //存储学生 ...
随机推荐
- webstorm 编辑器破解 (麻麻再也不用担心过期了)
先去官网下载webstorm2016.1.3版本(目前只知道2016.1这个版本可以永久破解,不会过期) 再下载webstorm2016.1的破解补丁 将下载好的破解补丁解压,会有一个Jetbrain ...
- Node.js~在linux上的部署~外网不能访问node.js网站的解决方法
这是上一篇node.js部署到linux上的后续文章,当我们安装完node.js之后,建立了sailsjs的网站,然后在外面电脑上无法访问这个网站,这个问题我们如何去解决? 解决思路: 查看linux ...
- 对java数组的一些理解
刚开始学习Java的时候一直搞不清除获取数组的长度是用length()还是length,现在不妨来深入了解一下数组的真实面目. 我们不妨来看一下数组的源码,诶,数组的类名叫什么?我们声明一个int数组 ...
- for循环的表达规则,for循环的嵌套,跳转语句;穷举;迭代;异常处理
for循环的基本格式 for(表达式1:表达式2:表达式3) { 循环体: } for循环的四要素 表达式1就是变量初始化:表达式2就是循环条件:表达式3是状态改变 static void Main( ...
- 中软卓越IT培训:给IT程序员的18个忠告
1 .想清楚,写清楚,说清楚,才是真正的清楚! 2 .多花点时间沟通清楚需求,才能把握正确方向! 3 .修复需求错误的成本是代码错误的几十倍! 4 .程序员最大的坏习惯就是:急于动手写代码! 5 .提 ...
- wemall app商城源码中android按钮的三种响应事件
wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享wemall app商城源码中android按 ...
- 【阿里聚安全技术公开课】移动APP漏洞风险与解决方案
阿里云·云栖社区携手阿里聚安全打造阿里安全技术公开课,带你一探互联网安全的风采 关于移动APP安全 移动App是大家使用手机每天接触最多的东西,然而在移动APP开发中,由于一些开发工程师对安全的不重视 ...
- android 中判断WiFi是否可用的可靠方法 ,android 是否联网
http://alex-yang-xiansoftware-com.iteye.com/blog/619841 在一些程序中,需要从网上下载数据,或者通过其他方式对网络产生流量,当wifi不可用时应该 ...
- 带金属光泽的模型shader的实现
最近捣鼓了一下金属光泽的shader的实现,在一些高模展示的时候或者模型的金属部分的表现的时候,我们需要给模型添加一些金属光泽,表现出一个模型某些金属装备上有一定的反光.今天我主要写一种基于贴图实现的 ...
- 微信JS分享功能--微信JS系列文章(二)
概述 在上一篇文章微信JS初始化-- 微信JS系列文章(一)中已经介绍了微信JS初始化的相关工作,接下来本文继续就微信JS的分享功能进行描述,供大家参考. 代码 $(document).ready(f ...