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

抽象类格式

abstract class 类名{}
抽象方法定义,在返回值钱,或修饰符前加上abstract关键字
方法没有方法体,即:没有{}

abstract public void eat();
public abstract void eat();
抽象类不一定有抽象方法,有抽象方法的类一定是抽象类

抽象类完全可以有成员变量和非抽象成员方法
抽象类的子类--使用extends

要么是抽象类,不完全实现其父类的抽象方法
要么重写抽象类中的所有抽象方法,这个子类就是一个完全的实现类了,所以可以用来实例化对象。
抽象类、方法定义时的非法组合

private abstract抽象方法依靠子类去实现,但是私有方法在类外就不能访问,也就无法实现
final abstractfinal修饰的方法不能被重写,而抽象方法就是需要子类实现,矛盾
static abstract抽象方法在本类中是没有方法体的,使用类名调用的时候调用的是没有方法体的方法,无作用
抽象类成员的特点

成员变量:既可以是变量,也可以是常量
构造方法:有,用于子类访问抽象类数据的初始化
成员方法:既可以是抽象的也可是非抽象的
抽象类成员方法的特性

抽象方法 强制要求子类做的事情
非抽象方法 子类继承的事情,提高代码的复用性
抽象类练习

案例:动物-->猫狗

具体事物:猫,狗
    共性:姓名,年龄,吃
    有共性,所以可以提取出父类,但是由于子类对方法“吃”有不同的实现,所以,将方法“吃”定义为一个抽象方法,所以这个父类也就成了抽象类,这个父类的实现类都需要实现自己的特有的“吃”方法,才是一个可以被实例化的类,否则还是一个抽象类。

////定义抽象的动物类
    public abstract class AnimalDemo {
        //私有成员变量
        private String name;   
        private int age;
        public abstract void eat(); //抽象方法
        //公有的get/set方法
        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;
        }
        //空参构造方法
        public AnimalDemo(){}
        //有参构造方法
        public AnimalDemo(String name,int age){
            this.age=age;
            this.name=name;
        }
    }
    //继承父类    并实现父类抽象方法
    public  class DogDemo extends AnimalDemo {
        //空参构造方法
        public DogDemo(){}
        //两个参数的构造方法
        public DogDemo(String name,int age){
            //调用父类有参构造方法,并传参
            super(name,age);
        }
        //重写父类抽象方法
        public void eat(){
            System.out.println("Dog eat");
        }

}
    //继承父类    并实现父类抽象方法
    public class CatDemo extends AnimalDemo {
        public CatDemo(){}
        public CatDemo(String name, int age){
            super(name,age);
        }
        public void eat(){
            System.out.println("cat eat");
        }
    }
    测试类
    public class DemoTest {
        public static void main(String[] args) {
            AnimalDemo ad = new DogDemo("tom",2);//采用多态  父类引用指向子类对象
            ad.eat();
            System.out.println("name:"+ad.getName()+" "+"age:"+ad.getAge());
            AnimalDemo aadd = new CatDemo("jack",3);
            aadd.eat();
            System.out.println("name:"+aadd.getName()+" "+"age:"+aadd.getAge());
        }
    }
接口interface的引入
抽象类是从多个类中抽出来的模板,如果将这种抽象进行的更彻底,则可以提炼出来一种更加特殊的“抽象类”--接口,接口里不能包含普通的方法接口里的所有方法都是抽象方法,其中的成员变量全部是常量。

接口特点

接口用关键字interface表示

格式:interface 接口名 {} //不能使用class关键字
类实现结构用 implements关键字
格式:class 类名 implements 接口名{}

接口没有构造方法,即:接口不能实例化
按照多态的方式,有具体的子类实例化,其实这也是多态的一种,接口多态
接口的子类

可以是抽象类,用implements关键字
或者还是一个接口 ,用extends关键字
是一个实现类,实现接口中所有抽象方法,用implements关键字
小结

只有接口和接口之间使用的是extends关键字,抽象类和接口之间,实现类和接口之间都是用的implements关键字。

接口成员的特点

成员变量

只能是常量

默认的修饰符public , static ,final ,其中任何一个都可以省略,也可以全省略

构造方法

没有,因为接口主要是扩展功能的,而没有具体存在

成员方法
只能是抽象方法
默认的修饰符 public, abstract,可以省略其一也可以全部省略
类与类,类与接口,接口与接口的关系

普通类与普通类--extends

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

普通类和抽象类--extends

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

普通类与接口,抽象类与接口--implements

实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时是想多个接口,此时应该注意extends要写在前,implements写在后

接口与接口--extends

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

抽象类和接口的区别

定义时用的关键字

抽象类 abstract
接口 interface
成员区别

抽象类:变量常量都可以有;抽象方法,非抽象方法都可以有;也可以有构造方法
接口:只有常量;只有抽象方法;没有构造方法
关系区别

类与类 :集成,单继承,多层继承
普通类与接口:实现单实现或多实现implements
抽象类和接口:实现,单实现,多实现abstract class a implements IA,IB
普通类和抽象类:继承,并实现全部抽象方法extends
接口与接口:继承 ,单继承,多继承extends
在接口的各种关系中,只有接口与接口是继承关系,其余的和接口之间全部都是实现关系

接口练习

/*
        猫狗案例,加入跳高的额外功能
        分析:从具体到抽象
            猫:
                姓名,年龄
                吃饭,睡觉
            狗:
                姓名,年龄
                吃饭,睡觉
            由于有共性功能,所以,我们抽取出一个父类:
            动物:
                姓名,年龄
                吃饭();
                睡觉(){}
            猫:继承自动物
            狗:继承自动物
            跳高的额外功能是一个新的扩展功能,所以我们要定义一个接口
            接口:跳高
            部分猫:实现跳高
            部分狗:实现跳高
        实现;
            从抽象到具体
        使用:
            使用具体类
    */
    //定义跳高接口
    public interface Jump {
        public abstract void jump();
    }
    public class Dog extends Animal {
        public void eat(){
            System.out.println("狗啃骨头");
        }
        public Dog(){}
        public Dog(String name,int age){
            super(name,age);
        }

}

public class Cat extends Animal {
        public void eat(){
            System.out.println("猫捉老鼠");
        }
        public Cat(){}
        public Cat(String name,int age){
            super(name,age);
        }
    }

public class JumpDog extends Dog implements Jump{
        public JumpDog(){}
        public JumpDog(String name,int age){
            super(name,age);
        }
        public void jump(){
            System.out.println("狗可以跳");
        }
    }

public class JumpCat extends Cat implements Jump {
        public JumpCat(){}
        public JumpCat(String name,int age){
            super(name,age);
        }
        public void jump(){
            System.out.println("猫可以跳了");
        }
    }
    //测试类
    public class JumpTest {
        public static void main(String[] args) {
            Animal a =  new Cat("tom",2);
            System.out.println("name:"+a.getName()+" "+"age:"+a.getAge());
            a.eat();
            a.sleep();
            System.out.println("----------------");
            JumpCat jc = new JumpCat("加菲",2);
            System.out.println("name:"+jc.getName()+" "+"age:"+jc.getAge());
            jc.eat();
            jc.jump();
            jc.sleep();
            System.out.println("----------------");
            System.out.println("name:"+a.getName()+" "+"age:"+a.getAge());
            a= new Dog("jerry",2);
            a.eat();
            a.sleep();
            System.out.println("----------------");
            JumpDog jg = new JumpDog("机械狗",2);
            System.out.println("name:"+jg.getName()+" "+"age:"+jg.getAge());  
            jg.eat();
            jg.jump();
            jg.sleep();
        }

}

java基础第9天的更多相关文章

  1. Java基础知识(壹)

    写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...

  2. [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)

    如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html   谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...

  3. 【JAVA面试题系列一】面试题总汇--JAVA基础部分

    JAVA基础 基础部分的顺序: 基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法 线程的语法,集合的语法,io 的语法,虚拟机方面的语法 每天几道,持续更新!! 1.一个". ...

  4. 最适合作为Java基础面试题之Singleton模式

    看似只是最简单的一种设计模式,可细细挖掘,static.synchronized.volatile关键字.内部类.对象克隆.序列化.枚举类型.反射和类加载机制等基础却又不易理解透彻的Java知识纷纷呼 ...

  5. java基础练习 字符串,控制流,日历,日期等

    1,对基本控制流程的一些练习 package org.base.practice3; import org.junit.Test; /** * Created with IntelliJ IDEA. ...

  6. Java基础知识【下】( 转载)

    http://blog.csdn.net/silentbalanceyh/article/details/4608360 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ...

  7. Java基础知识【上】(转载)

    http://blog.csdn.net/silentbalanceyh/article/details/4608272 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ...

  8. java基础学习03(java基础程序设计)

    java基础程序设计 一.完成的目标 1. 掌握java中的数据类型划分 2. 8种基本数据类型的使用及数据类型转换 3. 位运算.运算符.表达式 4. 判断.循环语句的使用 5. break和con ...

  9. Java基础加强之多线程篇(线程创建与终止、互斥、通信、本地变量)

    线程创建与终止 线程创建 Thread类与Runnable接口的关系 public interface Runnable { public abstract void run(); } public ...

  10. java基础知识小总结【转】

    java基础知识小总结 在一个独立的原始程序里,只能有一个 public 类,却可以有许多 non-public 类.此外,若是在一个 Java 程序中没有一个类是 public,那么该 Java 程 ...

随机推荐

  1. Nginx反向代理服务器安装与配置

    一.服务器安装: sudo yum install gcc-c++ sudo yum install pcre pcre-devel sudo yum install zlib zlib-devel ...

  2. 【python】BeautifulSoup的应用

    from bs4 import BeautifulSoup#下面的一段HTML代码将作为例子被多次用到.这是 爱丽丝梦游仙境的 的一段内容(以后内容中简称为 爱丽丝 的文档): html_doc = ...

  3. java-mybaits-010-mybatis-spring-使用 SqlSession、注入映射器

    一. SqlSession概述 在 MyBatis 中,你可以使用 SqlSessionFactory 来创建 SqlSession.一旦你获得一个 session 之后,你可以使用它来执行映射语句, ...

  4. Flask系列之自定义中间件

    from flask import Flask app = Flask(__name__) @app.route('/index') def index(): return 'Hello World' ...

  5. django-生成随机验证码

    Python生成随机验证码,需要使用PIL模块. 安装: pip3 install pillow 1   1 pip3 install pillow 基本使用 1.创建图片 from PIL impo ...

  6. wkhtmtopdf--高分辨率HTML转PDF(三)

    代码篇 浏览了很多实例,总找不到既能把HTML保存为PDF,同时实现流抛出的,所以自己琢磨了许久,终于实现了这样两个需求的结合体,下面来贡献一下吧~~ 下面我们来选择一个网页打印下,保存为PDF,而且 ...

  7. ng-深度学习-课程笔记-13: 目标检测(Week3)

    1 目标定位( object localization ) 目标定位既要识别,又要定位,它要做的事就是用一个框框把物体目标的位置标出来. 怎么做这个问题呢,我们考虑三目标的定位问题,假定图中最多只出现 ...

  8. java压缩zip文件中文乱码问题

    用java来打包文件生成压缩文件,有两个地方会出现乱码 1.内容的中文乱码问题,这个问题网上很多人给出了解决方法,两种:修改sun的源码:使用开源的类库org.apache.tools.zip.Zip ...

  9. C++ string和C风格字符串

    https://msdn.microsoft.com/en-us/library/syxtdd4f.aspx#basic_string__replace If you need to convert ...

  10. Linux学习笔记之Centos7设置Linux静态IP

    ***如下资料源自互联网*** 这里以CentOS 7系列为例设置静态IP,原来RedHat系列的Linux发行版可以通过setup工具方便的设置静态IP,但是在版本7之后setup工具的功能就逐渐减 ...