前言:使用面向对象的好处是与面向过程区别开,面向过程是在产生工具的过程,面向对象在产生对象的过程。因为想用抽象的方式把代码写得更加高效,区别于用什么功能写什么函数的方法,面向对象则是想把这个过程充分抽象,因为有许多相同的代码,代码被“拟人化”,对象之间有基本的共同点,就把共同点抽象成一段代码,就产生了类来方便操作。
0x00、从需求的角度阐述这些关键词:
面向对象语言产生的过程中产生了许多必须要有的概念,这个概念也可以视为工具,他们这些中间有类,字段,方法,构造方法,This关键词,从写代码发生了什么问题来看,看看这些“词语“为什么出现,有什么功能?
0x01、实例的简化(为什么要引入类)
Java是一门面向对象的语言,那么它的基本要素是什么?是类。类是组成Java程序的基本要素。对象的的基本原型是什么?类是一类对象的原型。所以写程序的过程就是定义一个一个类的过程,类写好,程序就基本写好了。
类里面包含的是什么?因为类用来封装一类对象的状态和方法,所以他将变量和函数封装到一个类中。
1.为什么要产生方法?
人是一类,植物是一类,为了使用面向对象思想何语言,这样就可以把人作为一个类,当然一类人也可以作为一个类,可能因为这类人都包含一特征,所以可以作为一个类,当作为一个类时,代表包含着一种特征的一类人。
class Person
{
String name;
int age;
void sayHi(){
System.out.println("HI,My name is "+ name );
}
}
其中void sayHi(){ System.out.println("HI,My name is "+ name ); }是这个类要做的动作,根据不同的参数,来的不同人,要做不同的动作,所以引入了方法Method。方法是类的功能和操作,就像一个函数,来什么自变量,有什么对应的输出,输出过程就是相当于功能的实施过程。
2.为什么要产生字段?
其中String name; int age;是代表这个类的基本特征,属性,所以这里引入了字段,所以叫字段Flied,字段是类的属性,使用变量来表示的。
3.为什么要产生域?
其实域是字段的别称,又代表了一个字段所在的区域,强调其中域的概念,同样的字段还强调变量,所以字段的别称总共有域,域变量,成员变量,属性,说不同的名称,代表在强调不同的方向和意思,但始终指同一个东西是不变的呢。
0x02、需要一种特殊的方法
需要一种能够在创建对应的类时,会在类的内部自动执行的方法,这个方法负责自动初始化对象,所以引入了叫构造方法的东西。如何特殊呢?因为类里面的方法一般取名也是方法的作用之类的,而类取名则一般是代表所抽象的对象,所以让构造方法名字与类的名字相同,这样就可以得出一个特殊的方法——构造方法,构造方法也决定了他是自动的,而且可以为空,也代表是动态的,动态的生成实实在在的一个例子——实例,一个可以为空的实例。
以下代码:
name和age就是类中的字段,是用来做初始化这些字段的事情。
Person(String n,int a){
name=n;
age=a;
}
因为是直接赋值中的属性,所以不需要写返回数据类型。
1.一个类一个构造方法
- 因为一个类如果没有定义任何构造方法,那么系统会产生自动的一个构造方法,所以引入名词:默认构造方法。(default constructor)。
- 默认的构造方法不会做任何事情,不会进行任何赋值,所以方法体为空,相当于进行了一个动态执行。
2.算符”点“引入对象的访问
可以访问对象的字段和方法,使用这种方法完好的使用了安全的封装性,保证使用引用可以安全的使用访问空间。
第一步:
Person p=new Person()
第二步:
p.name;
第三步:
p.sayHi();
- 封装性
- 安全性
0x03、如何根据不同类型输入使用不同方法?
我们为了解决这个问题,引入了签名这个名词,代表了根据输入类的参数,参数数量,参数类型,结合类来实现同样名字的方法,执行不同的功能,所以引入了方法重载Overload,使用重载会变得很强大啊。
- 方法重载指多个相同名字的方法,编译时根据参数签名识别编译。
- 签名不同代表两个方面,参数类型不同,参数个数不同,任何一种都可以。
- 根据重载,方法重载,引入名词实现多态。
Overload & Polymorphism 关于强大重载和多态
0x04、指定对象自身的方法
这里就要引入一个问题,如何某一个方法里面的变量与类变量的名字相同时,我们在使用方法里面的变量时该怎么解决重复的问题呢?这里引入了关键字this来指定this.variable 和 variable代表类变量名,后者指参数变量。
以下代码:
前者代表时外面的变量,后者是传入的参数变量,这样就很好区分啦,万一一不小心外面不知道内部都有哪些,就可以避免产生同名之间会冲突出错的可能性啦。
Person(int age,String name){
this.age=age;
this.name=name;
}
其中,this.name代表类属性,age代表参数变量,这里刚好也是构造方法,所以这种情况常常出现在构造方法里,也就是初始化方法,也就是第一个执行的方法。name表示实例变量,而name变量是函数作用域中的参数(在本例中是构造函数)。通过这个赋值,局部变量的值被赋给实例。
1.this的引伸用途:
我们思考this还可以用来做其他的用途吗?假如程序要做多种初始化,需要多种构造方法,这样因为构造方法名固定,那么配合重载,让参数签名不固定,就可以使用多种构造方法,可是写出来之后,构造方法里面包含构造方法的代码:可不可以考虑用另一种来区分呢?引入this,造成功能,构造方法调用另一种构造方法。
Person{
Person("s",2);
}
Person{
this(1." ");
}
- 必须要注意的点:嵌套的构造方法(在构造方法中使用构造方法),必须把this(parameter)放在构造方法的第一句,也就是第一行。
2.this的特殊用途
还有一个很好但是很少的用法,使用return this;配合关键词this来:返回当前对象。以下代码:
public class Leaf {
int i = 0;
Leaf increment(){
i++;
return this;
}
void print(){
System.out.println("i = "+i);
}
public static void main(String args[]){
Leaf x = new Leaf();
x.increment().increment().increment().print();//i = 3
}
}
其中return this;用来返回当前需要返回的对象。用起来十分方便明了,容易理解呢。
资料链接:
1.https://gymbers.com/progressive-overload-what-is-it-and-how-to-use-it/
2.https://link.springer.com/article/10.1007/s10515-008-0041-9
3.https://dspace.mit.edu/handle/1721.1/51686
4.https://www.codetd.com/en/article/14078428