目录
一、面向对象的初步认知
1.什么是面向对象
2.面向对象和面向过程的区别
2.1 面向过程
2.2 面向对象
3.类和对象的区别
二、类和对象
1.类的定义格式
2.定义一个狗类编辑
2.1 通过工具改类名
3. 类的实例化
三、this的用法
1.解决命名冲突
2.调用类中的方法
3.用当前对象
4.返回当前对象
5.构造器中调用其他构造器
6.this引用的特性
四、对象的构造及初始化
1.如何初始化对象
2.构造方法
3.特性
4.默认初始化
5.就地初始化
五、static
1.static修饰成员变量
2.static修饰成员方法
3.static成员变量初始化
六、代码块
1.普通代码块
2.构造代码块
3.静态代码块
七、执行顺序
这篇文章大量用到了封装的内容,不懂的可以看我这篇博客:JAVA-封装-CSDN博客
一、面向对象的初步认知
1.什么是面向对象
Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。用面向对象的思想来涉及程序,更符合人 们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好。
2.面向对象和面向过程的区别
2.1 面向过程
代表语言:C语言、……
面向过程强调的是步骤,每一步做什么。是通过事件触发的。拿洗衣服举列子:
传统的步骤不易更改,而且少了一步都不成,也不易扩展
2.2 面向对象
代表语言:JAVA、C++、……
面向对象,更多的是对对象之间的交互。是通过对象触发的,不同对象触发的,处理方式也会不一样。想要了解这一现象可以看我的这篇博客:JAVA-多态 和 重写 (彻底给你讲明白)_重写和多态的区别-CSDN博客
3.类和对象的区别
- 类:用于描述对象的,里面具有属性和行为。
- 对象:被类实例化人/物品/动物……,是在内存中已经实际存在的
二、类和对象
1.类的定义格式
在java中定义类时需要用到class关键字,具体语法如下
class 后面接着的是类名 可以根据实际需求取
采用Java语言将狗类在计算机中定义完成,经过javac编译之后形成.class文件,在JVM的基础上计算机就可以识别了。
通过项目文件夹out文件夹点下去就可以找到class文件
2.定义一个狗类
注意事项:
- 类名注意采用大驼峰定义
- public哪里是来控制访问权限的,是封装的内容
- 一般一个文件当中只定义一个类
- main方法所在的类一般要使用public修饰(注意:Eclipse默认会在public修饰的类中找main方法)
- public修饰的类必须要和文件名相同,如果要在一个文件写多个类,那么其他类不用加public
2.1 通过工具改类名java基础方法类对象
不要轻易去修改public修饰的类的名称,如果要修改,通过开发工具修改
3. 类的实例化
定义了一个类,就相当于在计算机中定义了一种新的类型,与int,double类似,只不过int和double是java语言自 带的内置类型,而类是用户自定义了一个新的类型。
用类类型创建对象的过程,称为类的实例化,在java中采用new关键字,配合类名来实例化对象。
结果:
注意事项
- new 关键字用于创建一个对象的实例.
- 使用 . 来访问对象中的属性和方法.
- 同一个类可以创建多个实例.
代码解析:
内存分析:
三、this的用法
1.解决命名冲突
结果:
可以加上 this.成员变量名
2.调用类中的方法
3.用当前对象
其实pritDate已经用到了,在属性名前加上this.
4.返回当前对象
在方法中可以返回当前对象的引用,通常用于实现方法链
单个的this代表当对象,这间接说明了为什么上述两个案列,可以通过this.访问
5.构造器中调用其他构造器
这里有用到重载的内容,想要了解的可以看这篇博客:JAVA-方法的重载-CSDN博客
注意:
- 只能在构造方法中调用其他构造方法
- 在构造方法中调用其他构造方法,this必须在自身构造方法中的第一排
6.this引用的特性
1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
2. this只能在"成员方法"、"构造方法"中使用
3. 在"成员方法"中,this只能引用当前对象,不能再引用其他对象
4.this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法 对象的引用传递给该成员方法,this负责来接收
在代码层面来简单演示--->注意:下图右侧中的Date类也是可以通过编译的
这个图比较重要,在用静态方法时会有帮助。
每个成员方法,都会自己加上一个参数 “Data this” 用来接收是哪个对象调用的
四、对象的构造及初始化
1.如何初始化对象
通过前面知识点的学习知道,在Java方法内部定义一个局部变量时,必须要初始化,否则会编译失败。
要让上述代码通过编译,非常简单,只需在正式使用a之前,给a设置一个初始值即可。
如果是对象:
2.构造方法
构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且 在整个对象的生命周期内只调用一次。
注意:构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。
3.特性
1.名字必须与类名相同
2. 没有返回值类型,设置为void也不行
3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次(相当于人的出生,每个人只能出生一次)
4. 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)
上面写过重载的代码:
5. 如果用户没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。
注意:一旦用户定义如何形式的构造方法,编译器则不会再生成。
6. 构造方法中,可以通过this调用其他构造方法来简化代码
注意:
- this(...)必须是构造方法中第一条语句
- 不能形成环
7. 绝大多数情况下使用public来修饰,特殊场景下会被private修饰
4.默认初始化
为什么局部变量在使用时必须要初始化,而成员变量可以不用呢?
要搞清楚这个过程,就需要知道 new 关键字背后所发生的一些事情:
在程序层面只是简单的一条语句,在JVM层面需要做好多事情,下面简单介绍下:
1. 检测对象对应的类是否加载了,如果没有加载则加载
2. 为对象分配内存空间
3. 处理并发安全问题
比如:多个线程同时申请对象,JVM要保证给对象分配的空间不冲突
4. 初始化所分配的空间 即:对象空间被申请好之后,对象中包含的成员已经设置好了初始值,比如:
5. 设置对象头信息
6. 调用构造方法,给对象中各个成员赋值
5.就地初始化
在声明成员变量时,就直接给出了初始值。
注意:代码编译完成后,编译器会将所有给成员初始化的这些语句添加到各个构造函数中
五、static
1.static修饰成员变量
tatic修饰的成员变量,称为静态成员变量,静态成员变量最大的特性:不属于某个具体的对象,是所有对象所共享的。
例子:
使用前文中介绍的学生类实例化三个对象s1、s2、s3,每个对象都有自己特有的名字、性别,年龄,学分绩点等成 员信息,这些信息就是对不同学生来进行描述的
假设三个同学是同一个班的,那么他们上课肯定是在同一个教室,那既然在同一个教室,那能否给类中再加一个成 员变量,来保存同学上课时的教室呢?答案是不行的。
之前在Student类中定义的成员变量,每个对象中都会包含一份(称之为实例变量),因为需要使用这些信息来描述 具体的学生。而现在要表示学生上课的教室,这个教室的属性并不需要每个学生对象中都存储一份,而是需要让所 有的学生来共享。在Java中,被static修饰的成员,称之为静态成员,也可以称为类成员,其不属于某个具体的对象,是所有对象所共享的。
【静态成员变量特性】
1. 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
2. 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
3. 类变量存储在方法区当中
4. 生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)
2.static修饰成员方法
Java中,被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的。静态成员一般是通过静态方法来访问的。
结果:
【静态方法特性】
1. 不属于某个具体的对象,是类方法
2. 可以通过对象调用,也可以通过类名.静态方法名(...)方式调用,更推荐使用后者
3. 不能在静态方法中访问任何非静态成员变量
4. 静态方法中不能调用任何非静态方法,因为非静态方法有this参数,在静态方法中调用时候无法传递this引用
因为,在非静态的成员方法中,第一个参数会传Date this ,这个是用来分便你传递的是哪一个对象的。但是在静态方法中并不需要这个传参,因为是类的方法,并不区分是哪个对象。
5. 静态方法无法重写,不能用来实现多态
3.static成员变量初始化
注意:静态成员变量一般不会放在构造方法中来初始化,构造方法中初始化的是与对象相关的实例属性
静态成员变量的初始化分为两种:就地初始化 和 静态代码块初始化
1. 就地初始化
就地初始化指的是:在定义时直接给出初始值
2. 静态代码块初始化
一般静态代码块主要用于给,静态成员变量初始化
下面马上讲代码块,会讲到。
六、代码块
使用 { } 定义的一段代码称为代码块。根据代码块定义的位置以及关键字,又可分为以下四种:
- 普通代码块
- 构造块
- 静态块
- 同步代码块(后续我再来写)
1.普通代码块
普通代码块:定义在方法中的代码块.
这种用法较少见
2.构造代码块
构造块:定义在类中的代码块(不加修饰符)。也叫:实例代码块。构造代码块一般用于初始化实例成员变量。但是跟多的还是用构造方法初始化
3.静态代码块
使用static定义的代码块称为静态代码块。一般用于初始化静态成员变量。
注意事项
- 静态代码块不管生成多少个对象,其只会执行一次
- 静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的
- 如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行(合并)
- 实例代码块只有在创建对象时才会执行
有构造方法、构造代码块、静态代码块,他们执行的顺序是怎么样的呢?
七、执行顺序
测试顺序代码:
结果:
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/h6javajc/18757.html