Class
Java文件与class文件的关系:
1、1篇java文件可以书写多个类;
2、1篇java文件只能有1个公共类,公共类类名必须和java文件名保持一致;
----实际书写过程中,做到一篇java文件只书写一个类(以后的内部类除外)
3、1篇java文件可以生成多篇class文件,class文件的数量依赖于类的数量(1个类编译后1篇class文件)
4、class文件的名字与它所对应的类名保持一致,与java文件名无关
----所以JVM中的加载器叫做类加载器,加载的是class文件
在类的内部,定义类的内容。
属性---值数据
属性语法就是声明变量或常量
1、 变量属性---该类所有对象的这个值可以不同;
---访问修饰符 数据类型 属性名;
---变量属性会被自动初始化----基本数据类型的属性会被自动初始化为0;引用数据类型的属性会被自动初始化为null。
2、常量属性---该类所有对象的这个值必须保持一致
---访问修饰符 final 数据类型 属性名 = 值;
访问修饰符
public----代表该属性或方法是公共的,能够被外部直接访问操作;
private----代表该属性或方法是私有的,只能够在本类自己的方法中进行访问操作。
本类 |
同包类 |
非同包类 | ||
子类 |
非子类 |
子类 |
非子类 | |
Public |
ü |
ü |
ü |
ü |
Protected(受保护的) |
ü |
ü |
ü |
l |
默认 |
ü |
ü |
l |
l |
Private |
l |
l |
l |
l |
构造方法(Constructor)
用途:产生对象。
产生对象的步骤:
1、首先在堆当中划分空间,根据类的定义确定空间大小;
2、在该空间划分属性;
3、对属性进行初始化(如果没有赋初始值,基本数据类型为0,引用数据类型为null)
4、执行我们在构造方法当中书写的代码
关于是否书写了构造:
构造方法如果程序员没有定义,JVM会自动提供一个默认的公共无参构造;
如果程序员定义了,JVM就不会提供默认的公共无参构造。
构造方法的语法:访问修饰符 方法名(行参列表)
1、方法名必须是类名;
2、没有返回类型,连void都没有;
在一个类当中,可以有多个构造方法,这叫构造方法的重载
JavaBean的规范当中:
1、必须要够公共无参构造!
2、为属性提供符合命名规范的get/set方法!
get/set(封装性)
把属性定义成private,并提供get/set方法的好处:
1、可以对给属性赋的值进行有效验证;
2、只提供get或set方法,能够把这个属性变成只读或只写状态;
3、可以通过get/set方法的变形,让外部使用者得不到本类内部的存储形式。
继承
父类---关注的是相同的属性、行为
子类继承了父类以后,可以自动拥有来自于父类的属性、行为,但是不会继承来自于父类的构造;
原因:
语法上:由于构造方法的名字必须和所在类的类名一致,所以子类不可能拥有叫父类名字的构造方法。
构造方法的作用:构造方法是用于产生对象的,子类不可能拥有父类的构造方法去产生父类对象,这没有道理,也没有使用价值。
super、this
当在子类当中需要访问来自于父类的被重写前的方法时,使用super;
这个时候的super的含义当前对象的父类对象部分;
如果说this代表我的含义,super代表的就是我爹的含义;
this.能够访问到:1、本类自己定义的所有属性和行为,不受访问修饰符限制;
2、来自于父类的被访问修饰符允许的属性和行为。
super.能够访问到:只能是来自于父类的被访问修饰符允许的属性和行为。
this.能够看到的,super.不一定能看到;super.能看到的,this.一定能看到。
所以99%的情况,我们用this.;
只有一种情况两者分开使用:
当调用重写方法的时候,this.是重写后的效果,super.是重写前的效果
默认情况下,子类的构造都会自动去调用父类的无参构造
1、使用super()调用父类的指定构造----与this()进行辨析学习
2、super()根据实参与行参的匹配,去调用父类中符合的构造方法.
3、super()只能写在子类的构造方法里面,而且只能是第一句!!!---this()与super()不能同时出现。
重写
將继承于父类的方法,让子类重新实现一次,从而将父类实现给覆盖掉
语法:1、方法名必须一致;
2、行参列表必须一致;
3、返回类型必须保持一致;
4、重写后的访问修饰符 必须 大于等于(范围) 重写前的访问修饰符
5、重写后的方法 不能比重写前的方法 抛出更多的异常(留待异常那一章讲)
@Override是一种注解,它是专门用来通知编译器检查它下面的这个方法是否是一个正确的方法重写。
方法重载
在一个类当中,有多个同名方法,那么只能根据参数列表的不同(个数、类型、顺序)来区分。
方法重载是面向对象特点当中--多态---的一种体现。
Object
toString()----用来返回对象的字符串描述
1、当我们对对象直接进行打印,或进行字符串拼接的时候,JVM会自动调用该对象的toString方法,得到它的描述字符串参与这些操作。
2、toString()在根类Object中,只进行了简单的实现。因为先人此时并不能够确定每个子类需要用什么格式来进行说明,也不知道每个子类有哪些内容。所以Object中的实现是固定的返回:“类全名@十六进制引用”;
3、子类的实现者需要自己重写toString(),虽然这不是必须的,但是会在编码、测试过程中给我们带来便利性。
equals()----用来比较两个对象在业务上是否相等
1、equals()在根类Object中,由于不能确定每个子类具体的业务行为,所以只能进行简单的实现,就是比较引用是否相等;
2、子类的实现者在确定了业务规则的情况下,需要重写该方法完成业务比较相等的实现。
3、虽然不是必须的,但是同样是常常重写的一个方法。
finalize()----用来进行对象销毁的
1、它与构造方法其实是一组,构造负责产生对象,它负责销毁对象回收空间;
2、Java的设计当中安全性的体现就是销毁对象由JVM的GC(垃圾回收)自动完成,无需程序员操作。所以这个方法的实现和调用都不需要我们进行干涉;让它在后面默默工作即可。
3、对于这个方法,我们只需知道它的存在即可。
final
1、 变量——常量
2、 方法——不能重写
3、 类——不能被继承
Static—静态
static修饰属性效果特性:
1、全类共享一个值;
2、与对象无关,而是与类有关;---所以static的属性又被称为类属性
可以直接用类名.的方式直接操作(当然要受访问修饰符的限制)
static修饰属性内存特性:
1、该属性不会存放在对象身上,而是放到数据段的静态区当中,全类只放这一份儿;
2、static修饰的属性是在类加载的时候放入到静态区的,所以可以直接用类名.的方式使用,无需产生对象。
static修饰的属性对应的场景:
1、决不能因为方便调用,就把属性设计为static;
2、变量属性必须判断出要有全类共享唯一值这个特性才能这么做;
3、常量属性可以无脑定义成static。
static不能修饰构造方法,因为构造方法和对象有关。
static修饰符方法的效果:
1、既可以用类名.的方式访问,又可以用对象名.方式访问;
2、静态方法只能操作静态属性或调用其它静态方法,操作不到非静态的;
非静态方法全都可以操作;
static修饰的方法的内存机制:
在类加载期,static修饰的方法或属性会先加载,然后再加载非static的。导致了,在加载static的内容时,还不知道非static内容的存在,所以会报错。
static修饰方法在设计上:
1、只有操作跟对象无关的方法,才敢设计为static;
2、在实际设计时,只有工具类的工具行为才设计为static。