1、面向对象的三大特征:
封装
继承
多态
有了封装,才有继承,有了继承,才能说多态。
2、面向对象的首要特征:封装
什么是封装?有什么用?
现实生活中有很多现实的例子都是封装的,例如:手机,电视机,笔记本电脑,照相机,
这些都是外部有一个坚硬的壳儿。
封装起来,保护内部的部件。保证内部的部件是安全的。
另外封装了之后,对于我们使用者来说,我们是看不见内部的复杂结构的,我们也不需要关心内部有多么复杂,
我们只需要操作外部壳儿上的几个按钮就可以完成操作。
那么封装,有什么用呢?
封装的作用有两个:
第一个作用:保证内部结构的安全。
第二个作用:屏蔽复杂,暴露简单。
在代码级别上,封装有什么用?
一个类体当中的数据,假设封装之后,对于代码的调用人员来说,不需要关心代码的复杂实现,
只需要通过一个简单的入口就可以访问了。另外,类体中安全级别较高的数据封装起来,
外部人员不能随意访问,来保证数据的安全性。
访问一个对象的属性,通常包括两种操作,一种是读数据,一种是改数据。
怎么进行封装,代码怎么实现?
第一步:属性私有化(使用 private 关键字进行修饰。)
第二步:对外提供简单的操作入口。
优点:第一数据安全了。第二使用者也方便了。
对象被称为实例。
实例相关的有:实例变量、实例方法。
实例变量是对象变量。实例方法是对象方法。
实例相关的都需要先 new 对象,通过“引用.”的方式去访问。
实例方法:对象相关的方法,对象级别的方法,应该是一个对象级别的行为。
类 = 属性 + 方法
属性描述状态信息
方法描述行为动作
空指针异常导致的最本质的原因是?
空引用访问“实例相关的数据”,会出现空指针异常。
实例相关的包括:实例变量 + 实例方法。
封装的代码实现两步:
第一步:将属性用 private 私有化
第二步:1 个属性对外提供公开的 set 和 get 方法作为操作入口。并且都不带 static,都是实例方法。
外部程序只能通过 set 方法修改,只能通过 get 方法读取。可以在 set 方法中设立观看来保证数据的安全性。
[修饰符列表] 返回值类型 方法名(无参){
}
注意;
java开发规范中有要求,set 方法和 get 方法要满足以下格式。
get 方法的要求:
public 返回值类型 get+属性名首字母大写(无参){
return 属性名;
}
set 方法的要求:
public void set+属性名首字母大写(有1个参数){
this.属性名 = 参数;
}
例:
public String getSecret() {
return secret;
}
public void setSecret(String secret) {
this.secret = secret;
}
按照 java 规范中要求的格式提供 set 和 get 方法。如果不按照这个规范格式来,那么该程序将不是一个通用的程序。
set 和 get 方法都是实例方法,不能带 static。
不带 static 的方法称为实例方法,实例方法的调用必须先 new 对象。
一个单词的快捷键:shift+左右箭头键
static:
1、static 翻译为“静态的”
2、所有 static 关键字修饰的都是类相关的,类级别的。
3、所有 static 修饰的,都是采用“类名.”的方式访问。
4、static 修饰的变量:静态变量
5、static 修饰的方法:静态方法
变量的分类:
变量根据声明的位置进行划分:
在方法体当中声明的变量叫做:局部变量。
在方法体外声明的变量叫做:成员变量。
成员变量又可以分为:
实例变量
静态变量
注意:只要是方法,不管是静态方法、实例方法、构造方法,它们在运行的时候都是需要压栈。
加 static 的变量叫做静态变量
静态变量在类加载时初始化,不需要 new 对象,静态变量的空间就开出来了。
静态变量存储在方法区。
Java中一共有三个变量:
静态变量:类级别,存储在方法区中
实例变量:对象级别,存储在堆内存中
局部变量:存储在 Stack 栈内存中
什么时候变量声明为实例的,什么时候声明为静态的?
如果这个类型的所有对象的某个属性值都是一样的,不建议定义为实例变量,浪费内存空间。
建议定义为类级别特征,定义为静态变量,在方法区中只保留一份,节省内存开销。
一个对象一份是实例变量,所有对象都一份是静态变量
实例的:一定需要使用“引用.”来访问。
静态的:
建议使用“类名.”来访问,但使用“引用.”也行(不建议使用“引用.”)。
静态的如果使用“引用.”来访问会让程序员产生困惑:程序员以为实例的呢。
结论:
空指针异常只有在什么情况下才会发生呢?
只有在“空引用”访问“实例”相关的都会出现空指针异常。
static 关键字
1、static 修饰的统一都是静态的,都是类相关的,不需要 new 对象。直接采用“类名.”访问。
2、当一个属性是类级别的属性,所有对象的这个属性的值是一样的,建议定义为静态变量。
关于方法来说,什么时候定义为实例方法?什么时候定义为静态方法?有没有参考标准?
参考标准:
当这个方法体当中,直接访问了实例变量,这个方法一定是实例方法。
以后开发中,大部分情况下,如果是工具类的话,工具类当中的方法一般都是静态的。
静态方法有一个优点,是不需要 new 对象,直接采用类名调用,极其方便。
工具类就是为了方便,所以工具类中的方法一般都是 static 的。
什么时候方法定义为实例方法?
方法一般都是描述了一个行为,如果说该行为必须由对象去触发。那么该方法定义为实例方法。
例:
张三考试,得分90
李四考试,得分100
不同的对象参加考试的结果不同。我们可以认定“考试”这个行为是与对象相关的行为。
建议将“考试”这个方法定义为实例方法。
实例变量的访问的语法机制是什么?
语法:引用.实例变量名
1、使用static关键字可以定义:静态代码块
2、什么是静态代码块,语法是什么?
static {
java语句;
java语句;
}
3、static 静态代码块在什么时候执行呢?
类加载时执行,并且只执行一次。
静态代码块有这样的 特征/特点。
4、注意:静态代码块在类加载时执行,并且在 main 方法执行之前执行。
5、静态代码块一般是按照自上而下的顺序执行。
6、静态代码块有什么作用,有什么用?
第一:静态代码块不是那么常用。(不是每一个类当中都要写的东西。)
第二:静态代码块这种语法机制实际上是 SUN 公司给我们 java 程序员的一个特殊的时刻/时机。
这个时机叫做:类加载时机。
具体的业务:
项目经理说了:大家注意了,所有我们编写的程序中,只要是类加载了,请记录一下类加载的日志信息
(在哪年哪月哪日几时几分几秒,哪个类加载到 JVM 当中了)。
思考:这些记录日志的代码写到哪里呢?写到静态代码块当中。
静态变量在什么时候初始化?类加载时初始化。
静态变量存储在哪里?方法区
静态代码块什么时候执行?类加载的时候。
注意:main 方法执行之前实际上执行了很多代码
栈:方法只要执行,会压栈。(局部变量)
堆:new 出来的对象都在堆中。垃圾回收器主要针对。(实例变量)
方法区:类的信息,字节码信息,代码片段。(静态变量)
方法的代码片段放在方法区,但是方法执行过程当中需要的内存在栈中。
实例变量,在构造方法执行时内存空间才会开辟。
类加载时,实例变量空间还没开辟出来。
总结:
第一:对于一个方法来说,方法体中的代码是有顺序的,遵循自上而下的顺序执行。
第二:静态代码块 1 和静态代码块 2 是有先后顺序的。
第三:静态代码块和静态变量是有先后顺序的。
1、除了静态代码块之外,还有一种语句块叫做:实例语句块
2、实例语句在类加载时并没有执行
3、实例语句语法?
{
java语句;
java语句;
. . . . . .
}
4、实例语句块什么时候执行?
只要是构造方法执行,必然在构造方法执行之前,自动执行“实例语句块”中的代码。
实际上这也是 SUN 公司为 java 程序员准备一个特殊的时机,叫做对象构建时机。
实例变量,怎么访问?必须先 new 对象,通过“引用.”来访问。
. 后面只是一个单词,没有小括号,表示访问的是属性。
. 后面有一个单词,单词后面有小括号,表示访问的是方法。
this:
1、this 是一个关键字,全部小写。
2、this 是什么,在内存方面是怎样的?
一个对象一个 this。
this 是一个变量,是一个引用。this 保存当前对象的内存地址,指向自身。
所以,严格意义上来说,this 代表的就是“当前对象”。this 存储在堆内存当中对象的内部。
3、this 只能使用在实例方法中。谁调用这个实例方法,this 就是谁。所以 this 代表的是:当前对象。
4、“this.”大部分情况下是可以省略的。
5、为什么 this 不能使用在静态方法中?this 代表的是当前对象,静态方法中不存在当前对象。
1、this可以使用在实例方法中,不能使用在静态方法中。
2、this关键字大部分情况下可以省略,什么时候不能省略呢?
在实例方法中,或者构造方法中,为了区分局部变量和实例变量,这种情况下:this. 是不能省略。
1、this 除了可以使用在实例方法中,还可以用在构造方法中。
2、新语法:通过当前的构造方法去调用另一个本类的构造方法,可以使用以下语法格式:
this(实际参数列表);
通过一个构造方法1去调用构造方法2,可以做到代码复用。
但需要注意的是:“构造方法1”和“构造方法2”都是在同一个类当中。
3、this() 这个语法的作用是什么?代码复用。
4、死记硬背:对于 this() 的调用只能出现在构造方法的第一行。
1、this
(1)this 是一个关键字
(2)this 可以使用在实例方法中,也可以使用在构造方法中。
(3)this 出现在实例方法中其实代表的是当前对象。
(4)this 不能使用在静态方法中。
(5)this. 大部分情况下可以省略,但是用来区分局部变量和实例变量的时候不能省略。
(6)this() 这种语法只能出现在构造方法第一行,表示当前构造方法调用本类其他的构造方法,目的是代码复用。
2、总结所有的变量怎么访问,总结所有的方法怎么访问
类体{
实例变量;
实例方法;
静态变量;
静态方法;
构造方法;
静态代码块;
实例语句块;
方法(){
// 局部变量
int i = 100;
}
}
类加载机制中,是这样的:
在程序执行之前,凡是需要加载的类全部加载到 JVM 当中。先完成加载才会执行 main 方法。
程序再怎么变化,万变不离其宗,有一个固定的规律:
所有的实例相关的都是先创建对象,通过“引用.”来访问。
所有的静态相关的都是直接采用“类名.”来访问。
你有发现一些问题吗?
总有一些是需要记忆的,在这些记忆的基础之上进行分析。
大结论:
只要负责调用的方法 a 和被调用的方法 b 在同一个类当中:
this. 可以省略。
类名. 可以省略。