6.面向对象程序设计-封装

大家好,我是被白菜拱的猪。

何为面向对象?
面向对象是对于面向过程而言。这个东西说不清道不明,给你唠三天三夜也唠不完,这就好比咱们政治天天把马克思主义挂在嘴边,那么马克思主义到底是什么,我不知道,你很大可能也不知道。
在这里插入图片描述

面向对象: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也是一个对象。如何判断自己的代码是不是面向对象编程(至少是尊重面向对象思想的,万物很复杂,我们不敢保证每个都是百分百的面向对象),很简单就看自己是不是在说“人话”,你看看哪有猫吃鱼的名字的,这不就很滑稽吗。
下面附上程序代码,可以自己打一打练练手。
不说了,包工头刚给我发短信,我得赶紧去搬砖,这年头砖都不好搬了(灬ꈍ ꈍ灬)。
在这里插入图片描述

看这里代码地址

发布了24 篇原创文章 · 获赞 4 · 访问量 2038

猜你喜欢

转载自blog.csdn.net/weixin_44226263/article/details/96368310