第三章 Java面向对象(下)
3.1、抽象类
概述:在做子类共性功能抽取时,有些方法在父类中并没有具体的体现,这个时候就需要抽象类了
格式:public abstract class 类名 {}
语法特点:
- 抽象类和抽象方法必须使用 abstract 关键字修饰
- 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
- 抽象类不能实例化,要想实例化,参照多态的方式,通过子类对象实例化,这叫抽象类多态
- 抽象类的子类,要么重写抽象类中的所有抽象方法,要么子类也是抽象类
内部特点:
成员变量
既可以是变量
也可以是常量
构造方法
空参构造
有参构造
成员方法
抽象方法
普通方法
注意问题:
- 与abstract不能共存的关键字:final、private、static
final:被final修饰的类不能有子类,而被abstract修饰的类一定是一个父类
private: 抽象类中的私有的抽象方法,不被子类所知,就无法被复写。而抽象方法出现的就是需要被复写
static:如果static可以修饰抽象方法,那么连对象都省了,直接类名调用就可以了。可是抽象方法运行没意义
3.2、接口
概述:接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用
格式:public interface 接口名 {}
语法特点:
- 接口用关键字interface修饰
- 类实现接口用implements表示
- 接口不能实例化,要想实例化,参照多态的方式,通过子类对象实例化,这叫接口多态
- 接口的子类,要么重写接口中的所有抽象方法,要么子类也是抽象类
内部特点:
成员变量
只能是常量,默认修饰符:public static final
构造方法
没有,因为接口主要是扩展功能的,而没有具体存在
成员方法
只能是抽象方法,默认修饰符:public abstract
注意问题:
抽象类和接口区别
成员区别:
抽象类
变量、常量、构造方法、有抽象方法、也有非抽象方法
接口
常量、有抽象方法 关系区别:
类与类的关系
继承关系,只能单继承,支持多层继承
类与接口的关系
实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
接口与接口的关系
继承关系,可以单继承,也可以多继承 设计理念区别
抽象类
对类抽象,包括属性、行为
接口
对行为抽象,主要是行为
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 { }
}
语法特点:
- 内部类可以直接访问外部类的成员,包括私有
- 外部类要访问内部类的成员,必须创建对象
常见分类:
成员内部类:在成员变量位置定义的内部类
外界访问成员内部类:
格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象;
举例: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面向对象(下)的更多相关文章
- 第三章 Java面向对象(上)
3.1.概述 概述:面向对象是相对面向过程而言,面向对象和面向过程都是一种思想,面向过程强调的是功能行为,面向对象则是将功能封装进对象,强调具备功能的对象,面向对象是基于面向过程的.面向对象的三大特征 ...
- 2017-2018-2 20165318 实验三《Java面向对象程序设计》实验报告
2017-2018-2 20165318 实验三<Java面向对象程序设计>实验报告 一.实验报告封面 课程:Java程序设计 班级:1653班 姓名:孙晓暄 ...
- 20155218 《Java程序设计》实验三(Java面向对象程序设计)实验报告
20155218 <Java程序设计>实验三(Java面向对象程序设计)实验报告 一.实验内容及步骤 (一)编码标准 在IDEA中使用工具(Code->Reformate Code) ...
- 实验三《Java面向对象程序设计》实验报告
20162308 实验三<Java面向对象程序设计>实验报告 实验内容 XP基础 XP核心实践 IDEA工具学习 密码学算法基础 实验步骤 (一)Refactor/Reformat使用 p ...
- 2017-2018-2 20165236 实验三《Java面向对象程序设计》实验报告
2017-2018-2 20165236 实验三<Java面向对象程序设计>实验报告 一.实验报告封面 课程:Java程序设计 班级:1652 姓名:郭金涛 ...
- 20155201 实验三《Java面向对象程序设计》实验报告
20155201 实验三<Java面向对象程序设计>实验报告 一.实验内容 XP基础 XP核心实践 相关工具 二.实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门 ...
- 20165301陈潭飞2017-2018-2 20165301 实验三《Java面向对象程序设计》实验报告
2017-2018-2 20165301 实验三<Java面向对象程序设计>实验报告 一.敏捷开发与XP实践-1 实验要求: 在IDEA中使用工具(Code->Reformate C ...
- (第三章)Java内存模型(下)
一.happens-before happens-before是JMM最核心的概念.对于Java程序员来说,理解happens-before是理解JMM的关键. 1.1 JMM的设计 从JMM设计者的 ...
- 第三记 Java面向对象
相信很多人都有听到,见到这么一句话:Java是一门面向对象编程的语言,但是又是否对这句话有了自己的理解呢? 一.面向对象 面向对象是一种新兴的程序设计方法,也可以说是一种新的程序设计规范(paradi ...
随机推荐
- java重试
项目中有很多需要重试的场景,而每次都得写如下的逻辑 for (int i=0;i++;i<retry){ try{ do(//逻辑代码); if(success){ break; } }catc ...
- css3条件判断_@supports的用法/Window.CSS.supports()的使用
为了判断浏览器是否支持css3的一些新属性样式,当不兼容该样式的时候,我们可以更优雅的降级处理.这就需要使用到css3的条件判断功能:在css中支持@supports标记.或者在js中使用CSS.su ...
- 基础设计模式-03 从过滤器(Filter)校验链学习职责链模式
1.职责链路模式 1.1UML图 1.2 职责链路模式的概念 为了避免处理对象的耦合关系,将对象连成一个链,沿着这个链进行访问,直到有一个对象处理位置: 1.3 优点 1.按照一定的顺序执行判断: 2 ...
- 一文了解HAProxy主要特性
本文转自Rancher Labs 在Kubernetes中,Ingress对象定义了一些路由规则,这些规则规定如何将一个客户端请求路由到指定服务,该服务运行在你的集群中.这些规则可以考虑到输入的HTT ...
- Django---drf第一天---作业
1 图书的5个接口写完(使用序列化组件) urls.py from django.contrib import admin from django.urls import path, re_path ...
- 双向绑定和 vuex 是否冲突
在严格模式下确实有问题,解决方案: https://vuex.vuejs.org/zh/guide/forms.html
- 06 Vue生命周期钩子
生命周期钩子 表示一个vue实例从创建到销毁的这个过程,将这个过程的一些时间节点赋予了对应的钩子函数 钩子函数: 满足特点条件被回调的方法 new Vue({ el: "#app" ...
- java 面向对象(七):类结构 方法(四)递归方法
1.定义:递归方法:一个方法体内调用它自身.2.如何理解递归方法?> 方法递归包含了一种隐式的循环,它会重复执行某段代码,但这种重复执行无须循环控制.> 递归一定要向已知方向递归,否则这种 ...
- POJ 1050 To the Max 最详细的解题报告
题目来源:To the Max 题目大意:给定一个N*N的矩阵,求该矩阵中的某一个矩形,该矩形内各元素之和最大,即最大子矩阵问题. 解题方法:最大子序列之和的扩展 解题步骤: 1.定义一个N*N的矩阵 ...
- HDFS+ClickHouse+Spark:从0到1实现一款轻量级大数据分析系统
在产品精细化运营时代,经常会遇到产品增长问题:比如指标涨跌原因分析.版本迭代效果分析.运营活动效果分析等.这一类分析问题高频且具有较高时效性要求,然而在人力资源紧张情况,传统的数据分析模式难以满足.本 ...