11-Java多态抽象接口

1.多态(polymorphic)概述

       #事物存在的多种形态

2.多态前提

       #a.要有继承关系

       #b.要有方法重写

       #c.要有父类引用指向子类对象

3.案例演示

        代码体现多态

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

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

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

输出10;编译看左边,运行看左边

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

成员方法,编译看左边,运行看右边

class Father{    
    int num = 10;
    public void print(){
        System.out.println("father");
    }
    public static void main(String[] args){
        Father n = new Son();
        n.print();
    }
}

class Son extends Father{
    int num = 20;
    public void print(){
        System.out.println("son");
    }
}

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

静态方法

        编译看左边,运行看左边(静态和类相关,算不上重写,所有,访问还是左边的)

        只有非静态的成员方法,编译看左边,运行看右边

class Father{    
    int num = 10;
    public void print(){
        System.out.println("father");
    }
    public static void method(){
        System.out.println("static in father");
    }
    public static void main(String[] args){
        Father n = new Son();
        n.method();
    }
}

class Son extends Father{
    int num = 20;
    public void print(){
        System.out.println("son");
    }
    public static void method(){
        System.out.println("static in son");
    }
}

超人故事

class SuperMan{
    public static main(String[] args){
        Person p = new SuperMans();//父类引用指向子类对象
        System.out.println(p.name);
        p.tan();
        //p.fly();//报错
        //向上转型和向下转型,后面讲
    }
}
class Person{
    String name = "John";
    public void tan(){
        System.out.println("谈生意");
    }
}
class SuperMans extends Person{
    String name = "superMan";
    public void tan(){
        System.out.println("谈几个亿的大单子");
    }
    public void fly(){
        System.out.println("飞出去救人");
    }
}    

多态中向上转型和向下转型

案例演示,修改上面的代码

Person p = new SuperMans();//向上转型

SuperMans sm = (SuperMans) p;//向下转型 

大家可以试着修改一下上面的代码

*多态的好处与弊端

A.多态的好处

提高了代码的维护性(继承保证)

提高了代码的扩展性(由多态保证)

B:案例演示

多态的好处

可以当作形式参数,可以接受任意子类对象

多态的弊端

不能使用子类的特有属性和行为

class Animal{
    public void eat(){
        System.out.println("动物吃饭");
    }
}
class Cat extends Animal{
    public void eat(){
        System.out.println("猫吃鱼");
    }
    public void catchMouse(){
        System.out.println("猫抓老鼠");
    }

    public static void main(String[] args){
        methed(new Cat());
        methed(new Dog());

    }
    public static void method(Animal c){//开发中好处的体现,当参数的时候好处多
      //  c.eat();
//关键字instanceof 判断前边的引用是否是后边的数据类型
        if( a instanceof Cat){
            Cat c = (Cat) a;
            c.eat();
            c.catcjMouse();
        }else if(a instanceof Dog){
            Dog d = (Dog) a;
            d.eat();
            d.lookHome();
        }else{
            a.eat();
        }
    }
}
class Dog extends Animal{
    public void eat(){
        System.out.println("狗吃肉");
    }
    public void lookHome(){
        System.out.println("狗看家");
    }

抽象类的概述及其特点

A:抽象类概述

抽象就是看不懂的

B:抽象类特点

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

abstract class 类名 {}

public abstract void eat();

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

抽象类不能实例化那么,抽象类如何实例化呢?

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

抽象类的子类

要么是抽象类

要么重写抽象类中的所有抽象方法

案例演示

abstract class Animal{
//抽象类
    public abstract void eat();
//抽象方法
}

class Cat extends Animal{
    public void eat(){
        System.out.println("猫吃鱼");//继承抽象类必须重写
    }
}
class Abstract{
    public static void main(String[] args){
        Animal a = new Cat();
        a.eat();
    }
}

抽象类特点

抽象类的成员特点

A.抽象类的成员特点

a.成员变量:既可以是变量,也可以是常量。abstract是否可以修饰成员变量?不能修饰成员变量

b:构造方法:有。

用于子类访问父类数据的初始化。

c:成员方法:既可以是抽象的,也可以是非抽象的。

案例演示

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("啦啦啦,啦啦啦,我是卖报的小行家");
    }
}

葵花宝典

案例演示:抽象类的作用

class kuihuabaodian{
    public static void main(String[] args){
        岳不群 a = new 岳不群();
        a.自宫();
    }
}
abstract class kuihua{
    public abstract void 自宫();
}
class 岳不群 extends kuihua{
    public void 自宫(){
        System.out.println("用牙签");
    }
}
class 林平之 extends kuihua{
    public void 自宫(){
        System.out.println("用指甲刀");
    }
}
class 东方不败 extends kuihua{
    public void 自宫{
        System.out.println("用锤子,惨不忍睹");
    }
}

抽象类练习猫狗案例

a.案例演示

具体事物:猫、狗

共性:姓名、年龄、吃饭

猫的特性:抓老鼠

狗的特性:看家

class Test_Animal{
    public static void main(String[] args){
        Cat c = new Cat("加菲",8);
        System.out.pritnln(c.getName() + "..." + c.getAge());
        c.eat();
        c.catchMouse();
        Dog c = new Dog("巴特",2);
        System.out.pritnln(c.getName() + "..." + c.getAge());
        c.eat();
        c.look();

    }
}
abstract class Animal {
    private String name;
    private int age;
    public Animal(){}//空参
    public Animal(String name,int age){
        this.name=name;
        this.age =age;
    }
    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }
    public void setAge(int age){
        this.age = age
    }
    public int getAge()
    {
        return age;
    }
    public abstract void eat();//吃饭
}
class Cat extends Animal{
    public Cat(){}//空参
    public Cat(String name,int age){
        super(name,age);
    }
    public void eat(){
        System.out.println("猫吃鱼");
    }
    public void catchMouse(){
        System.out.println("抓老鼠");
    }
}
class Dog extends Animal{
    public Dog(){}//空参
    public Dog(String name,int age){
        super(name,age);
    }
    public void eat(){
        System.out.println("狗吃肉");
    }
    public void look(){
        System.out.println("狗看家");
    }
}


抽象类练习老师案例

案例演示 

具体事物:高中老师,大学老师

共性:姓名、年龄、讲课

具体事务:高中生,大学生

共性:姓名、年龄、学习

class Test_Animal{
    public static void main(String[] args){
        BaseTeacher bt = new BaseTeacher("加菲",18);
        bt.teach();
        CollegeTeacher c = new CollegeTeacher("巴特",22);
        System.out.pritnln(c.getName() + "..." + c.getAge());
        c.teach();
    }
}
abstract class Teacher {
    private String name;
    private int age;
    public Teacher(){}//空参
    public Teacher(String name,int age){
        this.name=name;
        this.age =age;
    }
    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }
    public void setAge(int age){
        this.age = age
    }
    public int getAge()
    {
        return age;
    }
    public abstract void teach();//讲课
}
class BaseTeacher extends Teacher{
    public BaseTeacher(){}//空参
    public BaseTeacher(String name,int age){
        super(name,age);
    }
    public void teach(){
        System.out.println("我的姓名是:"+this.getName+"我的年龄是:"+this.getAge+"讲的内容是"+"高中课程");
    }
}
class BaseTeacher extends Teacher{
    public BaseTeacher(){}//空参
    public BaseTeacher(String name,int age){
        super(name,age);
    }
    public void teach(){
        System.out.println("我的姓名是:"+this.getName+"我的年龄是:"+this.getAge+"讲的内容是"+"大学课程");
    }
}


抽象类练习员工案例

A.案例演示

假如我们在开发一个系统时需要队程序员类进行设计,程序员包含3个属性:姓名、工号以及工资。

经理,除了含有程序员的属性外,另外还有一个奖金属性。

请使用继承的思想程序设计处程序员类和经理类。要求类中提供必要的方法进行属性访问。

class Test_employee
{
    public static void main(String[] args){
        Coder c = new Coder("德玛西亚","007",8000);
        c.work();
        Manager m = new Manager("苍老师","9527",3000,20000);
        m.work();
    }
}
abstract class Employee{
    private String name;
    private String id;
    private double salary;//工资
    public Employee(){}//空参构造
    public Employee(String name,String id ,double salary){
        this.name=name;
        this.id=id;
        this.salary=salary;
    }
    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }
    public void setId(String id){
        this.id=id;
    }
    public String getId(){
        return id;
    }
    public void setSalary(double salary){
        this.salary=salary;
    }
    public double getSalary(){
        return salary;
    }
    public abstract void work();
}
class Coder extends Employee{
    public Coder(){}
    public Coder(String name,String id,double salary){
        super(name,id,salary);
    }
    public void work(){
        System.out.println("我的姓名是:"+this.getName()+",我的工号是:"+this.getId()+"我的工资是:"+this.getSalary+"我的工作内容是敲代码");
    }
}
class Manager extends Employee{
    private int bonus;//奖金
    public Manager(){}
    public Manager(String name,String id,double salary,int bonus){
        super(name,id,salary);
        this.bonus=bonus
    }
    public void work(){
        System.out.println("我的姓名是:"+this.getName()+",我的工号是:"+this.getId()+"我的工资是:"+this.getSalary+"我的工作是管理程序员"+",我的奖金是"+bonus);
    }
}

抽象类中的面试题

a:一个抽象类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?

答:可以,这么做目的只有一个,就是不让其他类创建本类对象,交给子类完成

b:abstract不能和哪些关键字共存

static:被abstract修饰方法没有方法体,被static修饰的可以用类名.调用,但是类型.调用抽象方法是没有意义的

final:被abstract修饰的方法强制子类重写,被final修饰的不让子类重写,所以他俩是矛盾

private:被abstract修饰的是为了让子类看到并强制重写,被private修饰不让子类访问,所以他俩是矛盾的

接口的概述及其特点

a:接口概述

从狭义的角度讲就是之java中的interface

从广义的角度讲对外提供规则的都是接口

B:接口的特点

接口用关键字interface表示

interface 接口名 {}

类实现接口用implements表示

class 类名 implements 接口名{}

接口不能实例化

那么接口如何实例化呢?

按照多态的方法来实例化

接口的子类

可以是抽象类,但是意义不大

可以是具体类,要重写接口中的所有抽象方法

案例演示

    接口特点

interface Inter{
    public abstract void print();
}

class Demo implements Inter{
    public void print(){
        System.out.println("print");
    }
}
class Test{
    public static void main(String[] args){
        Inter i = new Demo();
        i.print();
    }
}

接口的成员特点

成员变量:只能是常量,并且是静态的并公共的

                  默认修饰符:public static final

                  建议:自己手动给出

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

成员方法:只能是抽象方法

                  默认修饰符:public abstract

                  建议:自己手动给出

案例演示

接口成员特点

class Test{
    public static void main(String[] args){
        Demo d = new Demo();
        d.print();
        System.out.println(Inter.num);
    }
}
interface Inter{
    public static final int num = 10;//默认加前三个关键字,可以互相交换位置
    //public Inter(){} 接口中没有构造方法
   // public void print(){}//接口中不能定义非抽象方法
    abstract void print();
}
class Demo extends Object implements Inter{//一个类不写继承任何类,默认继承Object类
    public void print(){
       // num = 20 ;//报错,无法为最终变量分配值
        System.out.println(num);
    }
}

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

类与类:继承关系,只能但几次,可以多层继承

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

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

案例演示:类鱼类,类与接口,接口与接口的关系

class Test{
    public static void main(String[] args){
    }
}
Interface InterA{
    public abstract void printA();
}
Interface InterB{
    public abstract void printB();
}
//interface InterC implements InterB{
//}一个接口不能实现一个接口
interface InterC extends InterB,InterA{}
//一个接口可以继承多个接口
class Demo implements InterA,InterB{
    public void printA(){
        System.out.println("printA");
    }
    public void printB(){
        System.out.println("printB");
    }
}

抽象类和接口的区别

A成员区别

               抽象类

                             成员变量:可以变量,也可以常量

                             构造方法:有

                             成员方法:可以抽象,也可以非抽象

               接口

                             成员变量:只可以常量

                            成员方法:只可以抽象

 B:关系区别

类与类

              继承、单继承

类与接口

              实现,单实现,多实现

接口与接口

               继承,单继承,多继承

设计理念区别

抽象类:被继承体现的是:“is a”的关系,抽象类中定义的是该继承体系的共性功能

接口:被实现体现的是:"like a"的关系,接口中定义的是该继承体系的扩展功能。

猫狗案例加入跳高功能分析及其代码实现

class Test{
    public static void main(String[] args){
        Cat c = new Cat("加菲".8);
        c.eat();
        c.sleep();
        JumpCat jc = new JumpCat("跳高猫",3);
        jc.eat();
        jc.sleep();
        jc.jump();
    }
}

abstract class Animal{
    private String name;//姓名
    private int age;//年龄
    public Animal(){}//空参构造
    public Animal(String name,int age){
        this.name=name;
        this.age = age;
    }
    public void setName(String name){//设置姓名
        this.name = name;
    }
    public String getName(){//获取名字
        return name;
    }
    public void setAge(int age){//设置年龄
        this.age = age;
    }
    public int getAge(){//获取年龄
        return age;
    }
    public abstract void eat();
    public abstract void sleep();
}
interface Jumping{//跳高的接口
    public void jump();
}
class Cat extends Animal{
    public Cat(){}
    public Cat(String name,int age){
        super(name,age);
    }
    public void eat(){
        System.out.println("猫吃鱼");
    }
    public void sleep(){
        System.out.println("侧着睡");
    }
}
class JumpCat extends Cat implements Jumping{
public JumpCat(){}
    public JumpCat(String name,int age){
        super(name,age);
    }

    public void jump(){
        System.out.println("猫调高");
    }
}
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值