1、Java类及类的成员
1.1.成员变量
1.1.1.成员变量与局部变量
-
语法
-
成员变量是属于类的,而局部变量声明在方法内、方法形参、代码块内、构造器形参、构造器内部的变量。
-
成员变量可以被 public,private 等权限修饰符所修饰,而局部变量不能被权限修饰符所修饰。
-
-
存储方式
-
非static的成员变量存在于堆。
-
局部变量存在于栈。
-
-
生命周期
-
成员变量随着对象的创建而存在。
-
而局部变量随着方法的调用而自动生成,随着方法的调用结束而消亡。
-
-
默认值
-
成员变量有默认初始化值
-
局部变量没有默认初始化值。
-
1.2.成员方法
1.2.1.方法的重载
-
重载:同一个类中多个同名方法根据不同的参数列表来执行不同的逻辑处理。
参数列表不同:参数个数、参数类型不同
1.2.2.可变个数形参的方法
-
可变长参数就是允许在调用方法时传入不定长度的参数。
注意事项:
-
可变参数只能作为函数的最后一个参数。
-
遇到方法重载时,会优先匹配固定参数的方法。
-
Java 的可变参数编译后实际会被转换成一个数组。
1.2.3.值传递
实参传递给方法有两种方式:
-
值传递:方法接收的是实参值的拷贝,会创建副本。
-
引用传递:方法接收的直接是实参所引用的对象在堆中的地址,不会创建副本,对形参的修改将影响到实参。(因为形参和实参指向同一个地址)
在 Java 中只有值传递。
-
如果参数是基本数据类型,此时实参赋给形参的是实参真实存储的数据值。
-
如果参数是引用数据类型,此时实参赋给形参的是实参存储数据的地址值。
1.3.构造器
-
如果没有显式的定义类的构造器的话,则系统默认提供一个空参的构造器.
-
一个类中定义的多个构造器,彼此构成重载
-
一旦我们显式的定义了类的构造器之后,系统就不再提供默认的空参构造器
-
一个类中,至少会有一个构造器。
2、面向对象特征
2.1.封装
-
封装是指把一个对象的状态信息(也就是属性)隐藏在对象内部,不允许外部对象直接访问对象的内部信息。但是可以提供一些可以被外界访问的方法来操作属性。
2.2.继承
-
子类拥有父类对象所有的属性和方法(包括私有属性和私有方法),但是父类中的私有属性和方法子类是无法访问,只是拥有。
-
子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
2.2.1.方法的重写
子类中改写父类方法要满足同名同参。
2.3.多态
父类的引用指向子类的实例。
-
对象类型和引用类型之间具有继承(类)/实现(接口)的关系;
-
引用类型变量发出的方法调用的到底是哪个类中的方法,必须在程序运行期间才能确定;
-
多态不能调用子类特有的方法;
-
如果子类重写了父类的方法,真正执行的是子类重写的方法,如果子类没有重写父类的方法,执行的是父类的方法。我们在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法。(虚拟方法调用)
3、关键字
3.1.this
this可以用来修饰:属性、方法、构造器
-
this修饰属性和方法:this理解为当前对象
-
this修饰构造器:
-
我们在类的构造器中,可以显式的使用“this(形参列表)“方式,调用本类中指定的其他构造器。
-
构造器中不能通过"this(形参列表)"方式调用自己。
-
如果一个类中有n个构造器,则最多有n-1构造器中使用了"this(形参列表)“。
-
规定:"this(形参列表)"必须声明在当前构造器的首行。
-
构造器内部,最多只能声明一个“this(形参列表)”,用来调用其他的构造器
-
3.2.super
super可以用来修饰:属性、方法、构造器
-
super修饰属性:表示调用父类的属性
-
super修饰方法:表示调用父类中的方法
-
this修饰构造器:
-
我们可以在子类的构造器中显式的使用 "super(形参列表)" 的方式,调用父类中声明的指定的构造器。
-
"super(形参列表)" 的使用,必须声明在子类构造器的首行。
-
我们在类的构造器中,针对于 "this(形参列表)" 或 "super(形参列表)" 只能二选一,不能同时出现
-
在构造器的首行,没有显式的声明 "this(形参列表)" 或 "super(形参列表)" ,则默认调用的是父类中空参的的构造器:super()
-
在类的多个构造器中,至少有一个的构造器中使用了 "super(形参列表)" ,调用父类中的构造器。
-
3.3.static
static:静态的
static可以用来修饰:属性、方法、代码块、内部类
-
static修饰属性:
-
这个属性我们称之为静态变量。
-
随着类的加载而加载
-
通过 类.静态变量 调用
-
-
static修饰方法:
-
这个方法我们称之为静态方法。
-
随着类的加载而加载
-
通过 类.静态方法 调用
-
在静态的方法内,不能使用this关键头,super关键字。(因为this和super的使用是基于当前对象和当前对象的父类,而静态方法内,只加载了类,对象未加载出。)
-
3.4.final
final可以用来修饰的结构:类、方法、变量
-
final修饰类:
-
此类不能有后代,即不能被其他类所继承
-
-
final修饰方法:
-
此方法不能被重写
-
-
final修饰变量:
-
此时的“变量“就称为是一个常量
-
static+final 修饰属性,表示该属性为全局常量。
-
3.5.abstract
abstract可以用来修饰的结构:类、方法
-
修饰类:抽象类
-
这个类无法实例化,即这个类无法造对象
-
抽象类中仍然会有构造器,不管是默认的,还是自己定义的,因为抽象类一旦一定有子类,而前面学过,子类中的构造器一定会调用父类中的构造器。
-
-
修饰方法:抽象方法
-
包含抽象方法的类一定是抽象类。
-
抽象类可以没有抽象方法。
-
若子类没有重写父类中的所有的抽象方法,则此子类也是一个抽象类,需要使用abstract修饰
-
-
abstract不能用来修饰私有方法、静态方法、final的方法、final的类。
解释:
因为父类中private的方法,子类无法进行方法的重写,导致子类只能是abstract,没有意义。上面说的四个其实都有一个特征,就是子类无法进行方法改写或子类无法继承,这样就会使代码没有意义。
假设,abstract和static可以一起修饰方法,那么就可以通过A类名去调用,但是有个问题,抽象方法是没有方法体的,这就造成了错误,这个方法没有方法体,也无法执行啊。
4、Object类的使用
4.1.Object类里的构造器
-
public Object()
4.2.Object类里的方法
-
public boolean equals(Object obj)
-
public int hashCode()
-
public String toString()
4.3.==
-
如果比较的是基本数据类型变量:比较两个变量保存的数据是否相等。(不一定类型要相同)
-
如果比较的是引用数据类型变量:比较两个对象的地址值是否相同.即两个引用是否指向同一个对象实体。
4.4.equals()
-
只能适用引用数据类型
//Object类里的equals方法 public boolean equals(Object obj) {return (this = obj); }
-
默认情况下,比较引用数据类型,则比较的是地址值。
-
像String、Date、File、包装类等都重写了Object类中的equals()方法。重写以后,比较的不是两个引用的地址是否相同,而是比较两个对象的)实体内容是否相同。
5、包装类
-
自动装箱
-
自动拆箱
6、单例模式
6.1.饿汉式
class Bank {private Bank() { //构造器私有化
}//为什么这里添加private?因为这样在main里就无法调用这个bank对象,只能通过getBank()方法private static Bank instance = new Bank(); //因为是静态方法,所以只能调静态的东西public static Bank get Bank() { return instance;}
}
6.2.懒汉式
classOrder {private Order() {
}private static Order instance = null;public static Order getInstance() {if (instance == null) {instance = new Order();}return order;}
}
-
懒汉式:只有当调用创建对象的方法时才会创建对象。
-
饿汉式:类加载时,就会创建对象。
7、接口
-
JDK7及以前:只能定义全局常量和抽象方法
-
接口中不能定义构造器的。意味着接口不可以实例化。
-
Java开发中,接口通过让类实现(implements)的方式来使用。如果实现类覆盖接口中的所有柚象方法,则此实现类就可以实例化;如果实现类没有覆盖接口中所有的抽象方法,则此实现类仍为一个抽象类。
-
Java类可以实现多个接口。
-
接口使用上也满足多态性。