在学习Java的过程中,我觉得面向对象是我遇到的第二个难题(第一个就是配置环境变量,哈哈)。我相信也有很多同胞也在这里被绊脚了吧,今天的话也就是其实也只是作为笔记写的这篇博客。
在学习面向对象时,经常会遇到“万物皆对象”这句话。其实这就已经解释了啥是对象。像普通的现实生活中,一个人,一条狗,一只猪,这种对象比较好理解。再抽象一点,一个多用的螺丝刀也是一个对象。而里面每个工具都是它的属性(Field)或者方法(Method)。
类别Java代码的话,人就是通过Person类new出来的一个对象。多用螺丝刀就是一个工具类,每种螺丝刀就是一只方法。下面举个例子,先写一个人的类:
/**
* 人类
*/
public class Person(){
String name;
int age;
String sex;
/**
* 构造方法
*/
public Person(){
}
}
这个时候我们可以通过构造方法,创建人的对象:
public class Test{
public static void main(String[] args){
//创建名为zack的Person类对象
Person zack = new Person();
//设置zack的属性
zack.name = "zack";
zack.age = 20;
zack.sex = "male";
}
}
接下来写个工具类,多用螺丝刀:
public class Tools{
/*十字螺丝刀*/
public void toolForTen(){
System.out.println("我是一把十字螺丝刀");
}
/*一字螺丝刀*/
public void toolForOne(){
System.out.println("我是一把一字螺丝刀");
}
/*手机螺丝刀*/
public void toolForPhone(){
System.out.println("我是一把手机螺丝刀");
}
}
然后我们来使用这个工具箱:
public static void main(String[] args){
//先创建(制造)一个多用螺丝刀
Tool tool = new Tool();
//用螺丝刀开手机
tool.toolForPhone();
//用螺丝刀开十字螺丝
tool.toolForTen();
}
关于面向对象的概念就先说这么多,然后说说面向对象的三大特性。
这里的话,也不讲多复杂。有两个计较贴切的词语“隐藏细节”、“数据安全”。直白的说,就是有所保留。我们前面写的Person类,对于女性来说年龄是比较敏感的。但是我们只要把这个女性创建出来,就可以自己访问或者设置她的年龄,这样就非常的不安全,没有隐私可言。这个时候就需要用到封装思想。
封装的实现
主要的话就是给属性和方法设置访问权限,一般的话就是把全部属性(变量)设置为private,然后创建get、set方法。按照实际情况或者程序员的期望给方法设置不同权限。下面举个例子:
/**
* 人类,利用封装思想改进代码
*
* 在这个类中sex为私有变量,且为提供相应的方法获取,故外部不能直接获取Person的性别
*/
public class Person{
private String name;
private int age;
private String sex;
/**
* 允许其他人知道我的名字,故设置为public(公共的)
*/
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
}
修改之后性别就成了隐私了(当然了,在反射面前还是不值一提)。不过这些修饰词只在编译期起作用,所以这些属性其实还是可以通过反射获取。
这边的再扩展一下其它权限修饰词,就一张图,我盗来的:
为了让大家深刻理解继承,这里多说几句(这里不是严格讲生物,希望不要有生物专业的学生揪我错哈?)。最开始的时候,人类对动物的了解少之又少,觉得生物大致就是动物和人。随着对生物的理解,发现了各种分类方法:界、门、纲、目、科、属、种。我们这里也不细纠,就拿老虎 狮子打比方。本来是两种不相干的动物,但是随着,发现这两种动物有许多共同点。在研究更多动物之后,发现有许多动物和狮子老虎也有着共同点,随之而来的就是我们所谓的猫科动物。而这里的猫科动物就是一个父类,老虎狮子都继承了这个类。而后又在犬科动物或者其它科动物里面发现各个科的动物又有些共同点,然后又抽出了哺乳动物。就这样慢慢的,对动物的理解越来越方便,也越来越深刻。而Java中继承也是这个概念。
接下来,用代码解释一下,先编写个猫科动物类:
/**
* 猫科动物的类
*/
public class Felidae{
protected String name;
protected int age;
//省略get、set方法
public void run(){
System.out.println(name + "在跑步");
}
public void eat(){
System.out.println(name + "在吃东西");
}
/**
* 无参构造
*/
public Felidae(){
}
/**
* 带参构造
*/
public Felidae(String name){
this.name = name;
}
}
然后定义一个老虎类继承猫科动物类:
/**
* 老虎类,继承猫科动物
*
* 在编写老虎类时,不需要考虑猫科动物的共性(年龄/名称)。
*
*/
public class Tiger extends Felidae{
//不是所有猫科动物都有花纹,其它什么特点我也想不到了就不纠结了
private String pattern;
//老虎会游泳
public void swim(){
System.out.println("老虎在游泳");
}
}