大家好,我是被白菜拱的猪。
何为面向对象?
面向对象是对于面向过程而言。这个东西说不清道不明,给你唠三天三夜也唠不完,这就好比咱们政治天天把马克思主义挂在嘴边,那么马克思主义到底是什么,我不知道,你很大可能也不知道。
面向对象:OOP(Object-Oriented Programming) 代表性语言C++,Java
面向过程:C语言
面向对象的语言(更接近于真实世界)认为,所有的代码都以类型与对象与基础。什么是类型与对象呢?万事万物皆对象,你是一个对象,我也是一个对象,那此时类是什么呢?类则是人,人类,类里面有什么呢。我们可以说对象就是一个类的实例,我们身上就鼻子眼睛嘴巴耳朵,能闻能看能说能听。在好比买家电都会带有一个说明书,上面包含了它的属性以及相应的功能。这就是让我们很好理解了类里到底包含了什么,很简单就是这个类有什么和能做什么,就是其属性和功能。然后Java语言中为了显示其别具一格就给他取了个高大上的名字。属性为成员变量,属性则为方法。专业术语是我们学习的一大障碍,我认为就是显得其逼格高,看起来跟别人不一样,别无其他。
类型: (1)属性(有什么) —— 成员变量
(2)功能(能做什么) —— 方法
比如我定义一个Cat类(定义类时类名首字母大写),里面属性有名字,能做什么,会跑,猫会跑,猫也会吃鱼。所以有两个方法running(),eatFish()
class Cat {
String name;
//方法
/*
* void 表示方法的返回值是“不返回任何信息”
* running 是方法的“名称”
* (小括号) 小括号内可以写“参数列表”
* {大括号} 大括号里面是“方法体”
*
* */
void running() {
System.out.println(name + " 在跑。。。。");
}
void running(String target) {
System.out.println(name + " 跑到了 " + target );
}
void eatFish(Fish 具体的鱼) {
System.out.println(name + " 在吃 " + 具体的鱼.name + 具体的鱼.尾 );
}
}
前面是我对类(class)与对象(object)的理解,现在讲讲面向对象的三大特征
(1)封装
(2)继承
(3)多态
这篇文章主要讲封装,什么是封装。顾名思义,封装就是把东西封起来,这里封的是什么呢?
把描述一类事物 有什么 和 能做什么,放在一起的过程。
把描述一类事物 属性 和 功能,构建在一起的过程。
把描述一类事物的 成员变量 和 成员方法,构建在一起的【过程】,叫封装。
上面将猫的属性和功能放在一起的过程就是封装。
当我们把类创建好之后,怎么使用呢?我们通过创建对象的方式,这时候我们就想,怎么一创建对象给猫取一个名字呢,这时候我们就引出了构造方法的概念,构造方法构造方法,看这名字就知道这是构造时使用的方法。
(一)构造方法
方法与类名一致,而且没有返回值
Cat(String n) { name=n; }
(1)构造方法是不是必须写?不是,如果没写,会自动生成一个无参数无方法体的,例如:Cat()
(2)构造方法什么时候调用?构建对象的时候,即用new实例化的时候。
Cat cat=new Cat(“Tom”);创建了一个叫Tom的猫咪。
(3)构造方法可不可以有多个?可以。
(4)构造方法能不能互相调用?可以,通过this关键字调用其他构造方法,this(其他构造方法对应的参数)
(二)this关键字
有时候我们在定义构造方法时发现,假如方法中的参数名与成员变量重名了怎么办,就比如
Cat(String name) {
name = name;
}
这就分不清谁是谁了,电脑它就稀里糊涂的,构造方法还没送出门,this又要进来了~
(1)前面已经讲过得一个功能,在一个构造方法里面可以用this关键字调用另一个构造方法
(2)可以特指成员变量,而不是局部变量
Cat(String name) {
this.name = name;
}
这样就很好的解决了电脑稀里糊涂的问题了。
(三)方法重载
猫会吃鱼,难道猫除了吃鱼不会吃其他的东西了吗?反正我爷爷家的猫没有与吃,天天吃馒头,那磕碜的,没办法,生活条件还没有奔小康,吃了上顿没下顿。那这就出现了一个问题,定义了一个eating()方法,怎么才能区别猫是在吃鱼还是在吃馒头呢。这时候我们是不是要告诉猫你要吃什么,能吃什么。我们又引出来了方法重载的概念。
什么是方法重载
void eating(Fish 具体的鱼) {
System.out.println(name + " 在吃 " + 具体的鱼.name + 具体的鱼.尾 );
}
void eating(馒头 具体的馒头) {
System.out.println(name + " 在吃 " + 馒头.皮);
}
这就是方法重载。
(三)方法重载
在同一个类中,有多个方法名相同,参数(个数或者类型)不同,叫重载
注意:返回值类型不参与比较,光有返回值不同不叫冲载
为什么要有重载:
因为人类世界有这种现象,所以在面向对象的语言中就必须能有对应的方式
(四)static关键字
四十多号人在同一个战队,此时每个人的战队名字是一样的,原先叫“我们都是垃圾”现在随着越玩越牛逼,这时候不能在叫菜鸟,个个都是大神,哪还能叫菜鸟呢?有人抗议了必须改名字,叫“我们都是大神”,假如战队名字都是都是定义的成员变量,那改起来是不是要每个人都要改,这样不用想肯定麻烦,这时候static就可以解决我们的这个烦恼。
class 战队队员 {
static String code = "我们都是垃圾";
String name;
战队队员(String n) {
name = n;
}
static void study() {
System.out.println(code + "这里是静态方法");
}
}
public class StaticDemo {
public static void main(String[] args) {
战队队员 h1 = new 战队队员("Alex");
战队队员 h2 = new 战队队员("Jerry");
战队队员 h3 = new 战队队员("Rebort");
战队队员 h4 = new 战队队员("Lucy");
h2.code = "我们都是大神";
System.out.println(h1.code);
System.out.println(h2.code);
System.out.println(h3.code);
System.out.println(h4.code);
战队队员 h5 = new 战队队员("Tom");
System.out.println(h5.code);
战队队员.study();
}
}
将类中的变量用static修饰,就变成了成员变量,只要一个对象的此值改变,其他的人都跟着改变。
static:(群体的)
* (1)静态的变量:如果其中一个对象(个体)修改了值,则其他对象受到影响
* 类(群体)的所有对象,共享static修改是的变量的值
* 可以用类名直接调用
* (2)静态的方法:可以用类名直接调用
* 【规则】从static出发,智能找static
* 非static可以调用任何成员变量和方法
这四个点是我们学封装时一定要掌握的,不要死记硬背,要想着是因为什么,碰到了什么问题,我们引出这些进而解决问题的。学习要学会思考,脑中要有个知识体系。
最后补充一点,什么是面向对象编程,c是一个猫,f是一条鱼,c.eating(f),这就是面向对象编程,c.eating(f.name)这就不是面向对象编程,面向对象编程是对象与对象的关系,c是一个对象,f也是一个对象。如何判断自己的代码是不是面向对象编程(至少是尊重面向对象思想的,万物很复杂,我们不敢保证每个都是百分百的面向对象),很简单就看自己是不是在说“人话”,你看看哪有猫吃鱼的名字的,这不就很滑稽吗。
下面附上程序代码,可以自己打一打练练手。
不说了,包工头刚给我发短信,我得赶紧去搬砖,这年头砖都不好搬了(灬ꈍ ꈍ灬)。
看这里代码地址