一、abstract关键字介绍

abstract可以修饰方法、类。使用abstract修饰的方法和类分别叫做抽象方法和抽象类。

1、抽象方法

抽象方法的定义:指可以通过abstract关键字声明的方法,这种方法只有方法声明没有方法体。

抽象方法存在的意义:如果所有的子类都对父类的某个或者某些方法做了重写,那么父类中的方法保留方法体就变得没有意义,那么就可以将其定义为抽象方法。

抽象方法的特征:

  1. 抽象方法是为了继承时重写而存在的。
  2. 抽象方法不能用final修饰。原因:final方法是最终方法,子类无法重写,而抽象方法存在的目的就是为了重写。如果不让重写,就和原本意图相矛盾了。
  3. 抽象方法不可以用private修饰。原因:private方法是私有方法,子类中无法看到,更无法重写,没有意义。和抽象方法原本意图相矛盾。
  4. 抽象方法不能用static修饰。原因:静态成员属于类,静态方法无法重写,和定义抽象方法的本意相矛盾。
  5. 抽象方法可以重载。

具体示例如下:

class A{ }
abstract class B extends A {
//抽象类可以具有成员属性
private String name;
//抽象类可以具有构造方法
public B(String name) {
this.name = name;
}
//抽象方法可以重载
public abstract void ma();
public abstract void ma(String str);
} abstract class C extends B {
public C(String str) {
super(str);
}
//抽象方法可以重载
public abstract void m1();
public abstract void m1(String str); //抽象方法可以被final,static,private修饰吗
//不可以,因为这几个都不能被重写或者继承
/*public abstract final void m2();
public abstract private void m2();
public abstract static void m2();*/
} //final与abstract不能同时声明一个类,
//抽象类存在的意义就是为了被继承,设置为final与本意违背
//final abstract class D {}

2、抽象类

定义:一个类一旦被abstract修饰,就成为了一个抽象类。

 抽象类的特征:

  1. 抽象类可以包含抽象方法。
  2. 抽象类无法new对象,即无法实例化。
  3. 抽象类主要是为了被继承而存在的。
  4. 非抽象类继承抽象类之后,必须实现父类中声明的所有抽象方法。
  5. 抽象类不能被final修饰。原因:抽象类存在的目的是为了继承,而最终类不可以被继承。

抽象类和其他类的共同点:

  1. 抽象类可以继承其他类,既可以继承抽象类,也可以继承非抽象类。
  2. 抽象类可以实现接口。
  3. 抽象类可以不包含抽象方法。
  4. 抽象类可以具有构造函数、成员属性、成员方法和静态方法。

二、interface关键字

1、接口存在的意义

由于java只支持单继承,缺少了一定的灵活性。为了弥补这一缺点。sun公司除了限定单继承之外,额外提供了接口的概念,虽然一个类只能继承一个父类,但是可以实现多个接口,从而弥补了java程序的灵活性。

2、接口的定义和使用

a、接口的定义

接口使用interface关键字来声明,接口中声明的所有方法都是抽象方法。

接口的特征:

  1. 接口中声明的方法必须是public abstract的,而不写默认就是public abstract。
  2. 接口中声明的属性必须是public static final的,而不写默认就是public static final。
  3. 接口中无法声明构造方法,接口也无法创建对象。
  4. 接口可以继承接口,且可以多继承。
  5. 在JDK1.8之前,接口中所有的方法都是抽象方法;JDK1.8之后,接口中的方法可以出现实体方法。相当于Java实现了多继承。

b、使用接口时注意事项

  1. 可以通过implements关键字使一个类实现接口。如果要同时实现多个接口,可以将过个接口通过逗号分隔依次声明。
  2. 一个类可以同时继承类并实现接口,其中extends关键字要出现在implements关键字之前。
  3. 一个普通类一旦实现了接口,则需要实现接口中的所有方法。

示例如下

/**
* 接口声明的方法:1、必须是public abstract 的,而不写默认就是该种形式
* 2、接口中的属性必须是public static final 的,不写就是默认
* 3、接口中不能有构造方法,也无法创建对象
* @author Administrator
*
*/
interface intf01 {
//接口中的属性必须是public static final 的,不写就是默认
String name = "intf01";
void m01();
void m02();
}
interface intf02 {
String str = "intf02";
void m03();
void m04();
} //接口可以多继承
interface intf03 extends intf02, intf01 {
void m05();
} class A {
}
//接口不能继承任何类,抽象类也不行,因为可能包含非抽象方法
//interface intf04 extends A {} //类可以既继承类又实现多个接口,extends在implements前
abstract class Person extends A implements intf01,intf02 { @Override
public void m03() {
// TODO Auto-generated method stub } @Override
public void m04() {
// TODO Auto-generated method stub }
//抽象类实现接口,则可以不重写抽象方法;
//普通方法必须全部实现接口方法
}

三、抽象类和接口的比较

抽象类只能单继承,接口可以多继承;

抽象类可以包含抽象方法和非抽象方法,接口所有方法方法都是抽象方法(JDK1.8之前);

抽象类和接口都可以实现多态。

真正开发时,抽象类主要用来满足继承结构树,而接口主要用来混入特性。

abstract class Person1 {
public void eat() {
System.out.println("吃...");
}
public abstract void say();
}
interface CodeSkill {
public void code();
}
interface DriveSkill {
public void drive();
}
interface CookSkill {
public void cook();
}
class Student extends Person1 implements CodeSkill, CookSkill, DriveSkill { @Override
public void code() {
System.out.println("写代码...");
} @Override
public void say() {
System.out.println("学生在叽叽喳喳的说...");
} @Override
public void cook() {
System.out.println("做饭..."); } @Override
public void drive() {
System.out.println("开车..."); } }
public class Demo02 {
public static void main(String[] args) {
//抽象类和接口都可以实现多态 :即抽象类和接口都可以实例化一个继承
//他们的一个类的对象;但是只能访问到抽象类或者接口内的方法
Person1 p = new Student(); //多态
p.eat();
p.say();
//p.drive();
CookSkill cooker = new Student(); //多态
cooker.cook();
} }

abstract和interface关键字介绍的更多相关文章

  1. C# abstract class Interface的介绍

    1.基本概念介绍 抽象类: 1.抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法 2.抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类 3.具体 ...

  2. PHP namespace、abstract、interface、trait使用介绍

    小菜鸟一枚,一直搞不懂 namespace.abstract.interface.trait 这些关系,就抽出几天时间研究,做个总结,不足之处希望大家指正交流. namespace 命名空间 介绍:顾 ...

  3. abstract与interface的区别

    abstract的用法: //通过abstract 关键字修饰的类叫抽象类. abstract class Animal { String name; String color; abstract p ...

  4. interface关键字定义接口

    package interface0; public interface InterfaceTest { /* * 接口的定义,使用interface关键字定义接口 */ public interfa ...

  5. C#基础--AbStract与Interface

         Interface: 接口方法不能用public abstract等修饰.接口内不能有字段变量,构造函数. 接口内可以定义属性,如string color{get;set;}这种. 实现接口 ...

  6. abstract与interface之房祖名张默版

    最近把java基础知识拿出来看看,看到abstract与interface的时候,觉得有点模糊,好像面试官也喜欢问这个问题.我在百度了查了好长时间,觉得讲算比较清楚的是那篇讲 Door,然后想要带个报 ...

  7. 转:Java中abstract和interface的区别

    转自:Java中abstract和interface的区别 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java ...

  8. Java开发之abstract 和 interface的区别

    Java开发abstract 和 interface的区别 java开发里面经常会用到虚函数和接口,这两者的区别是什么呢? abstract: 子类里面只能继承一个父类 interface: 子类可以 ...

  9. iOS开发——总结篇&关键字介绍

    关键字介绍 在做iOS开发中,系统的各个关键字处处都是,但是未必每一个关键字都是那么的明白,所以罗列出一些关键字供大家互相学习,有不完善之处请指正,谢谢 atomic atomic是Objc使用的一种 ...

随机推荐

  1. c++ (翁恺浙大公开课)前言、目录

    c++语言比较复杂,学习起来相对难一些,加之特性繁多,很难全部掌握:特别是工作几年之后,每次温故都有很大的收获,之前不懂的地方随着工作的积累和重新的学习,都会慢慢的解开,当然我现在还是很菜... 之所 ...

  2. VUE.JS和小程序的共通之处

    我是先学习的小程序开发,之后才了解到vue.js.也是一直没有时间去看相关vue.js的知识和内容.现在回顾起来,小程序和vue.js都是前端的内容. 例如小程序中的目录结构物page+app.js+ ...

  3. shiro用ajax方式登录

    用了shiro一段时间了,但是有点受不了它请求登录如果验证不通过直接跳的是loginUrl…所以我想很多人想用ajax实现shiro的登录直接在回调函数里面通过js显示出错信息吧. 今天查了一天的资料 ...

  4. 如何在Java中测试类是否是线程安全的

    通过优锐课的java核心笔记中,我们可以看到关于如何在java中测试类是否线程安全的一些知识点汇总,分享给大家学习参考. 线程安全性测试与典型的单线程测试不同.为了测试一个方法是否是线程安全的,我们需 ...

  5. 网站Webshell大马密码极速暴力爆破工具-cheetah

    Cheetah是一个基于字典的暴力密码webshel​​l工具,运行速度与猎豹猎物一样快. Cheetah的工作原理是能根据自动探测出的web服务设置相关参数一次性提交大量的探测密码进行爆破,爆破效率 ...

  6. 使用EasyUI中Tree

    easyui里面的加载tree的两种方式 第一种: 使用EasyUI中Tree 符合EasyUI中Tree的Json格式,我们先看一下,格式是如何的 [{ , "text":&qu ...

  7. 2017 青岛网络赛 Chenchen, Tangtang and ZengZeng

    Chenchen, Tangtang and ZengZeng are starting a game of tic-tac-toe, played on a 3 × 3 board. Initial ...

  8. jenkins#构建并部署springboot的jar包

    0. 前提是有一个可以用的没有问题的Jenkins环境,这是基础 1. 安装publish over ssh 插件,(如果网速太慢,请去github 克隆代码,然后自己构建,然后上传安装此插件) 2. ...

  9. Redis详解(四)——删除策略

    Redis详解(四)--删除策略 Redis中的数据特征 Redis是一种内存级数据库,所有数据均存放在内存中,内存中的数据可以通过TTL指令来获取其状态,当 key 不存在时,返回 -2 . 当 k ...

  10. 044、Java中逻辑运算之向左边移位2位实现功能

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...