一、面向对象入门
各位同学,为什么说面向对象是Java最核心的课程呢?因为写Java程序是有套路的,而面向对象就是写Java程序的套路;你如果不知道面向对象编程,那么你Java语言就算白学了。
那这种编程套路是咋回事呢? 接下来,我们通过一个案例快速的认识一下。
现在假设我们需要处理的是学生的姓名、语文成绩、数学成绩这三个数据,要求打印输出这个学生的总成绩,和平均成绩。
遇到这样的需求,我们以前都会定义方法来做,如下图所示
注意:这里每一个方法有三个参数
定义好方法之后,我们调用方法的时候,需要给每一个方法传递三个实际参数
在上面案例中,这种编程方式是一种面向过程的编程方式。所谓面向过程,就是编写一个的方法,有数据要进行处理就交给方法来处理。
但是实际上姓名、语文成绩、数学成绩三个数据可以放在一起,组合成一个对象,然后让对象提供方法对自己的数据进行处理。这种方式称之为面向对象编程。
总结一些:所谓编写对象编程,就是把要处理的数据交给对象,让对象来处理。
二、深刻认识面向对象
好的各位同学,在上一节课我们已经用面向对象的编程套路,处理了学生数据。接下来我们就要搞清楚,面向对象的几个最核心问题了。
我们把这三个问题搞明白,那么你对面向对象的理解就很到位。
2.1 面向对象编程有什么好处?
先来看第一个问题,面向对象编程到底有什么好处呢? 那就不得不谈,Java的祖师爷对这个世界的理解了。
Java的祖师爷,詹姆斯高斯林认为,在这个世界中 **万物皆对象!**任何一个对象都可以包含一些数据,数据属于哪个对象,就由哪个对象来处理。
这样的话,只要我们找到了对象,其实就找到了对数据的处理方式。
所以面向对象编程的好处,用一句话总结就是:面向对象的开发更符合人类的思维习惯,让编程变得更加简单、更加直观。
2.2 程序中对象到底是个啥?
说完面向对象编程有什么好处之后,这里有同学可能会有问题了,你刚才举的例子中,“汽车”、“手机”、“蔡徐坤”是一个实实在在的东西,你说是一个对象好理解。那我们程序中的对象到底是个啥呢?
对象实质上是一种特殊的数据结构。这种结构怎么理解呢?
你可以把对象理解成一张表格,表当中记录的数据,就是对象拥有的数据。
这就是程序中的对象到底是个啥! 一句话总结,对象其实就是一张数据表,表当中记录什么数据,对象就处理什么数据。
2.3 对象是怎么出来的?
刚刚我们讲到对象就是一张数据表,那么这个数据表是怎么来的呢?这张表是不会无缘无故存在的,因为Java也不知道你这个对象要处理哪些数据,所以这张表需要我们设计出来。
用什么来设计这张表呢?就是类(class),类可以理解成对象的设计图,或者对象的模板。
我们需要按照对象的设计图创造一个对象。设计图中规定有哪些数据,对象中就只能有哪些数据。
一句话总结:对象可以理解成一张数据表,而数据表中可以有哪些数据,是有类来设计的。
三、对象在计算机中的执行原理
各位同学,前面我们已经带同学写了面向对象的代码,也知道对象到底是咋回事。如果我们再搞清楚对象在计算机中的执行原理,那我们对面向对象的理解就更加专业了。
按照我们之前讲的数组的执行原理,数组变量记录的其实数数组在堆内存中的地址。其实面向对象的代码执行原理和数组的执行原理是非常类似的。
其实Student s1 = new Student();
这句话中的原理如下
Student s1
表示的是在栈内存中,创建了一个Student类型的变量,变量名为s1- 而
new Student()
会在堆内存中创建一个对象,而对象中包含学生的属性名和属性值
同时系统会为这个Student对象分配一个地址值0x4f3f5b24 - 接着把对象的地址赋值给栈内存中的变量s1,通过s1记录的地址就可以找到这个对象
- 当执行
s1.name=“播妞”
时,其实就是通过s1找到对象的地址,再通过对象找到对象的name属性,再给对象的name属性赋值为播妞
;
搞明白Student s1 = new Student();
的原理之后,Student s2 = new Student();
原理完全一样,只是在堆内存中重新创建了一个对象,又有一个新的地址。s2.name
是访问另对象的属性。
四、类和对象的创建和使用
4.1 类的定义
定义类(声明类)实际就是定义类的静态属性和动态属性(方法)。用户定义一个类实际上就是定义一个新的抽象数据类型.使用类之前,必须先定义它,然后才可利用所定义的类来声明相应的变量,并创建对象.
定义类的基本语法结构:
[类修饰符] class 类名称 { //声明成员变量 [修饰符] 数据类型 变量名; //声明成员方法 [修饰符] 返回值类型 方法名(参数表){…} }
类修饰符的作用:
1、公共类修饰符 public : Java 语言中类的可访问控制符只有一个: public 即公共的。每个 Java 程序的主类都必须是 public 类作为公共工具。供其它类和程序使用的应定义为 public 类。 2 、抽象类修饰符 abstract :凡是用 abstract 修饰符修饰的类,被称为抽象类。所谓抽象类是指这种类没有具体对象的一种概念类。这样的类就是 Java 语言的 abstract 类。 3、最终类修饰符 final :当一个类不可能有子类时可用修饰符 final 把它说明为最终类。被定义为 final 的类通常是一些有固定作用、用来完成某种标准功能的类。 4、类缺省访问控制符:如果一个类没有访问控制符,说明它具有缺省的访问控制符特性。此时,这个类只能被同一个包中的类访问或引用。这一访问特性又称为包访问性。
成员修饰符的作用:
1、公共访问控制符 public :用 public 修饰的域称为公共域。如果公共域属于一个公共类,则可以被所有其它类所引用。由于 public 修饰符会降低运行的安全性和数据的封装性,所以一般应减少 public 域的使用。 2、私有访问控制符 private : 用 private 修饰的成员变量 ( 域 ) 只能被该类自身所访问,而不能被任何其它类 ( 包括子类 ) 所引用。 3、保护访问控制符 protected :用 protected 修饰的成员变量可以被三种类所引用:①该类自身;②与它在同一个包中的其它类;③在其它包中的该类的子类。使用修饰符 protected 的主要作用是允许其它包中它的子类来访问父类的特定属性。 4、私有保护访问控制符 private protected :用修饰符 private protected 修饰的成员变量可以被该类本身或该类的子类两种类访问和引用。 5、静态域修饰符 static :用 static修饰的成员变量仅属于类的变量,而不属于任何一个具体的对象,静态成员变量的值是保存在类的内存区域的公共存储单元,而不是保存在某一个对象的内存区间。任何一个类的对象访问它时取到的都是相同的数据;任何一个类的对象修改它时 , 也都是对同一个内存单元进行操作。 6、最终域修饰符 final :最终域修饰符 final 是用来定义符号常量的。一个类的域 ( 成员变量 ) 如果被修饰符 final 说明,则它的取值在程序的整个执行过程中都是不变的。 7、易失 ( 共享 ) 域修饰符 volatile :易失 ( 共享 ) 域修饰符 volatile是用来说明这个成员变量可能被几个线程所控制和修改。也就是说在程序运行过程中,这个成员变量有可能被其它的程序影响或改变它的取值。因此,在使用中要注意这种成员变量取值的变化。通常 volatile 用来修饰接受外部输入的域。 8、暂时性域修饰符 transient :暂时性域修饰符 transient 用来定义一个暂时性变量。其特点是:用修饰符transient 限定的暂时性变量,将指定 Java虚拟机认定该暂时性变量不属于永久状态,以实现不同对象的存档功能。否则,类中所有变量都是对象的永久状态的一部分,存储对象时必须同时保存这些变量。
类的成员变量描述了该类的内部信息,一个成员变量可以是简单变量,也可以是对象、数组等其他结构型数据。成员变量的格式如下:
[修饰符] 变量类型 **变量名** [=初值];
类的方法是用来定义对类的成员变量进行操作的,是实现类内部功能的机制,同时也是类与外界进行交互的重要窗口。声明方法的语法格式如下:
[修饰符] 返回值的数据类型 方法名(参数列表) { 语句序列; return [表达式]; }
类的定义示例:
class Cylinder //定义圆柱体类Cylinder { double radius; //声明成员变量radius int height; //声明成员变量height double pi=3.14; //声明数据成员pi并赋初值 void area( ) { //定义成员方法area(),用来计算底面积 System.out.println("圆柱底面积="+ pi*radius* radius); } void volume( ) { //定义成员方法volume (),用来计算体积 System.out.println("圆柱体体积="+((pi*radius* radius)*height); } }
最新Java基础系列课程--Day06-类和对象(二)https://developer.aliyun.com/article/1423498