3.1、抽象类

概述:在做子类共性功能抽取时,有些方法在父类中并没有具体的体现,这个时候就需要抽象类了

格式:public abstract class 类名 {}

语法特点:

  1. 抽象类和抽象方法必须使用 abstract 关键字修饰
  2. 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
  3. 抽象类不能实例化,要想实例化,参照多态的方式,通过子类对象实例化,这叫抽象类多态
  4. 抽象类的子类,要么重写抽象类中的所有抽象方法,要么子类也是抽象类

内部特点:

成员变量
既可以是变量
也可以是常量
构造方法
空参构造
有参构造
成员方法
抽象方法
普通方法

注意问题:

  1. 与abstract不能共存的关键字:final、private、static
final:被final修饰的类不能有子类,而被abstract修饰的类一定是一个父类
private: 抽象类中的私有的抽象方法,不被子类所知,就无法被复写。而抽象方法出现的就是需要被复写
static:如果static可以修饰抽象方法,那么连对象都省了,直接类名调用就可以了。可是抽象方法运行没意义

3.2、接口

概述:接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用

格式:public interface 接口名 {}

语法特点:

  1. 接口用关键字interface修饰
  2. 类实现接口用implements表示
  3. 接口不能实例化,要想实例化,参照多态的方式,通过子类对象实例化,这叫接口多态
  4. 接口的子类,要么重写接口中的所有抽象方法,要么子类也是抽象类

内部特点:

成员变量
只能是常量,默认修饰符:public static final
构造方法
没有,因为接口主要是扩展功能的,而没有具体存在
成员方法
只能是抽象方法,默认修饰符:public abstract

注意问题:

  1. 抽象类和接口区别

    成员区别:
    抽象类
    变量、常量、构造方法、有抽象方法、也有非抽象方法
    接口
    常量、有抽象方法 关系区别:
    类与类的关系
    继承关系,只能单继承,支持多层继承
    类与接口的关系
    实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
    接口与接口的关系
    继承关系,可以单继承,也可以多继承 设计理念区别
    抽象类
    对类抽象,包括属性、行为
    接口
    对行为抽象,主要是行为
  2. JDK8新特性

  • 默认方法
格式:public default 返回值类型 方法名(参数列表) { }
举例:
public interface MyInter {
public default void show() {
System.out.println("Hello,World");
}
}
  • 静态方法
格式:public static 返回值类型 方法名(参数列表) { }
举例:
public interface MyInter {
public static void show() {
System.out.println("Hello,World");
}
}

3.3、内部类

概述:在一个类中定义一个类。举例:在一个类A的内部定义一个类B,类B就被称为内部类

格式:

class Outer {
public class Inner { }
}

语法特点:

  1. 内部类可以直接访问外部类的成员,包括私有
  2. 外部类要访问内部类的成员,必须创建对象

常见分类:

成员内部类:在成员变量位置定义的内部类
外界访问成员内部类:
格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象;
举例:Outer.Inner oi = new Outer().new Inner(); 局部内部类:在方法位置定义的内部类
外界访问局部内部类:
格式:外界是无法直接使用,需要在方法内部创建对象并使用
注意:局部内部类可以直接访问外部类的成员,也可以访问方法内的局部变量 匿名内部类:匿名内部类其实就是内部类的简写格式,他的前提是继承一个类或者实现接口
格式:new 类名 ( ) { 重写方法 }
new 接口名 ( ) { 重写方法 }
本质:是一个继承了该类或者实现了该接口的子类匿名对象

3.4、方法进阶

3.4.1、类作为方法形参和返回值

class Cat {
public void eat() {
System.out.println("猫吃鱼");
}
} class CatOperator {
public void useCat(Cat c) {
c.eat();
} public Cat getCat() {
return new Cat();
}
} public class Main {
public static void main(String[] args) {
CatOperator co = new CatOperator();
Cat c1 = new Cat();
co.useCat(c1);
Cat c2 = co.getCat();
c2.eat();
}
}

3.4.2、抽象类作为方法形参和返回值

abstract class Animal {
public abstract void eat();
} class AnimalOperator {
public void useAnimal(Animal a) {
a.eat();
} public Animal getAnimal() {
return new Cat();
}
} class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫吃鱼");
}
} public class Main {
public static void main(String[] args) {
AnimalOperator ao = new AnimalOperator();
Animal a1 = new Cat();
ao.useAnimal(a1);
Animal a2 = ao.getAnimal();
a2.eat();
}
}

3.4.3、接口作为方法形参和返回值

interface Jumpping {
void jump();
} class JumppingOperator {
public void useJumpping(Jumpping j) {
j.jump();
} public Jumpping getJumpping() {
return new Cat();
}
} class Cat implements Jumpping {
@Override
public void jump() {
System.out.println("猫跳高");
}
} public class Main {
public static void main(String[] args) {
JumppingOperator jo = new JumppingOperator();
Jumpping j1 = new Cat();
jo.useJumpping(j1);
Jumpping j2 = jo.getJumpping();
j2.jump();
}
}

3.4.4、匿名内部类作为方法实参和返回值

interface Jumpping {
void jump();
} class JumppingOperator {
public void useJumpping(Jumpping j) {
j.jump();
} public Jumpping getJumpping() {
return new Jumpping() {
@Override
public void jump() {
System.out.println("猫跳高");
}
};
}
} public class Main {
public static void main(String[] args) {
JumppingOperator jo = new JumppingOperator();
jo.useJumpping(new Jumpping() {
@Override
public void jump() {
System.out.println("猫跳高");
}
});
jo.getJumpping().jump();
}
}

第三章 Java面向对象(下)的更多相关文章

  1. 第三章 Java面向对象(上)

    3.1.概述 概述:面向对象是相对面向过程而言,面向对象和面向过程都是一种思想,面向过程强调的是功能行为,面向对象则是将功能封装进对象,强调具备功能的对象,面向对象是基于面向过程的.面向对象的三大特征 ...

  2. 2017-2018-2 20165318 实验三《Java面向对象程序设计》实验报告

    2017-2018-2 20165318 实验三<Java面向对象程序设计>实验报告 一.实验报告封面 课程:Java程序设计        班级:1653班        姓名:孙晓暄  ...

  3. 20155218 《Java程序设计》实验三(Java面向对象程序设计)实验报告

    20155218 <Java程序设计>实验三(Java面向对象程序设计)实验报告 一.实验内容及步骤 (一)编码标准 在IDEA中使用工具(Code->Reformate Code) ...

  4. 实验三《Java面向对象程序设计》实验报告

    20162308 实验三<Java面向对象程序设计>实验报告 实验内容 XP基础 XP核心实践 IDEA工具学习 密码学算法基础 实验步骤 (一)Refactor/Reformat使用 p ...

  5. 2017-2018-2 20165236 实验三《Java面向对象程序设计》实验报告

    2017-2018-2 20165236 实验三<Java面向对象程序设计>实验报告 一.实验报告封面 课程:Java程序设计            班级:1652 姓名:郭金涛     ...

  6. 20155201 实验三《Java面向对象程序设计》实验报告

    20155201 实验三<Java面向对象程序设计>实验报告 一.实验内容 XP基础 XP核心实践 相关工具 二.实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门 ...

  7. 20165301陈潭飞2017-2018-2 20165301 实验三《Java面向对象程序设计》实验报告

    2017-2018-2 20165301 实验三<Java面向对象程序设计>实验报告 一.敏捷开发与XP实践-1 实验要求: 在IDEA中使用工具(Code->Reformate C ...

  8. (第三章)Java内存模型(下)

    一.happens-before happens-before是JMM最核心的概念.对于Java程序员来说,理解happens-before是理解JMM的关键. 1.1 JMM的设计 从JMM设计者的 ...

  9. 第三记 Java面向对象

    相信很多人都有听到,见到这么一句话:Java是一门面向对象编程的语言,但是又是否对这句话有了自己的理解呢? 一.面向对象 面向对象是一种新兴的程序设计方法,也可以说是一种新的程序设计规范(paradi ...

随机推荐

  1. LeetCode57. 插入区间

    对于新插入的区间newInterval,原区间列表intervals可以分为三个部分: 左边与newInterval不重合的区间,这些区间直接加入结果数组中: 中间与newInterval重合的区间, ...

  2. 1.记我的第一次python爬虫爬取网页视频

    It is my first time to public some notes on this platform, and I just want to improve myself by reco ...

  3. 浅谈auth模块

    目录 auth模块 什么是Auth模块 auth模块的常用方法 用户注册 扩展默认的auth_user表 auth模块 什么是Auth模块 ​ auth模块是对注册登录认证注销修改密码等方法的一种封装 ...

  4. JDK8 日期格式化

    SpringBoot 是为了简化 Spring 应用的创建.运行.调试.部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖 ...

  5. vim常用指令参考

    (完)

  6. 一行一行源码分析清楚AbstractQueuedSynchronizer

    ​“365篇原创计划”第二十四篇. 今天呢!灯塔君跟大家讲: 一行一行源码分析清楚AbstractQueuedSynchronizer 在分析 Java 并发包 java.util.concurren ...

  7. Python18行代码做出来这样有点浪漫,又有点极客的“内涵”图

    今天就来教大家这个套路: 如何使用 Python 来做出来这样有点浪漫,又有点极客的“内涵”图. 当然,能不能靠它得到心仪对象的青睐,就要靠你(命)了.(๑•́₃ •̀๑) 那么要怎么做呢? 我们先找 ...

  8. css中雪碧图(sprite)的使用及制作方法

    雪碧图(sprite)是减少请求次数的有效手段,其原理是把多张图片进行合成,使用时通过css进行定位. 1.先看一下雪碧图 没有使用雪碧图时图标是这样一个个的单独文件: 合成雪碧图后是这样拼在一起的一 ...

  9. Spreading the Wealth,思维

    题目去洛谷 题意: 很清晰,n个人,每人有一些硬币硬币总数sum≡0(mod n),通过一些互相交换,使硬币数平均(即每人有相同个数的硬币) 分析: 还是有点思维含量的,我们这样想,我们其实就是要确定 ...

  10. ASP.NET MVC Route详解

    在MVC3.0版本的时候,微软终于引入了第二种模板引擎:Razor.在这之前,我们一直在使用WebForm时代沿留下来的ASPX引擎或者第三方的NVelocity模板引擎.Razor在减少代码冗余.增 ...