面向对象

前言

面向对象这一章是最重要的一章. 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可以帮我们在类中获取到对象的任何信息.

上一篇:js的6种设计模式


下一篇:C++笔记:静态成员函数和静态成员变量的使用