【java日记】第八天:类的多态&抽象&接口

多态的概述及代码体现

事务存在的多种形态。

多态前提

要有继承关系

要有方法重写

要有父类引用指向子类对象

package java1;

public class ba_10 {

public static void main(String[]args) {

    animal1 p1=new cat11();

p1.eat();

System.out.println(p1.num3);

}

}

class animal1{

int num3=10;

public void eat() {

System.out.println(“动物鱼”);

}

}

class cat11 extends animal1 {

int num3=30;

public void eat() {

System.out.println(“猫吃鱼”);

}

}

9.2

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

father p1=new son;

son访问的是父类,super里的内容。所以输出的是father的变量和方法

father p1=new father;访问的是自己的对象,所以就近原则,用的是自己的内容

package java1;

public class ba_10 {

public static void main(String[]args) {

    animal1 p1=new cat11();

p1.eat();

System.out.println(p1.num3);

}

}

class animal1{

int num3=10;

public void eat() {

System.out.println(“动物鱼”);

}

}

class cat11 extends animal1 {

int num3=30;

public void eat() {

System.out.println(“猫吃鱼”);

}

}

9.3

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

动态绑定

编译看左边,运行看右边。

package java1;

public class ba_10 {

public static void main(String[]args) {

    father1 p1=new son1();

p1.show();

//System.out.println(p1.num3);

}

}

class father1{

int num=10;

public void show() {

System.out.println(“我是爸爸”);

}

}

class son1 extends father1 {

int num=30;

public void show() {

System.out.println(“我是儿子”);

}

}

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

成员变量:

编译看左边,运行看左边

成员方法:

编译看左边,运行看右边。动态绑定。(因为子类对象对父类对象的方法进行了一次重写,所以,地址值对象里的方法是子类的方法。)

静态方法:

编译看左边,运行看左边。

(静态和类相关,算不上重写,所以,访问还是左边)

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

package java1;

public class ba_10 {

public static void main(String[]args) {

    father1 p1=new son1();

p1.show();

//System.out.println(p1.num3);

}

}

class father1{

int num=10;

public static void show() {

System.out.println(“我是爸爸”);

}

}

class son1 extends father1 {

int num=30;

public static void show() {

System.out.println(“我是儿子”);

}

}

9.5超人的故事。

父类引用子类对象——就是向上转型

父类引用子类对象要使用子类的方法——完成向下转型后,才能使用子类的特有方法。

Man p1=new superman(); //父类引用子类对象,向上转型

Superman sm=(superman)p1; //强制转换,向下转型

package java1;

public class SuperMan {

public static void main(String[]args) {

Man p1=new deomo_SuperMan();

System.out.println(p1.name);

p1.talk();

System.out.println(“有人要跳楼,超人要救人,p1无法调用子类lfy方法,怎么解决?”);

//向上向下转型 父类引用子类对象,就是向上转型

//现有向上转型,再有向下转型

deomo_SuperMan s1m=(deomo_SuperMan)p1;

//deomo_SuperMan sm=(deomo_SuperMan)p1;//开始变身!

s1m.fly();

}

}

class Man{

String name=”约翰”;

public void talk() {

System.out.println(“约翰谈生意”);

}

}

class deomo_SuperMan extends Man{

String name=”超人”;

public void talk() {

System.out.println(“超人谈生意”);

}

public void fly() {

System.out.println(“飞出去救人”);

}

}

9.7多态的弊端

不能使用子类特有的属性和方法。

好处:提高代码的维护性

  提高了代码的扩展性

当做参数的时候用多态最好,因为扩展性强

package java1;

public class feiji {

public static void main(String[]args) {

method(new gongju());

method(new danche());

method(new che());

gongju a=new che();

che b=(che)a;

b.lunzi();

//关键字 instanceof 判断前边的饮用是否是后边的数据类型

}

/*public static void method (che c) {

c.run();

}

public static void method (danche c) {

c.run();

}*///当做参数的时候用多态最好,因为扩展性强

public static void methid(gongju a) {}

//如果要使用子类特有属性要强转。

public static void method (gongju a) {

 if(a instanceof che) {

 che c=(che)a;

 c.lunzi();

 c.run();

 }else if(a instanceof danche) {

 danche c=(danche)a;

 c.run();

 c.qidanche();

 }

}

}

class gongju{

public void run() {

System.out.println(“公有方法”);

}

}

class che extends gongju{

public void run() {

System.out.println(“车公有方法”);

}

public void lunzi() {

System.out.println(“车的特有方法”);

}

}

class danche extends gongju{

public void run() {

System.out.println(“单车公有方法 “);

}

public void qidanche() {

System.out.println(“单车特有方法”);

}

}

9.9抽象类的概述及其特点

抽象,就是看不懂的。

特点

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

Abstract class 类名{}

Public Abstract void run();

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

抽象类不能实例化,那么有什么巧妙办法实例化抽象类呢?

抽象类的子类

要么是抽象类

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

package java1;

public class jiu_10 {

public static void main(String[]args) {

tian a=new ren();

a.run();

ren b=new ren();

b.run();

}

}

abstract class tian{

public abstract void run();

}

abstract class di{

public abstract void eat();

}

class ren extends tian{

public void run() {

System.out.println(“对抽象类进行实例化通过继承实现,而且必须重写父类抽象类的抽象方法”);

}

}

9.10抽象类的成员特点

1,成员变量,既可以是变量,也可以是常亮。Abstract是否可以修饰成员变量?不能修饰成员变量

2,构造方法,有

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

抽象类的成员方法特性

1,抽象方法,强制要求子类做的事情

2,非抽象方法,子类继承的事情,提高代码的复用性。

抽象的方法。

package java1;

public class jiu_100 {

public static void main(String[]args) {

//domo c=new domo_a();

//c.zou();

//c.run();

method(new domo_a());

//method(new domo());父类是个抽象类,所以无法进行创建对象

}

public static void method(domo a) {

if(a instanceof domo_a) {

a.run();

a.zou();

}

}

}

abstract class domo{

int a=10;//成员变量既可以是变量也可以使常量

final int b=20;//抽象类的成员变量既可以是变量也可以使常量

//abstract 不能修饰成员变量,因为值本来就是固定的,无法修饰。

public domo() {

System.out.println(“抽象类父类空参构造”);

}

public void run() {} //非抽象的成员方法

public abstract void zou();//抽象的成员方法,是强制要求子类做的事情。

}

class domo_a extends domo{

public void zou() {

System.out.println(“抽象的方法,子类必须要重写。必须得用”);

}

}

9.11葵花宝典练习题

package javahome;

public class jiu_11 {

public static void main(String[]args) {

method(new yuebuqun());

method(new aobai());

method(new dongfangbubai());

}

public static void method(kuihuabaodian a) {

    if(a instanceof yuebuqun) {

    yuebuqun c=(yuebuqun)a;

    c.zigong();

    c.yuebuqun();

    }else if(a instanceof dongfangbubai) {

    dongfangbubai c=(dongfangbubai)a;

    c.zigong();

    c.dongfangbubai();

    }else if(a instanceof aobai) {

    aobai c=(aobai)a;

    c.zigong();

    c.aobai();

    }

}

}

abstract class kuihuabaodian{

public abstract void zigong();

}

class yuebuqun extends kuihuabaodian{

public void zigong() {

System.out.println(“岳不群用小刀自宫”);

}

public void yuebuqun() {

System.out.println(“我是岳不群”);

}

}

class dongfangbubai extends kuihuabaodian{

public void zigong() {

System.out.println(“东方不败用菜刀自宫”);

}

public void dongfangbubai() {

System.out.println(“我是东方不败”);

}

}

class aobai extends kuihuabaodian{

public void zigong(){

System.out.println(“鳌拜找太监帮他自宫”);

}

public void aobai() {

System.out.println(“我是鳌拜”);

}

}

9.12抽象类 猫狗练习

package javahome;

public class jiu_12 {

public static void main(String[]args) {

dog a=new dog(“旺财”,8);

System.out.println(a.getAge()+a.getName());

a.eat();

a.show();

cat b=new cat(“喵喵”,20);

System.out.println(b.getAge()+b.getName());

b.eat();

b.show();

}

}

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 this.name;

}

public void setAge(int age) {

this.age=age;

}

public int getAge() {

return this.age;

}

public abstract void eat() ;

}

class dog extends animal{

public dog() {}

public dog(String name,int age) {

super(name,age);

}

public void eat() {

System.out.println(“狗吃骨头”);

}

public void show() {

System.out.println(“狗会汪汪”);

}

}

class cat extends animal{

public cat() {}

public cat(String name,int age) {

super(name,age);

}

public void eat() {

System.out.println(“猫吃鱼”);

}

public void show() {

System.out.println(“猫会喵喵”);

}

}

9.13抽象练习,老师

9.14抽象练习,员工

9.15 抽象类中的面试题

9.16接口的概述及其特点

接口概述:

从狭义上讲,就是java中的interface

从广义上讲,对外提供规则的都是接口

接口特点

1,接口用关键字interface表示

2,Interface 接口名()

3,类实现接口用implements表示

4,Class 类名 implements 接口名 {}

5,接口不能实例化

6,那么,接口如何实例化呢?

7,按照多态的方式来实例化

8,接口的子类

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

10,可以是具体类,要重写接口中的所有抽象方法(推荐方案)

package javahome;

public class jiu_16 {

public static void main(String[]args) {

demo12 a=new demo9();

a.run();

}

}

interface demo12{

public abstract void run() ;

}

class demo9 implements demo12{

public void run() {

System.out.println(“这是继承接口的实例化显示”);

}

}

//接口和抽象类最大的区别是,接口里必须都是抽象方法,而抽象类中不一定有抽象方法

9.17接口的成员特点

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

默认修饰符,public static final

建议,自己手动给出

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

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

默认修饰符public abstract

建议手动给出

一个类如果不写继承的任何类的话,默认继承object类

package javahome;

public class jiu_16 {

public static void main(String[]args) {

demo12 a=new demo9();

a.run();

System.out.println(demo12.num);

}

}

interface demo12{

public static final int num=10;

public static final int num2=20;

public abstract void run() ;

}

class demo9 implements demo12{

public void run() {

System.out.println(“这是继承接口的实例化显示”);

}

}

//接口和抽象类最大的区别是,接口里必须都是抽象方法,而抽象类中不一定有抽象方法

9.18

接口与接口的关系

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

接口与类的关系

实现关系,可以单实现,也可以多实现

9.19抽象类和接口的区别

猜你喜欢

转载自blog.csdn.net/weixin_42909272/article/details/81539656