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

    前言

    面向对象这一章是最重要的一章. java是一门纯面向对象编程语言, 我们后面写的所有程序都是在面向对象的基础上编写的. 但是, 很多童鞋在学完这一章会发现, 没学到什么. 确实是这样. 面向对象难在思想和语法上. 真正应用的时候会不知不觉的渗透在你的代码里. 好多程序员写程序会写, 但是为什么这样写? 不知道. 所以本章很多都是理解和需要思考的东西.
    在本章你要学的重点知识点:
    类与对象
    构造方法
    访问权限
    继承
    多态 ( 最重要 )
    抽象和接口
    内存分析
     
    其他知识点不是说不重要. 相对而言. 最重要的是上面这几个.
     

    面向对象和面向过程

    讲面向对象之前, 还要再提两个概念, 没有对比就没有伤害~~:
     
    面向过程:
    从名字上可以看出来, 编程的思路是按照事务的发展流程而编写的. 最典型的例子就是宋丹丹的那个特别niubility的问题: 要把大象装冰箱总共分几步? 第一步, 把冰箱门打开, 第二步, 把大象装进去, 第三步.把冰箱门带上. 此时, 宋丹丹给的答案就是典型的面向过程的思维方式.
    优点: 想起来简单, 写起来也简单
    缺点: 维护困难. 代码量越大, 越难维护.
     
    面向对象:
    一切以对象为中心. 我们扮演的是上帝的角色. 比如, 同样是大象进冰箱, 用面向对象的思维来解决的话就是, 创建一个大象, 然后告诉大象, 进冰箱里面去. 具体怎么进冰箱由大象来完成. 面向对象的思维可以把”我”的工作减少到最低. 由对象来完成具体的操作.
    优点: 超强的可扩展性. 可维护性.
    缺点: 上手比较难, 尤其是刚开始就接触面向对象.

    类与对象

    既然要学习面向对象. 那我们就需要知道在代码的世界里如何创建对象. 就好比, 在生活中, 你需要一辆车. 那如何创建一辆车. 假设, 不存在任何技术壁垒. 就让你造一辆车. 你该怎么办呢?
     
    造车的过程:
    画图纸, 画图纸分成两部分:
    把车的概念先定义下来, 比如, 车长什么样? 车的颜色? 车的最高速度? 档位有几个? 等等.
    把车能做的事情规划好, 比如, 车能跑, 车能跳高, 车能飞等等.
    不要在意为什么车能跳高. 面向对象的世界. 你是主宰. 你是上帝. 你想干嘛就干嘛
    拿着图纸去车间里制造一辆车.
     
    上述过程中画图纸的过程就是写类. 拿着图纸去造车就是创建对象. 所以, 类是什么? 类是对具体事务的描述.对某一类事务的总结. 对事物的归类. 对象是什么? 对象就是车. 就是具体要执行操作的事务.
    类是一个概念. 对象是这一类事务的一个具体.
     
    类与对象的关系就是图纸和车的关系.
     
    好了说这么多. 怎么写一个类, 在java中类要使用class来声明. 我们之前已经写过类了. 只是之前并不清楚那是什么.
     
     public class Car {
     
     }
    这就定义了一个类. 也就是画了一张图纸. 但是. 这张图纸现在还是空白的. 我们对车要进行描述. 描述车需要有两个标准去描述, 1. 车有什么属性, 2. 车能干什么.
     
    属性: 使用成员变量来描述属性
    动作: 使用成员方法来描述动作
     
    成员变量是什么? 很简单, 之前不是学过变量么. 我们之前的变量是写在main方法里的. 这里的成员变量指的是直接写在类里的变量叫成员变量. 比如. 车有颜色, 车有品牌, 车有排量等等.
     public class Car {
         String color; // 汽车有颜色
         String brand; // 汽车有品牌
         String displacement; // 汽车有排量
     }
    成员方法是什么? 就是我们之前学习的方法. 把前面的static去掉就是成员方法. 关于static后面我们会讲. 这里不用纠结. 直接干掉就行. 好了, 车能执行哪些动作? 跑, 跳高, 游泳.
     
     public class Car {
         //成员变量. 可以给值, 也可以不给值
         String color; // 汽车有颜色
         String brand = "奔驰"; // 汽车有品牌, 所有车都是奔驰
         String displacement; // 汽车有排量
     
         //成员方法. 车能执行的动作
         public void run(){
             System.out.println("破车会跑");
         }
     
         public void jump(){
             System.out.println("神车~~ 会跳高");
         }
         public void swim(){
             System.out.println("我的车会游泳");
         }
     }

    // 哦了. 类写好了. 图纸也就画好了. 接下来该去造车了.
    public static void main(String[] args) { Car c = new Car(); // 创建对象 } Car c =new Car();
    这句话就是传说中的创建对象了.
    注意, 这里其实是一个赋值操作, 那根据赋值操作的特点. 肯定要先执行等号右边的代码, 然后赋值给等号左边. 我们挨个分析.
    new Car(); new表示创建, 新建. 后面跟的是类名+括号. 整个这句话你可以理解为 创建一个车类型的对象. 那这个车是根据Car类创建的. 所以这个对象一定符合类的定义. 这个很好理解. 用你的图纸造的车. 肯定符合你图纸上设计的样子.
     
    Car c 这是个啥? 对比一下你瞬间秒懂
    String a …… 没错. 就是声明了一个变量. c是Car类型的. 只不过在面向对象的世界里变量是没有市场的. 大家都叫它引用. 这也就是我们讲的第二大数据类型, 引用数据类型. 说的就是咱们写的类. 声明出来的变量.
    整体合起来就是: 创建一个车类的对象. 然后赋值给变量c. 以后变量c就是使用的这辆车.
    OK, 对象创建出来了. 接下来. 怎么用啊. 这破玩意.
    public class Car {
        //成员变量. 可以给值, 也可以不给值
        String color;   // 汽车有颜色
        String brand = "奔驰";   // 汽车有品牌, 所有车都是奔驰
        String displacement;  // 汽车有排量
        // 成员方法. 车能执行的动作
    
        public void run() {
            System.out.println("破车会跑");
        }
    
        public void jump() {
            System.out.println("神车~~ 会跳高");
        }
    
        public void swim() {
            System.out.println("我的车会游泳");
        }
    
        public static void main(String[] args) {
            Car c = new Car();
    
            c.color = "红色"; // 汽车的颜色设置成红色
            c.displacement = "3.6T"; // 排量
    
            //c.seat = 5; // 报错. 在类中你没有写这个属性.
    
            System.out.println(c.color);
            System.out.println(c.brand);
            System.out.println(c.displacement);
    
            c.run();
            c.jump();
            c.swim();
        }
    
    
    }
    类里没有的属性你不能乱用.
    总结: 我们写的类. 又可以看做是类型. 类其实就是对某一类事物的归类和描述. 对象是通过类创建的. 类是抽象概念, 对象是具体.
      
    红色
    奔驰
    3.6T
    破车会跑
    神车~~ 会跳高
    我的车会游泳
     
     

    this关键字

    this是啥? 我们看一个例子.
    public class Car {
        String color;
        int seat;
        String displacement;
    
        public void run() {
            System.out.println(color + "颜色的车在跑");
        }
    
        public static void main(String[] args) {
            Car c = new Car();
            c.color = "红色";
            c.seat = 5;
            c.displacement = "1.6";
            c.run();
        }
    
    }
    这是上节课的例子. 就是写个车. 车能跑. 但是这里注意. 在run方法里我们使用了一次color变量. 此时我们发现可以正常使用.
     
    我们可以发现, 此时使用的color是对象里的color, 那如果我给run()传递一个参数也叫color呢?
     
    public class Car {
        String color;
        int seat;
        String displacement;
    
        public void run(String color) {
            System.out.println(color + "颜色的车在跑");
        }
    
        public static void main(String[] args) {
            Car c = new Car();
            c.color = "红色";
            c.seat = 5;
            c.displacement = "1.6";
            c.run("绿色");
        }
    
    }
     
    运行完结果居然不是红色. 为什么呢? 因为, 方法查找变量的顺序: 方法内部(局部) > 对象. 说白了就是就近原则, 那此时我即想用局部变量又想用对象中的变量. 怎么进行区分呢? 此时就需要用到this关键字.
     
    在java中, this表示当前类的对象
    啥叫当前类的对象. 就是正在执行这个方法的对象.
    c.run() => 在run中this就是c. 你不信? 来, try一try
     
    public class Car {
        String color;
        int seat;
        String displacement;
    
        public void run(String color) {
            System.out.println(color + "颜色的车在跑");
            System.out.println(this);
        }
    
        public static void main(String[] args) {
            Car c = new Car();
            c.color = "红色";
            c.seat = 5;
            c.displacement = "1.6";
            c.run("绿色");
            System.out.println(c);
        }
    
    }
    绿色颜色的车在跑
    Car@1554909b
    Car@1554909b
    OK. 那就算this是对象. 那怎么能区分成员变量和局部变量呢? 简单. 我们在外面是怎么看车的颜色的? c.color? OK. 那就换成this.color就好了. So TM easy
     
    public class Car {
        String color;
        int seat;
        String displacement;
    
        public void run(String color) {
            System.out.println(this.color + "颜色的车在跑 " +color+" 颜色的车飙车");
    //        System.out.println(this);
        }
    
        public static void main(String[] args) {
            Car c = new Car();
            c.color = "红色";
            c.seat = 5;
            c.displacement = "1.6";
            c.run("绿色");
        }
    }

      

    this可以帮我们在类中获取到对象的任何信息.
     
     
     
     
  • 相关阅读:
    SpringBoot标准化搭建
    springboot打开swagger文档遇到For input string: ""的报错 swagger版本2.9.2
    MySQL和Redis如何保证数据一致性? 三种方案对比,初版
    [转]QUdpSocket收发信息
    [原][C++][插件]window下C++简单插件机制实现
    php saas 架构设计,SaaS的几种架构解析
    如何处理将HTML打印出来中的断行,分页,修改打印内容等问题?急,谢谢!!
    批量打印 | 多页打印 | PHP多页打印
    web页面的单页打印以及批量打印实现方法
    php批量打印发票三(php用FPDF合并所有图片为PDF文档)
  • 原文地址:https://www.cnblogs.com/wenyule/p/12189602.html
Copyright © 2011-2022 走看看