面向对象

前言

面向对象这一章是最重要的一章. 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可以帮我们在类中获取到对象的任何信息.
 
 
 
 
posted @ 2020-01-13 22:04  元贞  阅读(157)  评论(0编辑  收藏  举报