luogg_java学习_07_抽象类_接口_多态学习总结
这篇博客总结了半天,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用.
**转载请注明 出自 : luogg的博客园 ** ,
抽象
一种专门用来做父类,被继承的. (模板)
格式:
abstract class 抽象类名{
属性;
普通方法;
访问权限 abstract 返回值类型 方法名称([形参]);//抽象方法,无方法体
}
抽象类中, 不写访问权限的时候, 默认是default, 不同于接口中的默认(接口方法默认被public abstract 修饰), 子类在继承抽象类时候, 需要重写抽象类中方法, 修饰符可以默认不写(default)或者写public , 但在接口中重写时必须为public
抽象类的定义及使用:
1, 定义父类为抽象类,并定义没有方法体的抽象方法
2, 子类继承抽象类, 并重写父类的抽象方法,写入方法体,去掉abstract
使用抽象类注意事项:
1, 抽象类本身不可以创建对象, 因为它不可以被实例化,即不能构造一个该类的对象.
2, 抽象类有构造方法, 在子类实例化前也会默认的调用它的无参构造方法, 只要是类, 都有构造方法
3, **抽象类中不一定要有抽象方法,但是有抽象方法的类, 一定要被声明为抽象类,不然编译不通过 **
4, abstract只能修饰类和方法
abstract 不能用来修饰属性, 构造器, 不能与private , final , static 共用
- 属性不能被覆盖,重写,
- 构造器不能被重写
- private只能在本类中调用,不能被继承,不能被重写
- fianl修饰方法,不能被重写 , 修饰类, 不能被继承
抽象类与普通类的区别
接口
概念
接口可以理解为一种特殊的抽象类, 对行为的抽象, 由全局常量和公有抽象方法组成 , 接口的作用是用来被实现的(implement) , 接口属于复合类型,
定义
[访问修饰符] interface I接口名{
属性(全局常量,默认被static final修饰);
抽象的方法(没有方法体,方法默认被public abstract修饰);
}
注意事项:
1, 子类实现接口,重写方法的时候,修饰符必须加public,当接口中用默认的时候,因为接口方法默认是public+abstract修饰的
2, 接口没有构造方法,没有办法创建对象
3, 接口名字必须以大写I开头
4, 接口的作用是为了弥补java中的单继承,接口之间可以多extends,
5, 接口不可以继承抽象类, 但是接口可以extends 多个接口, 抽象类可以implements接口,普通类可以implements多个接口
接口和抽象的混搭使用
当子类既要继承抽象类 , 又要实现接口的时候, 先extends 抽象类, 然后再 implements 接口1,接口2..{}
public class Test2 {
public static void main(String[] args) {
P p1 = new P();
p1.tell2();
// static修饰的age,静态全局常量,
System.out.println(I1.age);
System.out.println(I2.age);
System.out.println(I3.age);
p1.tell1("花花");
p1.tell1();
}
}
//定义一个抽象类
abstract class Abs1 implements I1,I2{//抽象类可以implements多个接口,但是不可以extends接口
String name;
// 抽象类可以有构造方法
Abs1() {
}
Abs1(String name){
}
abstract void tell1();
}
//定义接口
interface I1 extends I2,I3{//接口和接口之间可以多extends,但是接口不可以extends抽象类,接口不可以implements接口
int age = 10;//不可以使用int age;因为默认是final
/*I1(){
//Interfaces cannot have constructors
}*/
// 定义接口的抽象类
void tell2();
}
interface I2{
int age = 20;
void tell3();
}
interface I3{
int age = 30;
void tell4();
}
class P extends Abs1 implements I1,I2,I3{
// 抽象类可以有构造方法
void tell1(String name) {
System.out.println("抽象方法被执行...");
}
public void tell2() {
System.out.println("接口1的方法被执行...");
}
public void tell3() {
System.out.println("接口2的方法被执行...");
}
public void tell4() {
System.out.println("接口3的方法被执行...");
}
@Override
void tell1() {
System.out.println("抽象方法被执行...");
}
抽象类和接口的区别
多态
概念
一个事物的多种表现形态,多种状态.
1, 方法的重写与重载
2, 子类对象的多态性 Person p1 = new Man();
3, 父类的引用指向子类对象
多态的实现
向上转型
- 向上转型,可以调用父类方法也可以调用本类方法
- 但是父类和子类有相同方法sleep的时候,调用时候会调用子类方法
向下转型(使用的不多)
instanceof关键字
表示运算符前面的这个对象是不是运算符后面的类的实例
对象 instanceof 类
只要是本类和本类的父类,都是返回true, 包括Object类
虚方法的调用
1, 当子类覆写了父类中的方法,在发生多态的时候,调用的是子类的方法
2, 通过父类的引用指向子类的对象实体, 当调用方法时, 实际执行的是子类重写父类的方法
使用多态
public class TeachTest {
public static void main(String[] args) {
//实例化一个新的数学老师,
//向上转型,可以调用父类方法也可以调用本类方法
//但是父类和子类有相同方法sleep的时候,调用时候会调用子类方法
Teacher t1 = new MathTeacher();//向上转型
t1.teach();
t1.sleep();
t1.speak();
//强制将Teacher 转换为MathTeacher(向下转型)
MathTeacher mt = (MathTeacher)t1;
mt.teach();
//使用封装了的方法
EnglishTeacher e = new EnglishTeacher();
TeacherAll(e);
System.out.println(e instanceof Teacher);
}
/*
如果要调用类的方法,先实例化一个类,然后分别调用
MathTeacher mt = new MathTeacher();
mt.teach();
mt.sleep();
ChineseTeacher ct = new ChineseTeacher();
ct.teach();
ct.sleep();
发现这样比较麻烦,向上抽取,定义一个新的工具类TeachTest的TeacherAll方法,将方法封装进去
*/
public static void TeacherAll(Teacher t) {
t.sleep();
t.teach();
}
}
abstract class Teacher{
abstract void teach();
void sleep() {
System.out.println("老师在睡觉...");
}
void speak() {
System.out.println("老师正在说话...");
}
}
class MathTeacher extends Teacher{
void teach() {
System.out.println("数学老师在讲数学...");
}
void sleep() {
System.out.println("数学老师正在躺着睡觉...");
}
}
class EnglishTeacher extends Teacher{
void teach() {
System.out.println("英语老师在教英语...");
}
void sleep() {
System.out.println("英语老师睡在沙发上...");
}
}
运行结果:
luogg_java学习_07_抽象类_接口_多态学习总结的更多相关文章
- 详解java基础--抽象类、接口与多态
抽象类.接口.多态都是面向对象中很基础的东西,我相信看到能本篇博客的人本不会再纠结它的基本定义了,本篇文章将尽量的更加深层次的挖掘其内涵,希望能对大家有帮助. 一.抽象类 1.形式 abstract ...
- 记录:JAVA抽象类、接口、多态
JAVA抽象类.接口.多态 1. 多态 定义 多态是同一个行为具有多个不同表现形式或形态的能力.(多态就是同一个接口,使用不同的实例而执行不同操作) 如何实现多态 继承和接口 父类和接口类型的变量赋值 ...
- final、抽象类、接口、多态、
final———最终.作为一个修饰符 可以修饰类. 函数. 变量: 被final修饰的类不可以被继承: 被final修饰的方法不可以被重写: 被final修饰的变量只能够被赋值一次,既可以修饰成 ...
- Java 抽象类和接口与多态
引入抽象类和接口的原因 即"针对接口编程",关键就在多态,即向上转型 当变量的的声明类型是超类型时,即抽象类或者接口,这样,只要是具体实现此超类型的类所产生的对象,都可以指定给这个 ...
- 8.抽象类、接口和多态.md
目录 1.抽象类 1.抽象类 2.接口和抽象类的关系 2.1实现上的区别: 22.类和接口的关系: 2.3.Java为什么只能单继承可以多实现: 2.4.接口和接口的关系: 3.多态 2.接口和抽象类 ...
- Java学习笔记——继承、接口、多态
浮点数的运算需要注意的问题: BigDecimal operand1 = new BigDecimal("1.0"); BigDecimal operand2 = new BigD ...
- 大数据学习--day11(抽象类、接口、equals、compareTo)
抽象类.接口.equals.compareTo 什么是抽象方法 ? 区分于正常的方法 1.使用了 abstract 修饰符 该修饰符修饰方法 则该方法就是抽象方 ...
- java_抽象类、接口、多态的使用
抽象类 抽象类:包含抽象方法的类. 抽象方法 : 没有方法体的方法. 使用 abstract关键字修饰方法,该方法就成了抽象方法,抽象方法只包含一个方法名,而没有方法体. 格式为:修饰符 abstra ...
- Java编程思想学习(七) 抽象类和接口
1.抽象类和抽象方法 抽象方法:不完整的,仅有声明而没有方法体. abstract void f(); 抽象类:包含抽象方法的类.(若一个类包含一个或多个抽象方法,则该类必须限定为抽象的.) 1.用抽 ...
随机推荐
- 玩转Windows服务系列——创建Windows服务
创建Windows服务的项目 新建项目->C++语言->ATL->ATL项目->服务(EXE) 这样就创建了一个Windows服务项目. 生成的解决方案包含两个项目:Servi ...
- java中文乱码解决之道(三)-----编码详情:伟大的创想---Unicode编码
随着计算机的发展.普及,世界各国为了适应本国的语言和字符都会自己设计一套自己的编码风格,正是由于这种乱,导致存在很多种编码方式,以至于同一个二进制数字可能会被解释成不同的符号.为了解决这种不兼容的问题 ...
- Mycat 月分片方法
概述 本篇文章主要介绍Mycat以月进行分片的方法,包括配置方法.注意事项等. mycat版本:1.4 数据节点:dn1,dn2,dn3 架构:主从 配置 创建测试表 CREATE TABLE `t ...
- 《JavaScript语言精粹》—— 读书总结
话说这本书还是同学的推荐才读的,之前感觉这本书太薄了,不值得看,没想到小身材有大智慧,书中的内容总结的还是很到位的!所以就把最后几章,精华的部分整理整理. 优美的特性 函数是顶级对象 在JS中,没有块 ...
- 页面静态化技术Freemarker技术的介绍及使用实例.
一.FreeMarker简介 1.动态网页和静态网页差异 在进入主题之前我先介绍一下什么是动态网页,动态网页是指跟静态网页相对应的一种网页编程技术.静态网页,随着HTML代码的生成,页面的内容和显示效 ...
- rem单位和em单位的使用
今天弄了一点响应式的东西,本以为很快就可以弄好,结果还是绕晕了头,所以还是写下来方便下次看吧! 一开始我打算用百分比%来做响应式布局,后来算的很懵圈,就果断放弃了,哈哈是不是很明智. 接下来就是rem ...
- CSS3学习总结3-3D与动画
前言:这是篇CSS3中关于3D效果与动画相关的内容. (1)在CSS3的3D效果中,需要结合透视perspective的属性才能看到3d的效果,这个属性在屏幕上实现了元素近大远小的效果,所以要使用CS ...
- invalidate()和postInvalidate() 的区别及使用
Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中 ...
- lintcode循环数组之连续子数组求和
v 题目:连续子数组求和 II 给定一个整数循环数组(头尾相接),请找出一个连续的子数组,使得该子数组的和最大.输出答案时,请分别返回第一个数字和最后一个数字的值.如果多个答案,请返回其中任意一个. ...
- ECMAScript5之StrictMode
ECMAScript5引入一个严格模式的概念(Strict Mode). 它的作用就是不让Javascript的容错那么高,让我们对编写代码的规范要求高一点. 比如,当我们使用严格模式编写JavaSc ...