为了账号安全,请及时绑定邮箱和手机立即绑定

1-Java面向对象-面向对象

标签:
Java

通过前面的学习我们对于java的语法结构有了一定的认识,掌握了分支结构,循环结构等常用的程序逻辑,也能运用这些知识解决一些简单问题。

以前我们面向过程,现在我们面向对象。这是从盖小房子走向盖摩天大楼的第一步。

面向对象 : 程序的稳定性 可扩展性 可重用性 都有非常大的优势。

本次学习我们将学习如何通过java语言实现面向对象的三大特征: 继承 封装 多态; 编写具有面向对象思想的java程序。

类和对象

学习内容:

  1. 什么是对象

  2. 什么是面向对象

  3. 什么是类

  4. 类和对象的关系

对象: 万物皆对象,现实中存在的事物都可以看成一个对象。

面向对象: 人关注对象; 人关注事物信息

遵循现实生活中的场景,比如想养一只猫: 小点的,可爱的,不容易掉毛的。店员提供的猫:

5c137dd60001ce1306270310.jpg

这就是一个面向对象的过程。

5c137dd6000180df07500430.jpg

我的描述是一个抽象的虚拟的特征,而店员带我看的两只猫就是满足特征的实物。

5c137dd60001b5a404270428.jpg

类是模子,确定对象将会拥有的特征(属性)和行为(方法); 对象是类的实例表现;类是对象的类型;对象是特定类型的数据

属性和方法: 属性:对象具有的各种静态特征,对象有什么”; 方法:对象具有的各种动态行为,对象能做什么”

类: 类,抽象的概念; 是一个模板 & 对象:是一个看得到、摸得着的具体实体。

创建类

5c137dd700010ea604080497.jpg

名的推荐命名规范: 英文字母小写;域名的倒序

猫的属性: 昵称、年龄、体重、品种; 方法:跑动、吃东西

package cn.mtianyan.animal;/**
 * 宠物猫类
 * @author mtianyan
 */public class Cat {    // 猫的成员属性: 昵称、年龄、体重、品种;
    String name;    int age;    float weight;
    String species;    // 方法:跑动、吃东西
    public void run(){
        System.out.println("小猫在跑");
    }    public void eat(){
        System.out.println("小猫吃鱼");
    }
}

实例化对象

package cn.mtianyan.animal;public class CatTest {    public static void main(String[] args) {
        Cat oneCat = new Cat();
        oneCat.run();
        oneCat.eat();
    }
}

运行结果:

5c137dd70001ca6103510095.jpg

5c137dd800011f6e03860081.jpg

普通的变量如果没有初始化是不能被打印输出的。而对象的成员变量则可以之间打印,因为它们有默认值。

        System.out.println(oneCat.age);

运行结果:

5c137dd8000131bd03450068.jpg

        System.out.println("年龄: "+ oneCat.age);
        System.out.println("昵称: "+ oneCat.name);
        System.out.println("体重: " + oneCat.weight);
        System.out.println("品种: " + oneCat.species);

5c137dd8000145f603560134.jpg

可以看到字符串类型的是null,int型是0,float型是0.0

        oneCat.name = "花花";
        oneCat.age = 2;
        oneCat.weight = 1000;
        oneCat.species = "中华田园猫";
        
        System.out.println("年龄: "+ oneCat.age);
        System.out.println("昵称: "+ oneCat.name);
        System.out.println("体重: " + oneCat.weight);
        System.out.println("品种: " + oneCat.species);

5c137dd8000129e603420133.jpg

类实例化对象,对象使用属性和方法。方法带参数,重载run方法。

    public void run(String name){
        System.out.println(name+"在跑");
    }// CatTest中调用    oneCat.run(oneCat.name);

5c137dd80001356303470075.jpg

单一职责原则

问题来了,我们为什么要把Cat类和包含main方法的CatTest类进行分离呢?

单一职责原则(单一功能原则) 一个类应该有且只有一个引起功能变化的原因。

一个类应该只干一件事不能太累。

如果在一个类当中,承担的功能越多.交融,耦合性就越高,被复用的可能性就越低。特别是因为耦合度高,可能因为一个职责的变化,引起其他职责的变化,进而影响整个程序的运行。

20180801101137_8nHG1s_Screenshot.jpeg

在程序设计中我们建议将不同的职责放到不同的类当中来实现,把不同的引发变化的原因封装进不同的类。

面向对象的设计原则不止这一个,还有:里氏替换原则;依赖倒置原则;开闭原则;迪米特法则;组合/聚合复用原则;接口隔离原则。其他这些我们都会学习到。

new关键字

实例化对象的过程可以分为两部分: 声明对象 Cat one;实例化对象 new Cat();

20180801101629_UpBVn7_Screenshot.jpeg

声明对象时,是在栈中开辟了一块内存空间,此时还不是一个有效的对象,因为此时one的空间里是空的。如果此时用它进行属性的方法和调用是不被允许的。

        Cat twoCat;
        twoCat.run();

20180801101858_9fmgyz_Screenshot.jpeg

实例化对象是在堆空间开辟一块空间,完成了具体对象相关信息的初始化操作。

20180801102105_NU1VU2_Screenshot.jpeg

也就是声明对象和实例化对象是在内存中的不同空间完成的,通过赋值操作,将两者关联。具体的关联就是将堆中具体对象的内存地址存放是在one中。

20180801102321_pAQVCv_Screenshot.jpeg

package cn.mtianyan.animal;public class CatTest {    public static void main(String[] args) {
        Cat oneCat = new Cat();

        oneCat.name = "花花";
        oneCat.age = 2;
        oneCat.weight = 1000;
        oneCat.species = "中华田园猫";

        System.out.println("年龄: "+ oneCat.age);
        System.out.println("昵称: "+ oneCat.name);
        System.out.println("体重: " + oneCat.weight);
        System.out.println("品种: " + oneCat.species);

        System.out.println("-----------------------");

        Cat twoCat=new Cat();
        twoCat.name = "花花";
        twoCat.age = 2;
        twoCat.weight = 1000;
        twoCat.species = "中华田园猫";
        System.out.println("年龄: "+ twoCat.age);
        System.out.println("昵称: "+ twoCat.name);
        System.out.println("体重: " + twoCat.weight);
        System.out.println("品种: " + twoCat.species);
    }
}

20180801102612_ygEWcU_Screenshot.jpeg

两只猫的相关信息一模一样,但是实际它们指向的是堆中两块不同的内存。修改two的信息是不会对one产生影响的。

20180801102846_1dgxQq_Screenshot.jpeg

twoCat.name = "欢欢";
twoCat.species = "英国短毛猫";

20180801103002_cVJ6tt_Screenshot.jpeg

20180801103036_rjZHUW_Screenshot.jpeg



作者:天涯明月笙
链接:https://www.jianshu.com/p/8da2f339654d


点击查看更多内容
2人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消