继承&多态
继承:
概念:
基类,超累,父类
访问权限:
Public :无限制,自由访问
Private:不可继承
protected :包内,包外,可访问,继承
default:没有指明任何权限下,默认在同一包内,可访问
构造方法:
子类调用父类构造方法
Super(参数);//必须为子类构造方法的第一句。!!
原因:在创建子类对象时,先要构造父类,也就是初始化子类先初始化父类。在继承下,没有构造父类,就没有子类,会抛出异常。Java虚拟机一般会默认构造父类(初始化父类)。
Final-不可继承的类
Final声明的变量不可更改;
Final声明的方法不可覆盖(重写);
Final声明的类不可继承,只读。
子类与父类方法的联系
1扩展:增加父类没有的方法
2覆盖(重写):同名同参。不能覆盖final,static的方法
3重载:同名不同参。
例

分析:fruit继承了object类,并重写了toString()方法。在“+”后引用一个对象名,系统默认会调用toString()方法。此方法返回“类名 @ + hashCode”。
多态
***
父类(或接口)对象可引用子类(实现接口的类)对象
***
1子类可以给父类赋值;
Class Animal{}
Class Dog extends Animal{}
Animal an=new Dog();//可以
2父类要强制转换后给子类赋值;
3可以用instanceof运算符判断对象是否可以转换
Object obj instanceof String;true or fause;
例1:
Class Animal{}
Class Dog extends Animal{}
Class Cat extends Animal{}
Animal an=new Animal();
Dog dog=new Dog();
Cat cat=new Cat();
an=dog;//对
dog=an;//错
dog=(dog)an;//对
dog=cat;//错
dog=(dog)cat;//错,Cat和Dog两个类没有继承关系
例2:子类父类相互调用变量方法
class father1{
public int num=100;
public void show() {
System.out.println("father."+num);
}
}
class son extends father1{
public int num=200;
public void show() {
System.out.println("son."+num);
}
}
public class Father {
public static void main(String args[]) {
son s=new son();
father1 fa1=new father1();
father1 fa2=new son();
fa1.show();//自己的方法
s.show();//子类自己的方法
fa2.show();//引用子类对象,调用子类的方法
fa1=s;//子类赋给父类对象,调用子类方法
fa1.show();
fa1.num++;//父类字段改变
System.out.println(fa1.num);
fa1.show();
((son)fa1).num++;//改变子类字段
System.out.println(fa1.num);
fa1.show();//改变了子类的变量
}
}
总结:
1;子类与父类有相同的方法时;子类对象用自己的(相当于子类重载了父类的同名方法),父类对象调用自己的方法。父类引用子类对象时调用子类的方法。
2:子类与父类有同名的字段(变量)时;父类用父类的,子类用子类的(子类的变量会隐藏或代替父类变量,如果要调用父类变量时可以用super)。
3((son)father).num++;改变了子类的变量;先将父类对象转换为子类对象,后改变子类变量。
例3:
import java.util.Vector;
class Animal{
public void eat() {
System.out.println("");
}
}
class Lion extends Animal{
public void eat() {
System.out.println("肉");
}
}
class Monkey extends Animal{
public void eat() {
System.out.println("香蕉");
}
}
class Bird extends Animal{
public void eat() {
System.out.println("米");
}
}
public class Feeder {
public void feed(Vector<Animal> v) {
for(Animal an:v) {
an.eat();
}
}
public static void main(String[] args) {
Feeder feeder=new Feeder();
Vector<Animal>temp=new Vector();
//加一个狮子
temp.add(new Lion());
//加2个猴子
for(int i=0;i<2;i++) {
temp.add(new Monkey());
}
//加3个鸟
for(int i=0;i<3;i++) {
temp.add(new Bird());
}
feeder.feed(temp);
}
}
结果截图:

多态编程两种主要形式
1:继承多态。例3
2:接口多态。使用接口代替抽象基类。
抽象abstract---------------------------多态&继承
例
Abstract class ASS{
Public void show(){
}
}
三种类型:
1. 直接定义了一个抽象类
2. 继承了一个抽象类,但没有完全实现父类方法(必须实现所有方法)
3. 实现了一个接口,但没有完全实现此接口中的方法
创建对象:
抽象类不能直接创建对象
可引用子类对象。
例1:
abstract class ab1{
public void show(int a) {
}
}
abstract class ab2 extends ab1{
public void showw(float f) {
}
}
class ab3 extends ab2{
public void show(int a) {
System.out.println("1-"+a);
}
public void showw(float f) {
System.out.println("2-"+f);
}
}
public class Abstractx {
public static void main(String args[]) {
ab3 xx=new ab3();
xx.show(1);
xx.showw(11);
ab2 x=new ab3();
x.showw(2);
x.show(3);
ab1 xxx=new ab3();
xxx.show(4);
//xxx.showw(11);错,ab1类中没有showw()方法
}
}
例2:
abstract class Animal2{
public void show() {
}
}
class Cat extends Animal2{
public void show() {
System.out.println("喵");
}
}
class Dog extends Animal2{
public void show() {
System.out.println("汪");
}
}
public class Abstractx {
public static void main(String args[]) {
Animal2 x=new Cat();
x.show();
Animal2 xx=new Dog();
xx.show();
}
}
接口(不是类)
定义:Interface,实现:implements
(自动的)成员变量:static ,final,成员方法:public
接口可以继承接口
例:
interface Face1{
void show();
void show2();
void show3();
}
class Achieve implements Face1{
public void show() {
System.out.println("show");
}
public void show2() {
System.out.println("show2");
}
public void show3() {
}
}
public class InterFace1 {
public static void main(String args[]) {
Achieve ac=new Achieve();
ac.show();
ac.show2();
Face1 face=new Achieve();
face.show();
face.show2();
}
}
继承&多态的更多相关文章
- Winform打砖块游戏制作step by step第5节---重构代码,利用继承多态
一 引子 为了让更多的编程初学者,轻松愉快地掌握面向对象的思考方法,对象继承和多态的妙用,故推出此系列随笔,还望大家多多支持. 二 本节内容---重构代码,利用继承多态 1. 主界面截图如下: 2. ...
- java面向对象(封装-继承-多态)
框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...
- 浅谈学习C++时用到的【封装继承多态】三个概念
封装继承多态这三个概念不是C++特有的,而是所有OOP具有的特性. 由于C++语言支持这三个特性,所以学习C++时不可避免的要理解这些概念. 而在大部分C++教材中这些概念是作为铺垫,接下来就花大部分 ...
- No2_4.接口继承多态_Java学习笔记_经典案例
import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collections; import jav ...
- Java继承多态中的方法访问权限控制
java中的方法天生具有继承多态特性,这点与C++有很大不同(需要在父类方发上加virtual关键字),但用起来确实方便了许多. 最简单的继承多态 声明一个接口BaseIF,只包含一个方法声明 pub ...
- Java三大特性(封装,继承,多态)
Java中有三大特性,分别是封装继承多态,其理念十分抽象,并且是层层深入式的. 一.封装 概念:封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别:将抽象得到的数据 ...
- Java开发知识之Java的继承多态跟接口*
Java开发知识之Java的继承多态跟接口 一丶继承 1.继承的写法 在Java中继承的 关键字是 extends 代表一个类继承另一个类. 继承的含义以及作用: 继承就是基于某个父类的扩展.制定出来 ...
- -1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口 区别 多态 包 访问权限 内部类 匿名内部类 == 与 equal
java是纯粹的面向对象的语言 也就是万事万物皆是对象 程序是对象的集合,他们通过发送消息来相互通信 每个对象都有自己的由其他的对象所构建的存储,也就是对象可以包含对象 每个对象都有它的类型 也就是 ...
- python面向对象之继承/多态/封装
老师说,按继承/多态/封装这个顺序来讲. 子类使用父类的方法: #!/usr/bin/env python # coding:utf-8 class Vehicle: def __init__(sel ...
- java继承多态和抽象类接口
一.继承 通过扩展一个已有的类,并继承该类的属性和行为,来创建一个新的类.已有的称为父类,新的类称为子类(父类派生子类,子类继承父类).(1)继承的优点: ①代码的可重用性: ②父类的属性 ...
随机推荐
- 锁存器 Latch v.s. 触发器 Flip-Flop
转载 http://guqian110.github.io/pages/2014/09/23/latch_versus_flip_flop.html 根据 Wiki: Flip-flop (elec ...
- url出现特殊字符,需要进行编码
1) 网络访问请求:中文空格字符编码/解码 stringByAddingPercentEscapesUsingEncoding(只对 `#%^{}[]|\"<> 加空格共14个字 ...
- DotNetBar笔记
1.TextBoxDropDown 这是一个绝对TMD坑爹的狗屁玩意儿.键盘的四个事件全部不好使.但是这个玩意儿有个好处就是他的DropDownControl属性可以用来制作ComboGrid. 然 ...
- 机器学习:模型泛化(L1、L2 和弹性网络)
一.岭回归和 LASSO 回归的推导过程 1)岭回归和LASSO回归都是解决模型训练过程中的过拟合问题 具体操作:在原始的损失函数后添加正则项,来尽量的减小模型学习到的 θ 的大小,使得模型的泛化能力 ...
- Ubuntu14.04LTS上安装Pip
pip是一个安装和管理Python包的工具.在Pip的帮助下,你可以安装独特版本的包. 最重要的是,Pip可以通过一个“requirements”的工具来管理一个由包组成的列表和版本号. Pip很像e ...
- 2016.7.10 SqlServer语句中类似decode、substr、instr、replace、length等函数的用法
Decode() 对应 case when函数 case CHARINDEX('/',start_point_name) when 0 then start_point_name else subst ...
- Android 音频播放分析笔记
AudioTrack是Android中比较偏底层的用来播放音频的接口,它主要被用来播放PCM音频数据,和MediaPlayer不同,它不涉及到文件解析和解码等复杂的流程,比较适合通过它来分析Andro ...
- 【转】TinyMCE(富文本编辑器)
效果预览:http://www.tinymce.com/tryit/full.php [转]TinyMCE(富文本编辑器)在Asp.Net中的使用方法 转自:http://www.cnblogs.co ...
- setAttribute这个方法
setAttribute这个方法,在JSP内置对象session和request都有这个方法,这个方法作用就是保存数据,然后还可以用getAttribute方法来取出.比如现在又个User对象,Use ...
- ssh整合思想
整合过程: