面向对象
面向对象的本质就是:以类的方式组织代码,以对象的组织(封装)数据
创建与初始化对象
使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用
构造器
作用
实例化初始值
//有参构造:一旦定义了有参构造,无参就必须显示定义
-
使用new关键字,本质是在调用构造器
-
用来初始化值
//alt+insert 生成构造器 ok:有参 第二个无参
特点
和类名相同
没有返回值
this.当前对象
属性
字段Field 成员变量
默认初始化:
数字: 0 0.0
char:u0000
Boolean:false
引用:null
修饰符 属性类型 属性名 = 属性值!
属性赋值的先后顺序:
-
默认初始化 //只能赋值一次
-
显示初始化 //只能赋值一次
-
构造器中赋值 //只能赋值一次
-
通过“对象.方法”或:对象。属性“的方式,赋值 //可以赋值多次
顺序:1-2-3-4
封装
get/set
封装的意义
-
提高程序的安全性,保护数据
-
隐藏代码的实现细节
-
统一接口
-
系统可维护增加了
属性私有get/set
继承
extends
子类继承父类就会拥有父类的全部方法
CTRL + H (找到继承树)
Java中类只有单继承,没有多继承
super
调用父类的构造器,必须要在子类构造器的第一行。
注意点
-
super调用父类的构造方法,必须在构造方法的第一个
-
super必须只能出现在子类的方法或者构造方法中!
-
super和this不能同时调用构造方法
对比this
代表的对象不同:
this:本身调用者这个对象
super:代表父类对象的应用
前提
this:没有继承也可以使用
super:只能在继承条件下才可以使用
构造方法
this();调用本类的构造
super();调用父类的构造
一个类有n个构造器,最多有n-1个this。剩的那个是super。也就是说在一个类的构造器中至少有一个super
方法的重写
重写都是方法的重写,和属性无关//重名属性保留基类的,重名方法保留子类的
父类引用指向子类
方法分调用只和左边,定义的数据类型有关。
静态方法和非静态方法区别很大。
注
重写产生于父类和子类之间,是指子类将父类的方法进行重写而重载是指同一个类中,可以因不同的参数类型,参数个数等可以写出多个相同名字的方法。
重写:需要有继承关系,子类重写父类的方法!
-
方法名必须相同
-
参数列表必须相同
-
修饰符:范围可以扩大但不能缩小: Public》Protected》Default》Private
-
抛出的异常:范围,可以被缩小,但不能扩大
-
重写,子类的方法和父类必要一致;方法体不同!
-
子类不能重写父类中private的方法
为什么需要重写:
父类的功能,子类不一定需要,或者不一定满足!
Alt + Insert ; override;
父类被重写的方法的返回值类型是void,则子类重写的方法的返回值类型只能是void
父类被重写的方法的返回值类型是A类型,则子类重写的方法的返回值类型可以是A类或A 类的子类
父类被重写的方法的返回值类型是基本数据类型(比如:double,则子类重写的方法的返回值类型必须是相同的基本数据类型
多态
何为多态性:
对象的多态性:父类的引用指向子类的对象
多态的使用:当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法---虚拟方法的调用
:有了对象的多态性以后,我们在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法。
编译看左边,运行看右边
多态的使用前提:
-
类的继承
-
方法的重写
对象的多态性,只适应于方法,不适用于属性
(类型转换异常:ClassCastException)
instanceof关键字的使用
格式:a instanceof A:判断对象a是否是类A的实例。如果是,返回ture;如果不是,返回false。
使用情景:为了避免在向下转型时出现ClassCastException的异常,我们在向下转型之前,先进行instanceof的判断,一旦返回true,就进行向下转型。如果返回false,不进行向下转型。
如果 a instanceof A返回true,则a instanceof B也返回true。
其中,类B是类A的父类。
===================================================================
若子类重写了父类方法,就意味着子类里定义的方法彻底覆盖了父类里的同名方法,系统将不可能把父类里的方法转移到子类中:编译看左边,运行看右边
对于实例变量和则不存在这样的现象,即使子类里定义了与父类完全相同的实例变量,这个实例变量依然不可能覆盖父类中定义的实例变量:编译运行都看左边。
equals
== 和equals()的区别:
== :运算符
-
可以使用在基本数据类型变量和引用数据类型变量中
-
如果比较的是基本数据类型变量:比较两个变量保存的数据是否相等。(不一定类型要相同)
-
如果比较的是引用数据类型变量:比较两个对象的地址值是否相同.即两个引用是否指向同一个对象实体。
equals()方法的使用:
-
是一个方法,而非运算符
-
只能适用于引用数据类型
-
Object类中定义的equals()和==的作用是相同的
-
像String、Date、File、包装类等都重写了Object类中的equals()方法。重写以后,比较的不是两个引用的地址是否相同,而是比较两个对象的“实体内容”是否相同。
-
通常情况下,我们自定义的类如果使用equals()的话,也通常是比较两个对象的“实体内容”是否相同。那么,我们就需要对Object类中的equals()进行重写
重写规则,比较两个对象的实体内容是否相同
toString
-
当我们输出一个对象的引用时,实际上就是调用当前对象的toString()
-
Object类中toString()的定义:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
} -
-
像String、Date、File、包装类等都重写了Object类中的toString()方法。
使得在调用对象的toString()时,返回“实体内容”信息
-
自定义类也可以重写toString()方法,当调用此方法时,返回对象的“实体内容”
包装类
包装类的使用:
-
Java提供了8种基本数据类型对应的包装类,使得基本数据类型的变量具有类的特征
-
掌握的:基本数据类型、包装类、String三者之间的相互转换
基本数据类型、包装类---》String类型:调用String重载的valueOf(Xxx xxx)
String类型---》基本数据类型、包装类:调用包装类的parseXxxx(Strig s)
static
static关键字的使用
-
static:静态的
-
static可以用来修饰:属性、方法、代码块、内部类
-
使用static修饰属性:静态变量
- 属性,按照是否使用static修饰,又分为:静态属性和非静态属性(实例变量)
实例变量:我们创建了类的多个对象,每个对象都独立的拥有一套类中的非静态属性。当修改其中一个对象中的非静态属性时,不会导致其他对象中同样的属性值的修改。
静态变量:我们创建了类的多个对象,多个对象共享同一个静态变量。当通过某一个对象修改静态变量时,会导致其他的对象调用此静态变量时,是修改过了的。
-
static修饰属性的其他说明:
静态变量随着类的加载而加载。可以通过“类.静态变量”的方式进行调用
静态变量的加载要早于对象的创建
由于类只会加载一次,则静态变量在内存中也只会存在一份:存在方法区的静态域中
-
使用static修饰方法:静态方法
随着类的加载而加载,可以通过“类.静态方法”的方式进行调用
静态方法中,只能调用静态的方法或属性
非静态方法中,既可以调用非静态的方法或属性,也可以调用静态的方法或属性
-
static注意点:
在静态的方法内,不能使用this关键字、super关键字
-
开发中,如何确定一个属性是否要声明为static
属性是可以被多个对象所共享的,不会随着对象的不同而不同的
类中的常量也常常声明为static
开发中,如何确定一个方法是否要声明为static
操作静态属性的方法,通常设置为static的
工具类中的方法,习惯上声明为static的