zoukankan      html  css  js  c++  java
  • Java06——面向对象

    本文章是本人根据视频和网上资料整理所写笔记,可能有不通顺或遗漏的地方,请尽量参考学习来源处的链接去进行学习。

    学习来源

    【狂神说Java】Java零基础学习视频通俗易懂:https://www.bilibili.com/video/BV12J41137hu

    菜鸟教程: https://www.runoob.com/

    阿里巴巴Java开发手册

    程序员小白入门,Java什么是面向对象?https://zhuanlan.zhihu.com/p/115550581

    里氏替换原则的介绍 https://www.douban.com/note/363404356/

    JAVA单例模式:就是把构造方法弄成私有的 https://blog.csdn.net/lovestudy_girl/article/details/51735773

    Java之封装,继承,多态 https://www.cnblogs.com/fenjyang/p/11462278.html

    Java内部类详解 https://www.cnblogs.com/dolphin0520/p/3811445.html

    1.什么是面向对象?

    面向对象(OOP)概述

    将现实的事物抽象出来,注意抽象这个词是重点啊,把现实生活的事物以及关系,抽象成类,通过继承,实现,组合的方式把万事万物都给容纳了。实现了对现实世界的抽象和数学建模。

    举个最简单点的例子来区分面向过程和面向对象

    有一天你想吃鱼香肉丝了,怎么办呢?你有两个选择

    1、自己买材料,肉,鱼香肉丝调料,蒜苔,胡萝卜等等然后切菜切肉,开炒,盛到盘子里。

    2、去饭店,张开嘴:老板!来一份鱼香肉丝!

    看出来区别了吗?1是面向过程,2是面向对象。

    面向对象有什么优势呢?首先你不需要知道鱼香肉丝是怎么做的,降低了耦合性。

    如果你突然不想吃鱼香肉丝了,想吃洛阳白菜,对于1你可能不太容易了,还需要重新买菜,买调料什么的。对于2,太容易了,大喊:老板!那个鱼香肉丝换成洛阳白菜吧,提高了可维护性。总的来说就是降低耦合,提高维护性!

    面向过程是具体化的,流程化的,解决一个问题,你需要一步一步的分析,一步一步的实现。

    面向对象是模型化的,你只需抽象出一个类,这是一个封闭的盒子,在这里你拥有数据也拥有解决问题的方法。需要什么功能直接使用就可以了,不必去一步一步的实现,至于这个功能是如何实现的,管我们什么事?我们会用就可以了。

    面向对象的底层其实还是面向过程,把面向过程抽象成类,然后封装,方便我们使用的就是面向对象了。

    面向过程和面向对象的区别

    面向过程

    优点:性能比面向对象好,因为类调用时需要实例化,开销比较大,比较消耗资源。
    缺点:不易维护、不易复用、不易扩展

    面向对象

    优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护
    缺点:性能比面向过程差

    面向对象三大特性五大原则

    img

    其他原则字面意思很好理解,里氏替换通俗来讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能

    2.类与对象

    对象:

    • 对象是类的一个实例(对象不是找个女朋友),有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。

    类:

    • 类是一个模板,它描述一类对象的行为和状态。

    下图中男孩(boy)女孩(girl)类(class),而具体的每个人为该类的对象(object)

    img

    下图中汽车类(class),而具体的每辆车为该汽车类的对象(object),对象包含了汽车的颜色、品牌、名称等。

    img


    3.构造方法

    构造的重载

    • 默认的无参构造
    • 如果有有参构造,那么必须手动加一个无参构造
    
    public class Puppy{
        public Puppy(){
        }
     
        public Puppy(String name){
            // 这个构造器仅有一个参数:name
        }
    }
    
    
    • 单例模式,需要构造器私有(额外补充)
      • 在实际开发过程中,由于调用了一个单例模式,该单例的构造方法是public的。在调用时候,采用了Singleton singleton = new Singleton();调用,这样的结果就是导致不断的初始化Singleton类,内存很快会耗尽,应用速度变慢。所以,单例模式的构造方法最好定义private,并且通过Singleton.getInstance()调用
      • 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例
    public class Singleton  
    {  
        private Singleton(){  
          
        }  
      
        private static Singleton instance = new Singleton();  
      
        private static Singleton getInstance(){  
            return instance; 
        }
    }
    

    4.new 对象

    对象是根据类创建的。在Java中,使用关键字 new 来创建一个新的对象。创建对象需要以下三步:

    • 声明:声明一个对象,包括对象名称和对象类型。
    • 实例化:使用关键字 new 来创建一个对象。
    • 初始化:使用 new 创建对象时,会调用构造方法初始化对象。

    下面是一个创建对象的例子:

    public class Puppy{
       public Puppy(String name){
          //这个构造器仅有一个参数:name
          System.out.println("小狗的名字是 : " + name ); 
       }
       public static void main(String[] args){
          // 下面的语句将创建一个Puppy对象
          Puppy myPuppy = new Puppy( "tommy" );
       }
    }
    
    

    额外补充:

    栈:存放引用

    堆:存放具体的对象

    5.封装

    隐藏对象的属性和实现细节,仅对外提供公共访问方式,将变化隔离,便于使用,提高复用性和安全性。

    属性私有

    我们对象类中常常写的:set和get方法去

    6.继承

    提高代码复用性;继承是多态的前提。

    关键要点:

    extends:继承关键字

    public class 类A extends 类B{
    }
    

    Object

    子类拥有父类的全部属性特征

    方法重写

    this

    super

    Java单继承,一个父类

    子类修饰符不能高于父类

    7.多态

    • 继承

    • 父类引用指向子类的对象:

    Person person = new Studen();
    
    • 注意:在多态中,编译看左边,运行看右边

    注意:

    • instanceof关键字,如果匹配,可以进行类型之间的转换

    • 它是向上转型

      1,格式:父类名称 对象名 = new 子类名称(); 
      含义:右侧创建一个子类对象,把它当作父类来使用。
      注意:向上转型一定是安全的。
      缺点:一旦向上转型,子类中原本特有的方法就不能再被调用了。	
      

      img

    8.修饰符

    public

    protected

    private

    static

    final

    abstract

    9.接口

    interface

    约束,只能定义方法名

    子类实现接口,必须重写其中的方法

    只有一个方法的接口叫函数式接口,可以使用lambad表达式

    接口比抽象类更抽象

    • 抽象类可以有实现,但是接口只能全是对象

    一个类可以实现多个接口

    10.内部类

    局部内部类

    静态内部类

    匿名内部类(重点)

  • 相关阅读:
    第十七篇 ORM跨表查询和分组查询---二次剖析
    第十六篇随机验证码
    第十五篇 用户认证auth
    crawler_网络爬虫中编码的正确处理与乱码的解决策略
    java_Eclipse自动生成作者、日期注释等功能设置_导入 xml方式
    mysql_windows_安装版添加到服务开机自启动
    java_model_dao_自动生成_generator-mybatis-generator-1.3.2 基于maven插件
    java_eclipse_maven_svn_主题彩色插件_全屏插件
    mysql_MYSQL远程登录权限设置
    crawler_phantomjs_windows_linux下demo
  • 原文地址:https://www.cnblogs.com/jiaozhang/p/14611502.html
Copyright © 2011-2022 走看看