day08(equals和==的区别+instanceof运算符+抽象类+接口+多态)

2019.07.08(day08)

**●==和equals的区别**
**=:**
两边是基本数据类型,判断的是变量中的值是否相等
两边是地址,判断的是对象的地址是否相等,如果地址相同,内容一定相同
**equals:**    
    不能判断基本数据类型的数据,只能判断对象是否相等
    如果没有重写equals方法,那么equals方法判断的是地址,因为equals方法是继承自Object的equals方法,Object类中的equals方法判断的是地址。
    如果某个类重写了equals方法,那么就看equals方法中实现的内容是判断什么的,一般情况下判断的是euqls两端对象的内容是否相等。

**●instanceof 运算符:**
    instanceof运算符左边是一个对象,instanceof运算符右边是一个类
    判断instanceof左边的对象是否实施右边的类类型的对象
    instanceof运算符的返回值是boolean
    比如:
        Student stu=new Student();
        System.out.println(stu instanceof Student);//true

**●抽象类:**
一个类中,只要抽象方法,那么这个类就是抽象类,说明这个类不具体。
抽象方法:只有声明,没有方法体。
抽象类也是类,有了类就可以放属性和方法(带方法体,不带方法体)。
抽象类中可以放置属性,属性是用来存储数据的。
抽象类中可以放置有方法体的方法,此方法能够完成某个功能。
抽象类可以放置没有方法体的方法,这个方法就是抽象方法。
抽象类是不能实例化对象的,因为抽象类有抽象方法(jvm可以实例化)。
抽象类只能当父类。
如果在子类把所有的抽象方法都补上方法体那么这个子类就不是抽象类,就可        以实例化对象了,同时也可以调用方法了。
如果在子类中没有把所有的抽象方法给补上方法体,那么这个类还是抽象类,满足抽象类的用法。
抽象方法不能用static fianl private修饰。

**抽象类的应用场景:**
          在父类中有些方法没有方法体,或者没有必要给上方法体。
          此时把方法做成抽象方法,此类就变成抽象类。

把抽象类抽象到极致,所有的方法都是没有方法体的,此情况不建议做成类,建议做成接口。

**●接口:**
    接口中的所有方法都是抽象方法,即没有方法体,接口方法。
    接口中可以放属性,但是属性默认是public static fianl的(不建议)。
    接口不适合存储数据,更适合做功能。
    而类更适合存储数据。

**接口的特点:**
    定义接口的关键字是interface。
    接口中的方法和属性都是公有的。
    接口是不能实例化对象的,必须由子类实现接口,且子类可以实现多个接口, 多个接口用逗号来间隔,解决了java单继承的问题。
    子类实现接口的关键字implements,直到子类把接口中所有的方法都实现了,        才可以实例化子类对象,否则子类就是抽象类。
    接口中可以有属性,但默认的是public static fianl(不安全,不能修改,不适合存储数据)。
    接口中可以有方法,方法必须都是没有方法体的,且是公有的,public可以省略。
    接口不能实现接口,但接口可以继承接口,而且还可以多继承。
            即接口extands接口1,接口2...
    接口中没有构造方法。

**结论:**
    接口更适合放置方法,而不适合存数据
    类适合存储数据,抽象类和普通类
    接口就是对子类功能的规范,子类必须全部实现接口中的方法

**为什么要使用接口:**    
    1.用接口可以限定子类,必须实现接口规定的方法,以保证项目功能的完整性。
    2.用接口可以实现多态,有接口就一定有继承,而多态是以继承为基础的。

**●多态:**
    顾名思义就是多种表现状态。
    最直观的理解:有对象名称,用对象名称打点调用方法在不同的时候执行的方法的功能是不一样的。
    
***多态的判断标准:**
    1.跨类且继承,多态是以继承作为基础的,而继承是以封装为基础的
    2.子类重写长辈的方法
    3.子类对象赋值给长辈的引用
        比如:    
            CommonPerson cp=new Student();
            Person p=new Student();
    4.用长辈的引用打点调用方法
        -用对象打点能调用出那些方法取决于这个对象所对应的类或接口                中有那些方法
        -如果用长辈的引用打点调用的方法,是重写过的方法
            那么就执行子类重写后的方法
        -如果对象用长辈的引用打点调用的方法是没有重写的方法,
            则执行的是本长辈中的方法
**例:**
    

   

 Person接口:
            study();
            eat();
            
    abstract CommonPerson类 实现了Person接口
            String name;
            int age;
            abstract study();
            abstract eat();
            sleep();
    
    Student类 继承自CommonPerson
            String num;
            重写:是学生学习和吃的方式
                study();
                eat();
            自己的方法
                homework();
                
    Teacher类 继承自CommonPerson
            int salary;
            重写:是老师学习和吃的方式
                study();
                eat();
            自己的方法:
                teach();
    
    在main方法中:
            CommonPerson cp1=stu1;
                cp1.study();//能打点出的方法取决于等号的左边,执行的内容是等号右边的
                cp1.eat();
                cp1.sleep();
        
            Person p1=stu2;
                p1.study();
                p1.eat();

**能够表达出多态的应用场景:**
    1.以长辈作为方法或函数的参数
    2.以长辈作为方法或函数的返回值

**如果不使用多态:**
    -代码的书写量大
    -结构不优化
    -代码的复用率不高(复用率低)
    -最终导致开发效率低
    -优点,代码的可读性很高

**如果使用多态:**
    -把所有的共有属性抽象出来放在长辈类中,用于表示数据的吞吐
    -把所有的共有方法抽象出来放在接口中,用于表示功能
    -使用多态会增加类和类之间的关系,导致类和类之间的复杂度增高
    -使用多态可以提高代码的复用率
    -使用多态可以提高开发的效率
    -使用多态,程序的结构优化

    

    
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值