专栏首页猿人工厂猿进化系列5——看了这个,你就会搞对象了

猿进化系列5——看了这个,你就会搞对象了

今天我们来聊聊面向对象的一些事情。

什么是面向对象?简单的来讲,面向对象是一种程序设计的思想,一种分析和解决问题的方式。如果说世间每一个事物,都是一个独一无二的个体,那么这个个体就是一个对象——你的女神,你的女朋友,她们是不是世界上独一无二的?是的。所以学会了面向对象的思想,保证你每分每秒都是快乐的,因为你每分每秒都想着她,当然,你的老婆也是世界上独一无二的,你每分每秒必须都面向着她,你的内心必须是每分每秒心情愉悦快乐无边!

好了,不开玩笑了,搞明白了吧?对象是一个独一无二的个体,是用来描述和表达一个事物的方式。比如说一个人,有性别,有名字,有身高,有体重等等特征,这些特征被叫做属性。一个人要吃饭,睡觉,上班,这些都是人的动作被称作行为。面向对象要做的,就是把事物的属性和行为描述出来,然后针对这些行为,逐步去实现功能。一旦上车,从此

在生活中,座椅板凳、天空马路,一阵风,一朵云……世间万物,都是独一无二的,这些个独一无二都是对象。那什么是类呢?比如我们说人类,身高,体重,姓谁名谁,吃饭睡觉,聊天打屁,都是一些共同属性和行为吧?那么描述这些属性和行为的集合就叫类。可以把类看作一类事物的模板,这个模板描述了这类事物的属性和行为。

那什么是对象呢?对象就是一个独一无二的个体,是一个具体的实例,比如一个具体的人——

简单来讲,类是对事物的描述,是抽象的,对象是一类事物的实例,是具体的。类是对象的描述,对象是类的实例。

接下来我们一起看看,如何在代码中来描述一个人——

那这个人类又怎么使用呢?

细心的你或许已经发现了,我们在描述和使用一个类的时候,会定义很多变量,

现在我们来看看他们的区别——

类的属性就是成员变量,方法中的变量,和语句体中的变量就是局部变量!他们的作用域是不同的,成员变量的作用域是整个类的范围,方法和语句体的变量作用域是在各自的语句体内,同一作用域,变量名是不允许重复的噢!

什么是封装?封装其实就是控制类和对象的属性和方法的访问权限。为什么要控制属性和方法的访问权限呢?因为世界上一些东西是不能谁便问的,比如——

有些时候,我们的对象的一些属性和方法并不希望被外部访问到。因为对象的属性如果都是用对象名.属性名去修改,那么程序可以随意访问修改,代码的维护性也不好,绝大多数我们都是通过定义访问器方法去修改某个对象的属性的。

接下来我们看一个封装的例子。

我们来看一个新东西——构造方法,构造方法是一种特殊的方法,对象的创建就是通过构造方法来完成,它的功能主要是完成对象的初始化。构造方法有以下特征:

1.构造方法和类名相同

2. 构造方法没有返回值,连void都没有。

3. 如果一个类不写构造方法,系统会自动创建一个无参的构造方法(编译器编译时生成)。

4. 如果一个类写了构造方法,系统就不会自动创建构造方法了,如果要创建对象,就需要提供满足构造方法的参数。

5.使用构造方法可以省略set方法的调用,但是如果需要传递的参数比较多,需要相当注意了,不是很推荐使用。

什么是JavaBean?JavaBean 是 编写java类的一种编码规范,类必须是具体的和公共的,并且具有无参数的构造方法,并且提供set和get方法来访问类的成员变量,get set方法最好还要满足小驼峰的命名方式。

接下来干什么?赶紧封装一个你的女朋友!

想知道是怎么做到和乔丹一样强大的吗?Java提供了这种机制——继承。子类可以继承父类的属性和方法,子类可以直接访问父类的非私有属性和行为。被继承的类被称作父类、超类(super class)、基类。继承者类被称作子类。继承使得子类具有父类的能力,是多态的前提,也减少了重复代码的编写,提高了软件的可维护性。

仔细分析生活中的事物,慢慢的就会发现有很多事物是有相同的属性和行为的,比如一个班级,有老师,有学生,但是老师和同学都是人,大家都有姓名 性别 年龄 身高 体重 都会吃饭 睡觉 说话,当然也有很多不同,老师会上课,学生会学习……如果我们定义一个学生类 一个老师类 都把公共的部分定义一次,那么会有很多的重复性劳动。我们希望把公共部分抽取出来,大家都去使用,就简单多了。

一个子类继承了父类,子类就会继承父类所有非私有属性(成员变量)和方法。那么我们会遇到一个问题,如果子类的成员变量或者方法和父类的重名了怎么办?

我们给MichaelJordan类增加一个属性age,给MySelf也增加一个重名的age属性,并且增加访问器方法:

public int getAge() { return age; } public void setAge(int age) { this.age = age; }

public static void main(String args[]){ MySelf s = new MySelf(); s.setAge(18); System.out.println(s.getAge()); }

此时,这个age属性的值是子类的还是父类的?setAge方法 和getAge方法是子类还是父类的?

答案是子类的。当子类的属性和方法和父类同名时,都是优先使用子类的属性和方法。在这种情况下,那父类的非私有属性和方法是不是不能访问了?当然是可以访问的!修改代码:

在子类中访问父类的属性和方法,需要使用关键字super,关键字super代表父类的引用地址!

还有有一种特殊情况:子类的方法名和返回值以及参数都和父类的一致时,子类会覆盖父类的方法,这种行为叫做方法重写(Override),出现这种情况往往子类需要定义和父类不一样的行为。

划重点了:

1. Java只支持单继承,不支持多继承。一个类不能同时继承两个以上的类。

2. Java支持多层继承,比如A继承B,B继承C。

3. 子类和父类是一个相对的概念,子类是谁的子类,父类是谁的父类。

其实乔老爷子一把年纪了,想要战胜球场4打怪还是有点困难的,四个怪物死守篮下,似乎还真没有啥办法。三分球?嗯。。。是个好主意...可是生涯命中率不到29%,搞笑一样,但是现在也飞不起来了,怎么办呢?

其实在现实生活中有很多抽象的概念。比如要打败球场4大怪,需要三分球,乔老爷子有自知之明,并不知道谁的三分球才可以打败他们。但是作为想要出门打篮球的你就必须想到用谁的三分球去打败4大怪。为了解决这种问题,java引入了抽象类和抽象方法。所谓抽象类,就是包含抽象方法的类,所谓抽象方法,就是只有声明,而没有方法体的方法叫抽象方法。

threePointShot方法前使用了abstract关键字,也没有方法体。一个方法使用abstract关键字修饰,就成了抽象方法,抽象方法只包含一个方法名以及参数定义,没有方法体。

如果一个类包含抽象方法,那么这个类就必须是抽象类,需要在class 关键字前 加入abstract关键字。

其实很多时候定义抽象类的目的,是为了将一些公共的方法进行抽象出来,让子类去实现需要独立实现的方法,然后通过父类去调用,从而达到抽象的目的,简化代码提高代码维护性。

用继承搞不定了吧?你不能继承多个类吧哈哈!想要同时具备多种能力怎么办?用接口试试!

静态常量:非必须,有需要就写。

抽象方法:使用abstract 关键字修饰,在接口中可以省略。

静态方法:JDK8以后才有是为了让接口更像一个类,实际上很少用,也体现不出啥先进性。建议弃用。

私有方法:JDK8以后才有,用于支持静态方法。越搞越回去了,建议放弃。

Java中提供了一种方式类似于插头的东西,可以将类与类连接到一起。接(Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合。接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。接口和类不同,接口不能被实例化,但是可以被实现。接口定义的方法都是抽象方法,接口也没有成员变量,只能有静态常量。一个类可以实现多个接口,但是不能继承多个类!需要注意的是:

如果一个类实现某个接口,这个类需要实现接口的所有方法。

一个类可以实现多个接口,但是只能继承一个父类。

为什么再调用具体方法时,你使用了接口?为什么你在定义接口的时候定义了接口作为参数?好吧好吧,这是多态的一种体现形式。哪天你的showTime发生变化,直接改你自己就好了。这样搞可以让代码更灵活,更容易扩展!

多态是指同一种行为具有不同的表现形式。我们想一想java中有哪些特性是符合:同一种行为但是表现形式不同的?

1.继承或者是实现,作为一个子类继承了父类或者实现了某个接口,那么子类就具有父类的行为,如果子类重写父类的方法,那么子类和父类的表现形式就不同了。

2.方法重载,一个类具有多个同名不同参的方法。

3.父类或者是接口引用了子类或者是实现类的对象。这也是最常见的方式,可以让代码有更清晰的层次结构,更容易维护。

本文分享自微信公众号 - 猿人工厂(gh_deca5a88e287),作者:山旮旯的胖子

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 猿设计15——真电商之运费设计

    经过上一章的讨论相信你对运费模板有了一些了解。为了方便商家设置快速的设置商品运费,我们通过对快递公司的收费标准,和商品发布的综合考虑,抽象出了运费模板的概念。提...

    山旮旯的胖子
  • 猿设计14——真电商之运费模板

    经过上一章的讨论相信你已经有些了解价格和促销的关系了。价格对于一个电商网站确实需要独立设计,否则散落于系统的各个地方,将会强耦合你的系统,维护起来的成本不可估量...

    山旮旯的胖子
  • 猿设计5——真电商之颠覆你的类目认知

    看过上一章节相信你从感官上对电商的前台系统和后台系统有了一个感性的认知,也学些了UML用例图的基本画法。知道了一些挖掘隐藏需求和分析需求构建系统的办法。但是,如...

    山旮旯的胖子
  • 关于JAVA你必须知道的那些事(三):继承和访问修饰符

    今天乘着还有一些时间,把上次拖欠的面向对象编程三大特性中遗留的继承和多态给简单说明一下。这一部分还是非常重要的,需要仔细思考。

    编程思录
  • java_static、final、super、this关键字的使用

    它可以修饰的成员变量和成员方法,被修饰的成员是属于类的,而不是单单是属于某个对象。

    咕咕星
  • java基础学习_面向对象(下)01_day08总结

    ============================================================================= ==...

    黑泽君
  • 「JAVA」面向对象三大特征:封装、继承、多态,以高内聚、低耦合为目标

    面向对象的最终目的是要构建强健、安全、高效的项目,也就是要实现项目的高内聚和低耦合:

    老夫编程说
  • 第二阶段-Java面向对象:【第二章 继承】

    其实在我们面向对象这一阶段的学习中,我们就是围绕Java的三大特性(封装、继承、多态)来讲解的,在上一掌内容中我们讲解了一部分封装的有关知识,今天我们来重点学习...

    BWH_Steven
  • 【Java提高三】三大特性-多态

    【Java提高】三大特性-多态 面向对象编程有三大特性:封装、继承、多态。 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构...

    Java帮帮
  • Django 博客教程:前言和环境安装(连载一)

    專 欄 ❈追梦人物,电子科技大学计算机学院研究生,从事大数据分析研究方向。主要使用 Python 语言进行相关数据的分析,熟练使用 django 开发网站系统。...

    Python中文社区

扫码关注云+社区

领取腾讯云代金券