前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >猿进化系列5——看了这个,你就会搞对象了

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

作者头像
山旮旯的胖子
发布2020-07-28 16:42:00
3600
发布2020-07-28 16:42:00
举报
文章被收录于专栏:猿人工厂猿人工厂

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 猿人工厂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档