在Java编程中,最基础、最核心的便是面向对象编程(OOP),面向对象编程是一种思想,它不单单存在于JAVA语言中,其实很多语言都可以面向对象编程。
严格来说,对象是一个概念,面向对象编程就是一种抽象与具象化(实例化)的思想。我们所熟知的面向过程的语言其实也可以做面向对象的编程(只了解概念的同学别杠)。
面向对象是很重要的思想,可以多看一些相关的博客,这个思想急不得,慢慢来,但是一定要透彻。
面向对象的思想可以理解为:以对象为单位,对象是一个宏观概念的实例化。首先说明一下抽象和具体的概念:
上述描述可能不是很好理解。可以看下面通俗讲解:
我们所谓的面向对象编程的思想其实就是以对象为单位对程序进行设计,当然对象内部还是需要我们来操作,即对象内部还是以面向过程的方式来操作。
所以,面向对象的思维也可以理解为面向过程的抽象,我们把一些固定的或者一类问题的处理过程抽象出来,封装成一个对象。上面说的每一句话基本都离不开一个概念——抽象。
在此提醒各位,面向对象编程有三大特性:封装、继承、多态(有些书籍也会加上抽象),而我个人认为,抽象是面向最重要的核心,封装、继承以及多态都是基于抽象这个概念衍生出来的产品。(个人想法,不同意的可以探讨,别喷别骂,理性交流)。
面向对象的本质:以类的方式组织代码,以对象的组织(封装)数据。
三大特性:
从认识论角度来讲:先有对象后有类。因为一种存在的抽象描述必须建立在该存在实际存在的时候(比较拗口),类作为抽象的描述应该建立在实际存在的对象之后(别和我说科学界的猜想和假设,那种是假设他们想要研究的物体客观存在,实际上存不存在他们也不知道);
从代码运行角度考虑是先有类后有对象,因为在运行过程中,有类的存在才能实例化对象。
之前说过堆、栈以及方法区的概念,现在我们来实际操作一下类和对象:
// 创建一个Student类
public class Student{
public static void main(String[] args){
// 实例化Student类的对象
Student student = new Student();
}
}
我们在之前书写Java代码的时候,都会先在项目中创建一个Java类,然后在类中书写代码。刚才我们说过类是一系列客观存在的宏观描述,所以我们可以对这个类进行一个具体实例化的操作,这个实例化就是所谓的对象;
我们创建对象的操作就如上面的代码所表示的,对象是new出来的。new这个关键字可以理解为在堆内存中开辟一个空间,这个空间是存放当前类实例化对象的;同时我们前面定义的Student类型的变量就是该对象的引用——这个问题依旧请大家移步到我的另一篇博客中学习;
《第一章 Java类和对象(一)》
对象的引用是存放在栈内存中,而实际的对象是赋值标识符后面的那个表达式,它是存放在堆内存中;
上面说完了实例化对象的操作,下面来说一下方法在类中的不同表现形式:
public class Student{
// 被static修饰的是静态类,属于类独有的,不属于对象
public static void study(){
// 静态方法是和类一起加载的,只要程序启动就会加载这个方法
}
// 没有static修饰的方法是普通方法
public void play(){
// 普通方法是属于对象的,程序运行的时候,如果没有实例化对象,该方法就不会被加载;该类被实例化后该方法才会存在。
}
}
public class Student{
public static void study(){
}
public String play(){
return "我在玩";
}
public static void main(){
Student student = new Student();
// 类名调用
System.out.println(Student.play());
// 对象向调用
String result = student.play();
System.out.println(result);
}
}
之前说过类是客观存在的宏观描述,所以类中一定有对于描述的一些特征定义,这个就是类中的成员变量。如下:
public class Student(){
String name;
String id;
}
我们在实例化对象的时候,除了分配对象的空间外还会给已经创建好的对象进行默认的初始化操作以及对构造器的调用,首先来看一下构造器的写法:
public class Student{
String name;
public Student(){
}
public Student(String name){
this.name = name;
}
}
构造器也是一个方法,他的修饰符一般来说都是public(修饰符的种类以及代表的含义后续讲解);
构造器的方法名必须与类同名;
构造器没有返回值类型,也不能写void;
构造器分为有参构造器和无参构造器;
无参构造器是给对象进行默认初始化(即对象的成员变量按照数据类型进行默认赋值);
有参构造器是可以对对象的成员变量进行传参赋值;
类中可以不写构造器的时候,系统默认会隐式的提供一个无参构造器;我们也可以选择自己写无参构造器,这样会覆盖系统提供的那个;
【注】:每个类必须有无参构造器,如果我们手写了有参构造器就会把系统的无参构造器覆盖掉;所以手写有参构造器后就必须手写无参构造器;个人建议每个类都自己手写构造器;
有参构造器可以有多个,也可以不对所有成员变量进行赋值。
Java中的构造器其实就是C++中的构造函数,作用相同。
当我们实例化对象时,使用new关键字时会调用构造器来对申请完空间的对象进行初始化赋值的操作。具体调用那个构造器取决于实例化对象的时候是否传递参数已经传递参数符合那个有参构造器。
public class Student{
String name;
String id;
public Student(){
}
public Student(String name){
this.name = name;
}
public Student(String name,String id){
this,name = name;
this.id = id;
}
public static void main(String[] args){
// 调用无参构造器
Student stu1 = new Student();
// 调用一个参数的有参构造器
Student stu2 = new Student("Reman");
// 调用两个参数的有参构造器
Student stu3 = new Student("Reman","1001");
}
}
上述代码中有一个大家陌生的存在——this,这是一个JAVA语言中的关键字,具体含义如下:
本篇笔记记录的东西很复杂,涉及到比较深层次的东西,我在学习或者指导小白学习的过程中,他们普遍反应没有基础的人听得很懵,我的笔记可能适合有基础的。
对此我只想说,没有什么是简单的,一学就会的玩意为什么还有那么多人想靠这个吃饭?自己坚持吧,我只能说我记录的东西比当初老师教的要详细一些、通俗一些。如果学不懂还在抱怨我记录的太难,请出门左转,另谋高就,我没时间和你们打嘴仗。我的资源全都是免费的,分文不取,白嫖还觉得吃亏的话,求您别看,谢谢!
其余同学,如果觉得有帮助的话我很开心,大家一起努力,加油!