前言
后面曾经讲了 Java 的一些环境搭建、IDE 应用、变量及数据类型、操作符、管制流程以及数组操作,明天就来看看 Java 里边的一个核心思想 – 面向对象编程。内容预报如下:
- 面向对象简介
- 面向对象实例
面向对象
什么是面向对象?
所谓面向对象,是一种通过对象的形式,将事实中的事物映射到计算机模型的一种编程办法;
对象的含意指的是具体的某一个事物,即咱们在现实生活中可能看得见摸得着的。在面向对象程序设计中,对象指的是计算机系统中的某一个成分,次要有两层含意。一个是指 数据 ,另一个则是 动作。即对象是两者的结合体,通过对象不仅可能进行操作,还能对操作的后果进行记录。
在这之前,另一种编程形式是 面向过程,用一个具体的例子来讲,能够形容成上面这样:
将如有一天你很想吃酸菜鱼,那么你该怎么办呢?上面就以面向对象和面向过程给你两个抉择,让你决定来选哪一个!
- 面向对象:关上手机,关上外卖软件,搜寻酸菜鱼,而后下单,等着外卖送到家就行!
- 面向过程:先去买菜,鱼、酸菜、调料……,而后回家杀鱼、切酸菜、切调料……,再接着开始炒,最初做好盛到盘子里!
比照能够发现两者的优缺点:
-
面向过程
- 长处:性能好;以例子来说本人做比终点外卖,经济又实惠,还吃得释怀;
- 毛病:不易保护、不易复用、不易扩大;以例子来讲,要是咱们本人做,长期又想吃其余的菜,又得跑去买资料啥的,麻烦!但外卖就不一样了,间接关上手机再点就是!
-
面向对象
- 长处:易保护、易复用、易扩大,也就是面向过程的毛病;
- 毛病:性能较差;比起本人做,点外卖老本啥的可能就比拟高了;
面向对象的 3 大个性
- 封装
暗藏对象的属性和实现细节,对外只提供拜访的接口,进步复用性和安全性;
- 继承
定义父类之后,子类能够从根底类进行继承,进步了代码的复用率,重要的一点:类只能单继承;
- 多态
父类或者接口定义的援用变量能够指向子类或具体实现类的实例对象,进步了程序的扩展性;
面向对象的 5 大准则
- 繁多职责准则 SRP
类的性能要繁多,不能太简单;
- 凋谢关闭准则 OCP
一个模块对于扩大是凋谢的,对于批改则是关闭的,能够减少性能,然而批改性能却不行;
- 里氏替换准则 LSP
子类可能替换父类呈现在父类可能呈现的任何中央;
- 依赖倒置准则 DIP
高层次的模块不应该依赖于低层次的模块,而应该都依赖于形象。形象不应该依赖于具体实现,但具体实现应该依赖于形象;
- 接口拆散准则 ISP
设计时采纳多个与特定客户类相干的接口比采纳一个通用接口要好;
面向对象的具体实例
类与对象
以咱们日常生活为例,咱们当初很多人都养宠物,而宠物 都有一些独特状态 ,比方名字、毛色、年龄…… 这样一来咱们就能够设计一个叫做 类 的货色,用来 代表宠物 这一类事物;
public class Pet{
// 名字
public String name;
// 毛色
public String furColor;
// 年龄
public int age;
}
有了这个类之后,它就相当于咱们的一个模板,依据这个模板咱们就可能创立一个个具体的宠物,而这些宠物,就叫做 对象;
public class Pet{
// 名字
public String name;
// 毛色
public String furColor;
// 年龄
public int age;
public static void main(String[] args){
// 创立一个对象
Pet dog = new Pet();
dog.name = "博美";
dog.furColor = "white";
dog.age = 1;
Pet cat = new Pet();
cat.name = "英短";
cat.furColor = "orange";
cat.age = 2;
}
}
属性
每个宠物都有本人的名字、毛色和年龄等一系列状态,而这些状态就叫做一个类的 属性。而属性的类型既能够是根本类型(比方上述例子中的 int
),也能够是援用类型(上述例子中的 String
)。而在 Java 语言中,属性的命名尽管没有强制规定,然而个别都是有一套大家通用的命名办法,即:
若属性是一个单词组成,那么个别都是小写;
若属性是多个单词组成,那么则采纳驼峰法;
对于更多的命名规定,举荐参考阿里巴巴出品的《Java 开发手册》,下载地址:https://github.com/cunyu1943/…
办法
而除开属性之后,每个对象还可能有许多其余的性能,就像宠物都能吃货色、会叫……,那么这些他们可能做的事件,在类里边就能够用 办法 来进行示意;
public class Pet{
// 名字
public String name;
// 毛色
public String furColor;
// 年龄
public int age;
// 吃货色对应的办法
public void eat(){System.out.println("吃货色!");
}
// 叫唤对应的办法
public void bark(){System.out.println("叫唤!");
}
}
而对于办法,也有须要留神的几点:
- 办法是能够有返回值的,如果要返回对应值,则其返回值的类型要与返回值绝对于,对于不须要返回值的办法,则将其返回类型设置为
void
; - 办法是能够有参数的,咱们上述例子的办法中都是不带参数的,但如果咱们有须要,就能够加上本人须要的参数,但此时留神要带上参数的类型;
总结起来,能够分为如下四种办法:
- 无参无返回值
public void methodName(){……}
- 无参有返回值
public boolean methodName(){
……
return false;
}
- 有参无返回值
public void methodName(String name){……}
- 有参有返回值
public boolean methodName(String name){
……
return false;
}
public class Pet{
// 名字
public String name;
// 毛色
public String furColor;
// 年龄
public int age;
// 具备返回值的办法
int getAge(){return age;}
// 带有参数的办法
void setAge(int age){this.age = age;}
// 吃货色对应的办法
void eat(){System.out.println("吃货色!");
}
// 叫唤对应的办法
void bark(){System.out.println("叫唤!");
}
}
而对于办法命名的形式,也是有肯定考究的。因为一般而言办法都是一个类的动作行为,所以 个别都是以动词结尾,而如果有多个单词组合,则除开第一个单词全副小写之外,前面每个单词的第一个字母都要应用大写。
构造方法
下面咱们说了实例(也就是对象)和属性,那么当咱们创立一个实例的时候,通常咱们想要把它的属性也给它设置好。为了实现这一性能,这时候咱们能够增加办法,从而达到这一目标,以上述设置宠物的年龄为例。
// 首先创立一个实例
Pet pet = new Pet();
// 接着调用办法设置年龄
pet.setAge(3);
// 查看设置年龄是否胜利
System.out.println(pet.getAge());
能够发现通过上述调用办法的形式是能够实现这一目标的,但假如咱们须要设置的属性很多,此时要全副设置属性值时就须要调用许多次 setter
办法,一旦脱漏一个,则实例外部状态就错乱了。那咱们就想了,有没有一种简略点的办法,可能让咱们在创立实例对象的同时就把外部属性初始化了呢?
答案是:Yes!🎉🎉🎉
这时候咱们就能够用到一类非凡的办法 – 构造方法,以下就来看看这个构造方法的非凡之处。
其实在下面咱们创立实例的时候就曾经调用了构造方法了,只不过它是没有带任何参数的构造方法。以上述动物类 Pet
为实例,咱们来看看如何编写它的构造方法。
public class Pet{
// 名字
public String name;
// 毛色
public String furColor;
// 年龄
public int age;
// 无参构造方法
public Pet(){}
// 带参构造方法
public Pet(String name, String furColor, int age){
this.name = name;
this.furColor = furColor;
this.age = age;
}
}
以上咱们只是给出了无参的构造方法和带了所有属性的构造方法,除了下面的两个构造方法之外,咱们还能够依据须要创立带有局部属性的构造方法。能够看到,相比于一般的办法,构造方法有着显著的特点:
- 没有返回值 :是的,无论是带参还是不带参的构造函数,它们都是没有返回值的,而它也是 每个类默认的构造方法;
- 办法名同类名一样:必须确保构造方法的名字和类名统一,否则它就不是构造方法了;
有了构造方法之后,咱们创立实例时就能够间接给它初始化了,而不必再去麻烦地调用各个 setter
办法来初始化实例。
// 调用无参构造方法
Pet pet1 = new Pet();
// 调用有参构造方法
Pet pet2 = new Pet("柯基", "黄色", 1);
🎈 Tips:对于实例的属性值,在未经构造方法初始化时,各数据类型都有默认值,整型默认值为 0
,浮点型默认值为 0.0
,布尔类型默认值为 false
,援用类型默认值为 null
。
援用
既然晓得了什么是面向对象以及面向对象中的一些要害知识点如对象、属性、办法的概念,那咱们就趁热来看看啥是援用。
所谓援用,其实在之前学习的时候就曾经波及到了。你是否还记得 String
这个非凡的数据类型,其实在咱们创立一个 String
对象时,也就创立了一个援用。
String str = new String("村雨遥");
其中 str
既是一个变量,也是一个援用,指向一个值为 "村雨遥"
的 String
对象,后续如果咱们要拜访这个 String
对象,就须要应用 str
这个援用来代表它。
以上咱们说的是一个援用指向一个对象,然而咱们也能够用多个援用指向同一个对象。就好比你家买了一俩车,不仅你能够开,你老婆也能够开,你爸妈也能够开。而这时候的车就好比一个“对象”,而应用它的人就是多个“援用”。
// 对象 1
String str1 = new String("村雨遥");
// 对象 2
String str2 = str1;
// 对象 3
String str3 = str1;
总结
XDM,明天的内容就到此结束了。次要讲了面向对象的相干概念以及个性,并对面向对象中的类、对象、属性、办法、构造方法以及援用做了介绍,对于更多面向对象的常识,咱们下一篇文章中再见!