Java 学习 day11:多态,,抽象,接口

1.多态

1.1        相关知识

软件设计六大原则:

        1.单一职责原则

        2.里式替换原则

        3.依赖倒置原则

        4.接口隔离原则

        5.迪米特法则

        6.开闭原则

1.2        多态是什么

多态:父类引用指向子类对象

        父类引用:使用父类声明的引用型变量

        指向:就是通过这个变量可以找到谁

        子类对象:使用子类创建的对象

使用父类的变量可以找到子类的对象

多态的几种形式:

1.直接多态        Animal a = new Animal() ;

2.形参和实参        方法声明时,传入的参数为父类类型,而方法调用的时候,传入的参数是子类对象

 

3.返回值:        返回值类型是父类类型,但是返回的对象时子类对象

 1.3.        缺点

多态缺点:        丢失了子类特有的属性

使用多态进行嗲用:

1.如果父类没有,不管子类有没有,都报错,因为丢失子类特有属性

2.如果父类有,子类没有,使用父类的,因为继承

3.如果父类有,子类也有,除了成员方法执行子类,其他都执行父类(因为只有成员方法可以重写)

1.4        怎么用

 

 1.5        优点

高内聚,低耦合,方便代码的扩展

1.6        隐秘多态

package day_04._01_Polymorphic;

/**

 * 比较隐秘的多态

 *

 * 总结 : 通过子类,调用了父类的方法的时候,父类的这个方法的上下文环境,就是多态环境(属于父类空间,子类对象)

 *

 * @author 天亮教育-帅气多汁你泽哥

 * @Date 2021年10月14日 上午11:04:10

 */

public class Poly_04 {

public static void main(String[] args) {

Sup sup = new Sub();

// 2

System.out.println(sup.i);

// 子类

sup.m2();

Sub sub = new Sub();

// 3

// System.out.println(sub.i);

// 子类

// sub.m2();

sub.m1();

}

}

class Sup {

int i = 2;

public void m1() {

// this : 保存当前类对象的内存地址

//  当前类 : this出现在哪个类,哪个类就是当前类

// 并且 this是第一个成员变量,既然是变量,肯定有数据类型

// 那么this的类型是什么的时候可以存储当前类对象的地址? 1 当前类类型(Sup) 2 父类类型

// 如果是父类类型,说明发生了多态,会丢失特有属性,但是this可以调用当前类中所有的属性,所以this是当前类类型

// Sup this;

// this : 用在成员方法中,哪个对象调用了这个方法,this就指向哪个对象

// 在这里 m1是sub对象调用的,所以this 就指向 sub对象

// 而 sub是继承了Sup的

// 所以 等于是这样  Sup this = sub;   Sub sub = new Sub();  所以  Sup this = new Sub();

// 所以在这里 this 发生了多态

System.out.println(this.i);

this.m2();

}

public void m2() {

System.out.println("父类的m2");

}

}

class Sub extends Sup {

int i = 3;

public void m2() {

System.out.println("子类的m2");

}

}

1.7        Instanceof

多态又叫向上转型

子类到父类是        向上转型,而父类到子类是        向下转型

为什么要向下转型

因为多态的缺点是丢失了子类特有的属性,所以想要调用子类特有属性的时候,需要转换为对应的子类对象

 

 

 

2.抽象        abstract

2.1        抽象类又来表示设计中得到的抽象概念

abstract是一个修饰符,和final互斥

修饰的类是抽象类,只能被继承,无法创建对象

修饰的方法是抽象方法,并且该方法没有方法体

抽象方法一定在抽象类中,但是抽象类中不一定有抽象方法

抽象类虽然不能创造对象,但是有构造方法,因为他的子类对象在创建的时候还需要用

一个非抽象类,在继承抽象类时,需要实现所有的抽象方法

一个抽象类,在继承抽象类时,可以实现0~N个方法

 

3.接口        interface

interface:定义接口的关键字        语法:  权限修饰符 interface 接口名 {类体}

接口主要为了解决java中类只能单继承的问题,可以继承多个接口

接口是一种特殊的类

1.8之前        接口是完全抽象的,只能有抽象方法和常量

1.8开始        接口中允许出现默认方法和静态方法

 怎么用

 

 注意

如果接口和抽象类都能完成一件事,那么优先使用接口,因为接口可以多继承,但是类和类只能单继承

优点

当一个功能拥有多种不同实现的时候,就需要依赖接口编程,此时可以降低耦合度

如果说一个功能,只拥抱一种变化,就不需要使用接口了

还可以使用多态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值