多态&抽象&继承

多态

package cn.itcast.extend;
public class ExtendDemo2 {
	public static void main(String[] args) {
		A a=new B();//多条
		System.out.println(a.num);
		a.show();//非静态
		a.say();//静态方法
	}
}
class A{
	int num=10;
	//静态方法
	public static void say(){
		System.out.println("父类"+"A");
	}
	//非静态方法
	public void show(){
		System.out.println("父类"+num);
	}
}
class B extends A{
	int num=20;
	//静态方法
	public static void say(){
		System.out.println("子类"+"B");
	}
	//非静态方法
	public void show(){
		System.out.println("子类"+num);
	}
}

关于多态:

成员变量:编译看左边,运行看右边

非静态函数:编译看左边,运行看右边

静态函数:编译看左边,运行看右边

解释上述代码:

A a=new B();父类=子类;

a.num调用的是父类的变量.

a.show()调用的是子类的方法

a.say()调用的是父类的。因为静态变量或者静态函数是随着类的加载而加载的.

抽象类

抽象类的特点:

A:抽象类和抽象方法必须用abstract关键字修饰

B:抽象类中不一定有抽象方法,但是有抽象方法的类必须定义为抽象类

C:抽象类不能实例化

因为它不是具体的。

抽象类有构造方法,但是不能实例化?构造方法的作用是什么呢?

用于子类访问父类数据的初始化

D:抽象的子类a:如果不想重写抽象方法,该子类是一个抽象类。b:重写所有的抽象方法,这个时候子类是一个具体的类。

抽象类的实例化其实是靠具体的子类实现的。是多态的方式。

Animal a = new Cat();

抽象类的成员特点:

成员变量:既可以是变量,也可以是常量。

构造方法:有。

用于子类访问父类数据的初始化。

成员方法:既可以是抽象的,也可以是非抽象的。

抽象类的成员方法特性:

A:抽象方法 强制要求子类做的事情。

B:非抽象方法 子类继承的事情,提高代码复用性。

一个类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?

A:可以。

B:不让创建对象。

abstract不能和哪些关键字共存?

private
冲突 定义为抽象就是为了让子类重写,因此不能与private共存

final 冲突 定义为final就不能被子类重写,因此不能与final共存

static
无意义 因为如 public static abstract void show();这样定义可以直接被类名.show()调用,但是没有方法体.因此毫无意义可言!

接口:

接口的特点:

A:接口用关键字interface表示

interface 接口名 {}

B:类实现接口用implements表示

class 类名 implements 接口名 {}

C:接口不能实例化

那么,接口如何实例化呢?

按照多态的方式来实例化。

D:接口的子类

a:可以是抽象类。但是意义不大。

b:可以是具体类。要重写接口中的所有抽象方法。(推荐方案)

接口成员特点

成员变量;只能是常量,并且是静态的。

默认修饰符:public static final
你写不写都有

建议:自己手动给出。

构造方法:接口没有构造方法。

成员方法:只能是抽象方法。

默认修饰符:public abstract 你写不写都有

建议:自己手动给出。

所有的类都默认继承自一个类:Object。

类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。

那么既然接口没有构造方法,实现类中中构造方法的super()调用的就是Object这个超类中的构造方法

类与类:

继承关系,只能单继承,可以多层继承。

类与接口:

实现关系,可以单实现,也可以多实现。

并且还可以在继承一个类的同时实现多个接口。

接口与接口:

继承关系,可以单继承,也可以多继承。

总结:

抽象类和接口的区别:

A:成员区别

抽象类:

成员变量:可以变量,也可以常量

构造方法:有

成员方法:可以抽象,也可以非抽象

接口:

成员变量:只可以常量

成员方法:只可以抽象

B:关系区别

类与类

继承,单继承

类与接口

实现,单实现,多实现

接口与接口

继承,单继承,多继承

C:设计理念区别

抽象类 被继承体现的是:”is a”的关系。抽象类中定义的是该继承体系的共性功能。

接口 被实现体现的是:”like a”的关系。接口中定义的是该继承体系的扩展功能。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-16 14:19:48

多态&抽象&继承的相关文章

七:Java之封装、抽象、多态和继承

本文章介绍了关于Java中的面向对象封装.抽象.继承.多态特点 Java面向对象主要有四大特性:封装.抽象.继承和多态. 一.封装 封装就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成"类",其中数据和函数都是类的成员. 在面向对象语言中,封装特性是由类来体现的,我们将现实生活中的一类实体定义成类,其中包括属性和行为(在Java中就是方法),就好像人类,可以具有name,sex,age等属性,同时也具有eat(),sle

深入浅出OOP(四): 多态和继承(抽象类)

在本文中,我们讨论OOP中的热点之一:抽象类.抽象类在各个编程语言中概念是一致的,但是C#稍微有些不一样.本文中我们会通过代码来实现抽象类,并一一进行解析. 深入理解OOP(一):多态和继承(初期绑定和编译时多态) 深入理解OOP(二):多态和继承(继承) 深入理解OOP(三):多态和继承(动态绑定和运行时多态) 深入理解OOP(四):多态和继承(C#中的抽象类) 深入理解OOP(五):C#中的访问修饰符(Public/Private/Protected/Internal/Sealed/Cons

多态公有继承

多态公有继承:所谓多态公有继承,就是同一个方法在派生类和基类中的行为不同. 实现多态公有继承的机制:1,在派生类重新定义基类的方法.(用于对象)2,使用虚方法(多用于指针和引用),虚方法在基类用关键字virtual声明,在派生类中会自动识别基类中声明的虚方法.所以,在派生类中可以用(也可以不用)virtual显式标出哪个方法是虚方法.通俗来讲:为了实现一种方法可以在派生类和基类中的行为不同,于是在派生类中重新定义基类函数的方法(比如基类有方法A, 但又在派生类中重新定义了方法A, 它们名字一样,

深入理解OOP(二):多态和继承(继承)

本文是深入浅出OOP第二篇,主要说说继承的话题. 深入理解OOP(一):多态和继承(初期绑定和编译时多态) 深入理解OOP(二):多态和继承(继承) 深入理解OOP(三):多态和继承(动态绑定和运行时多态) 深入理解OOP(四):多态和继承(C#中的抽象类) 深入理解OOP(五):C#中的访问修饰符(Public/Private/Protected/Internal/Sealed/Constants/Static and Readonly Fields) 深入理解OOP(六):枚举(实用方法)

Swift3.0 多态 、继承 、 强制转换

又有点空开始瞎BB一下,写写博客了.这几天发现了一个现象,在博客园特别能吸粉的,只有两类人,一种大神 .一种 美女程序媛,看到大神呢,默默的粉一个,毕竟还是得好好学学人家的,看到美女程序媛呢,默默地多看两眼,从来也不粉,就这样静静的装着B,没办法,习惯了..估计也有很多像我这样,有时间就写写的孩纸其实挺多的,有时候吧,粉不粉这种事,不能太认真.一你不是大神,二不是漂亮MM.写点东西,就是想告诉自己,有时间其实你也在前进着,快慢不说,至少没停下吧.该有的都会有的.不瞎BB了,说主题,3.0 的多态

重写,重载,多态,继承的区别。

重写,重载,多态,继承的区别: 继承是子类继承父类的方法: 重写(override)是子类重写父类允许访问的方法.返回值和参数类型必须相同. 重载(overload)就是允许多个同名但是形参个数或者类型不同的函数方法存在于同一个类里.当类统一调用方式时由形参来决定调用具体的方法. 下面是转载的一篇文章: 继承是子类获得父类的成员,重写是继承后重新实现父类的方法.重载是在一个类里一系列参数不同名字相同的方法.多态则是为了避免在父类里大量重载引起代码臃肿且难于维护. 网上看到一个有趣的说法是:继承是

抽象&继承&重写

抽象&继承&重写 定义父类 abstract class Car{ //是抽象类,不能直接被实例化 val carBrand: String //字段没有初始化值,就是一个抽象字段 def info() //抽象方法,不需要使用abstract关键字 def greeting() {println("Welcome to my car!")} } 子类实现 class BMWCar extends Car { //重写父类字段,需要使用override关键字 overr

.NET Core CSharp初级篇 1-6 类的多态与继承

.NET Core CSharp初级篇 1-6 本节内容为类的多态与继承 简介 终于讲到了面向对象三大特性中的两大特性--继承与多态.通过继承与多态,我们能很好的将类的拓展性发挥到了极致.在下面的内容讲解中,我们将从各个方面对继承和多态进行刨析. 继承 继承事实上是一个非常好理解的语法,在C#中实现继承使用A:B,表示A类继承B类.子类(一称为派生类)继承于父类(一称为基类)就好比孩子继承了父亲的一切,但是孩子总归是有自己的个性的,而父亲也有一些不会告诉孩子的事情.如果我们从之前的访问控制符这一

封装 继承 多态 抽象的一点点理解

1.抽象 抽象是人们认识事物的常用方法,比如地图的绘制.抽象的过程就是如何简化.概括所观察到的现实世界,并为人们所用的过程. 抽象包括两个方面:过程抽象和数据抽象.过程抽象把一个系统按功能划分成若干个子系统,进行"自顶向下逐步求精"的程序设计.数据抽象以数据为中心,把数据类型和施加在该类型对象上的操作作为一个整体(对象)来进行描述,形成抽象数据类型ADT. 2.封装 封装是面向对象编程的特征之一,也是类和对象的主要特征.封装将数据以及加在这些数据上的操作组织在一起,成为有独立意义的构件