面向对象·四级

多态的概述及其代码实现

* A:多态(polymorphic)概述
  * 事物存在的多种形态

* B:多态前提
  * a:要有继承关系
  * b:要有方法重写
  * c: 要有父类引用指向子类对象

class Demo1_Polymorphic {
public static void main(String[] args) {
Cat c = new Cat();
c.eat(); Animal a = new Cat(); // 父类引用指向子类对象
a.eat();
}
} class Animal {
public void eat() {
System.out.println("动物吃饭");
}
} class Cat extends Animal {
public void eat() {
System.out.println("猫吃鱼");
}
}

多态中的成员访问特点之成员变量

* 成员变量

  * 编译看左边(父类) ,运行看右边(子类)。实际用父类

class Demo2_Polymorphic {
public static void main(String[] args) {
Father f = new Son();
System.out.println(f.num) Son s = new Son();
System.out.println(s.num)
}
} class Father {
int num = 10;
} class Son extends Father {
int num = 20;
}

多态中的成员访问特点之成员方法

* 成员方法

  * 编译看左边(父类) ,运行看右边(子类)。实际用子类

class Demo2_Polymorphic {
public static void main(String[] args) {
/*Father f = new Son();
System.out.println(f.num) Son s = new Son();
System.out.println(s.num)*/ Father f = new Son();
f.print();
}
} class Father {
int num = 10;
public void print() {
System.out.println("father");
}
} class Son extends Father {
int num = 20;
public void print() {
System.out.println("son");
}
}

多态中的成员访问特点之静态方法

* 静态方法

  * 编译看左边(父类) ,运行看右边(子类)。实际用父类
  * (静态方法和类相关,算不上重写,所以,访问还是左边的)
  * 只有非静态的成员方法,编译看左边,运行看右边

class Demo2_Polymorphic {
public static void main(String[] args) {
/*Father f = new Son();
System.out.println(f.num) Son s = new Son();
System.out.println(s.num)*/ Father f = new Son();
//f.print();
f.method();
}
} class Father {
int num = 10;
public void print() {
System.out.println("father");
} public static void method() {
System.out.println("father static method");
}
} class Son extends Father {
int num = 20;
public void print() {
System.out.println("son");
}
public static void method() {
System.out.println("son static method");
}
}

向上转型和向下转型

Person p = new SuperMan();     // 向上转型  类似自动类型提升
SuperMan sm = (SuperMan)p;  // 向下转型  类似强制类型转化

多态的好处和弊端

* 弊端:

  * 不能调用子类特有的属性和方法

* 好处

  * 提高了代码的可维护性(由继承保证)
  * 提高了代码的可扩展性(由多态保证)

* 案例演示

  * 多态的好处
  * 可以当作形式参数,可以接受任意子类对象

* instanceof 关键字 的 使用

  * 判断当前对象的类型

class Demo4_Animal {
public static void main(String[] args) {
//Cat c1 = new Cat();
//c1.eat();
method(new Cat());
method(new Dog());
}
// 开发的时候很少在创建对象的时候用父类引用指向子类对象
// 一般当作参数时,使用多态,具有较强的扩展性
public static void method(Animal a) { // Animal c = new Cat();
if (a instanceof Cat) { // Animal c = new Dog();
Cat c = (Cat)a;
c.eat();
c.catchMouse();
}else if (a instanceof Dog) {
Dog d = (Dog)d;
d.eat();
d.lookHome();
}else {
a.eat();
}
}
} class Animal {
public void eat() {
System.out.println("动物吃饭");
}
} class Cat extends Animal {
public void eat() {
System.out.println("猫吃鱼");
}
public void catchMouse() {
System.out.println("抓老鼠");
}
} class Dog extends Animal {
public void eat() {
System.out.println("狗吃肉");
} public void lookHome() {
System.out.println("看家");
}
}

多态题目分析 1

class Test1_Polymorphic {
public static void main(String[] args) {
Fu f = new Zi();
//f.mothod(); // 编译报错,因为父类中没有定义
f.show();
}
} class Fu {
public void show() {
System.out.println("fu show");
}
} class Zi extends Fu {
public void show() {
System.out.println("zi show");
} public void method() {
System.out.println("zi method");
}
}

多态题目分析2

class Test2_Polymorphic {
public static void main(String[] args) {
A a = new B();
a.show(); B b = new C();
b.show();
}
} class A {
public void show() {
show2();
} public void show2() {
System.out.println("我");
}
} class B extends A {
public void show2() {
System.out.println("爱");
}
} class C extends B {
public void show() {
super.show();
} public void show2() {
System.out.println("你");
}
}

抽象类的概述及其特点

* A:抽象类概述
  * 抽象就是看不懂的

* B:抽象类特点

  * a:抽象类和抽象方法必须用abstract关键字修饰
    * abstract class 类名 { }
    * public abstract void eat();

  * b:抽象类不一定有抽象方法,有抽象方法的类一定是抽象类或者是接口

  *c:抽象类不能实例化
    * 按照多态的方式,由具体的子类实例化。其实这也是多态的一种,抽象类多态

  * d:抽象类子类
    * 要么是抽象类
    * 要么重写抽象类中的所有抽象方法

* C:案例演示
  * 抽象类特点

class Demo1_Abstract {
public static void main(String[] args) {
//Animal a = new Animal(); // 错误的,Animal是抽象的,无法实例化
Animal a = new Cat(); // 父类引用指向子类对象
a.eat();
}
} abstract class Animal { // 抽象类
public abstract void eat(); // 抽象方法,不加大括号
} class Cat extends Animal {
public void eat() {
System.out.println("cat");
}
}

抽象类的成员特点

* A:抽象类的成员特点

  * a:成员变量:既可以是变量,也可以是常量。abstract 不能修饰成员变量
  * b:构造方法:有
    * 用于子类访问父类数据的初始化
  * c:成员方法:既可以是抽象的,也可以是非抽象的

* B:案例演示
  * 抽象类的成员特点

* C:抽象类的成员方法特性:
  * a:抽象方法,    强制要求子类做的事情
  * b:非抽象方法,子类继承的事情,提高代码的复用性

class Demo2_Abstract {
public static void main(String[] args) { }
} abstract class Demo {
int num1 = 10;
final int num2 = 20; public Demo() {
System.out.println("空参构造");
} public void print() {
System.out.println("非抽象的方法");
} public abstract void method();
} class Test extends Demo {
public void method() { // 方法重写
System.out.println("抽象的方法");
}
}

抽象类中的面试题

* A:面试题 1

  * 一个抽象类如果没有抽象方法,可不可以定义为抽象类? 如果可以,有什么意义?
    * 可以
    * 这么做的目的只有一个,就是不让其他类创建本类对象,交给子类完成

* B:面试题 2
  * abstract 不能和哪些关键字共存
    * abstract 不能和 static 组合,   该方法没有抽象体,用类名调用没有意义。
    * abstract 不能和 final 组合,     被abstract 修饰的方法 强制子类重写,而被final 修饰的方法则被禁止重写。
    * abstract 不能和 private 组合, 被private 修饰的方法禁止子类访问,则abstract 方法无法被重写。


接口的概述及其特点

* A:接口概述

  * 从狭义的角度将就是指 Java 中的 interface
  * 从广义的角度将对外提供的规则的都是接口

* B:接口的特点

  * a:接口用关键字 interface 表示
    * interface 接口名 { }

  * b:类 实现 接口用implements表示
    * class 类名 implements 接口名 { }

  * c:接口不能直接实例化
    * 按照多态的方式来实例化

  * d:接口的子类

    * a:可以是抽象类,但是意义不大
    * b:可以是具体类,要重写接口中的所有抽象方法

* C:案例演示

  * 接口特点

class Demo1_Interface {
public static void main(String[] args) {
//Inter i = new Inter(); // 接口不能被实例化
Demo i = new Demo(); // 父类引用指向子类对象
i.print();
}
} interface Inter {
public abstract void print(); // 抽象方法声明 } class Demo implements Inter { // 具体类继承
public void print() {
System.out.println("print");
}
} abstract class Demo2 implements Inter { // 抽象类继承 }

接口的成员特点

* A:接口成员特点

  * 成员变量:只能是常量,并且是静态的、公开的
    * 默认修饰符:public static final   三个关键字可以交换位置
    * 建议:自己手动给出

  * 构造方法:接口没有构造方法

  * 成员方法:只能是抽象方法
    * 默认修饰符:public abstract
    * 建议:自己手动给出

* B:案例演示

  * 接口成员的特点

class Demo2_Interface {
public static void main(String[] args) {
Demo d = new Demo();
d.print();
System.out.println(Inter.num);
}
} interface Inter {
//public Inter() {} //接口中没有构造方法
public static final int num = 10; //接口中的变量都是常量
//public void print() {} //接口中不能定义非抽象方法
} class Demo extends Object implements Inter { // 构造方法默认继承 Object 的
public Demo() {
super();
} public void print() { // 权限不能降低
//num = 20; // num 是常量,不能被修改
System.out.println(num);
} }

类与类,类与接口,接口与接口的关系

* A:类与类,类与接口,接口与接口的关系

  * a:类与类:
    * 继承关系,只能单继承,可以多层继承

  * b:类与接口:
    * 实现关系,可以单实现,也可以多实现
    * 并且还可以在继承一个类的同时实现多个接口

  * c:接口与接口
    * 继承关系,可以单继承,也可以多继承

* B:案例演示

  类与类,类与接口,接口与接口的关系

class Demo3_Interface {
public static void main(String[] args) {
Demo d = new Demo();
d.printA();
d.printB();
}
} interface InterA {
public abstract void printA();
} interface InterB {
public abstract void printA();
} interface InterC extends InterA, InterB { // 接口之间可以多继承 } class Demo implements InterC { // 类可以多实现
public void printA() {
System.out.println("A");
} public void printB() {
System.out.println("B");
}
}

抽象类和接口的区别

* A:成员区别

  * 抽象类:
    * 成员变量:可以是变量,也可以是常量
    * 构造方法:有
    * 成员方法:可以抽象,也可以非抽象

  * 接口:
    * 成员变量:只可以是常量
    * 构造方法:无
    * 成员方法:只可以是抽象

* B:关系区别
  * 类与类
    * 继承,单继承

  * 类与接口
    * 实现,单实现,多实现

  * 接口与接口
    * 继承,单继承,多继承

* C:设计理念区别
  * 抽象类    被继承体现的是:“is a ”     的关系。 抽象类中定义的是该继承体系的共性功能
  * 接口        被实现体现的是:“like a ”  的关系。 接口中定义的是该继承体系的扩展功能

Java 面向对象 04的更多相关文章

  1. 111 01 Android 零基础入门 02 Java面向对象 04 Java继承(上)02 继承的实现 01 继承的实现

    111 01 Android 零基础入门 02 Java面向对象 04 Java继承(上)02 继承的实现 01 继承的实现 本文知识点: 继承的实现 说明:因为时间紧张,本人写博客过程中只是对知识点 ...

  2. Java面向对象04——构造器

    类中的构造器也成为构造方法,是在进行创建对象的时候必须调用的.并且构造器有以下两个特点: 必须和类的名字相同 必须没有返回值,也不能写void  package oop.demon01.demon02 ...

  3. 094 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 04 static关键字(续)

    094 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

  4. 090 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 04 使用包进行类管理(2)——导入包

    090 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

  5. 085 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 04 构造方法调用

    085 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 04 构造方法调用 本文知识点:构造方法调用 说明:因为时间紧张,本人写博客过程中只是 ...

  6. 079 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 04 实例化对象

    079 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 04 实例化对象 本文知识点:实例化对象 说明:因为时间紧张,本人写博客过程中只是对知 ...

  7. Java面向对象:接口

    Java面向对象之接口 什么是接口:接口是一种规范和标准,他们可以约束类的行为,是一些方法特征的集合 语法: [修饰符] interface 接口名 extends 父接口1,夫接口2....... ...

  8. Java面向对象 集合(下)

      Java面向对象 集合(下) 知识概要:               (1)Map集合的体系结构 (2)Map集合的方法 (3)HashMap TreeMap (4)集合框架中的常用工具类 ( ...

  9. 20175209 实验二《Java面向对象程序设计》实验报告

    20175209 实验二<Java面向对象程序设计>实验报告 一.实验前期准备 了解三种代码 伪代码 产品代码 测试代码 我们先写伪代码,伪代码 从意图层面来解决问题: 有了伪代码 我们用 ...

随机推荐

  1. AC自动机算法 && 例题

    参考链接: https://blog.csdn.net/bestsort/article/details/82947639#commentBox https://blog.csdn.net/niush ...

  2. 数位dp整理 && 例题HDU - 2089 不要62 && 例题 HDU - 3555 Bomb

    数位dp: 数位dp是一种计数用的dp,一般就是要统计一个区间[li,ri]内满足一些条件数的个数.所谓数位dp,字面意思就是在数位上进行dp.数位的含义:一个数有个位.十位.百位.千位......数 ...

  3. entity framwork修改指定字段

    1.ef修改时指修改指定字段public void ChangePassword(int userId, string password) { var user = new User() { Id = ...

  4. Zabbix 配置监控 & 触发器

    Zabbix 自定义监控 zabbix-agent 获取数据,然后定义,交给 zabbix-server 端 Zabbix 配置监控项 监控的内容 # 监控服务器登录用户的数量 [root@web01 ...

  5. Kubernetes安装EFK教程(非存储持久化方式部署)

    1.简介 这里所指的EFK是指:ElasticSearch,Fluentd,Kibana ElasticSearch Elasticsearch是一个基于Apache Lucene的开源搜索和数据分析 ...

  6. docker的网络-单主机(三种原生网络)none、host、bridge

    docker的网络分为:单主机.跨主机 这篇先说:单主机 我们先说一下docker的原生网络模式 网络模式 简介 优点 使用场景 none 空网络,没有网络 此网络与外界隔离,安全度非常高 适合公司内 ...

  7. 桶排序 && leetcode 41

    桶排序 对于0-1000 ,用1001个桶  简单版 或者用10个桶0-9,先按各位装桶,然后依(桶)次放回,然后再按十位放桶,放回,然后百位. 也就是基数排序 https://www.cnblogs ...

  8. 图解算法——KMP算法

    KMP算法 解决的是包,含问题. Str1中是否包含str2,如果包含,则返回子串开始位置.否则返回-1. 示例1: Str1:abcd123def Str2:123d 暴力法: 从str1的第一个字 ...

  9. Web 前端 UI 组件库文档自动化方案 All In One

    Web 前端 UI 组件库文档自动化方案 All In One 需求 自动化 动态 好用 markdown element-ui 中示例和说明按照一定规则写在md文件中,调用md-loader将md文 ...

  10. Linux shell script All In One

    Linux shell script All In One refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!