目录
1.类的封装
思想:“假如你吃了个鸡蛋觉得不错,何必要认识那个下蛋的母鸡呢?”——钱钟书
将对象的属性和行为封装起来,
而将对象的属性和行为封装起来的载体就是类,
类通常对客户隐藏其实现细节,这就是封装的思想。
2.类的继承
2.1 extends关键字
子类中可以连同初始化父类构造方法来完成子类初始化操作,既可以在子类的构造方法中使用super()语句调用父类的构造方法,也可以在子类中使用super关键字调用父类的成员方法等。但是子类没有权限调用父类中被private修饰的方法,只可以调用父类中的public跟protected的成员方法。
继承并不仅仅是扩展父类的功能,还可以重写父类的成员方法。
重写:就是在子类中将父类的成员方法的名称保留,重写成员方法的实现内容,更改成员方法的存储权限,或是修改成员方法的返回值。
重构:特殊的重写方法,子类与父类的成员方法的返回值、方法名称、参数类型及个数完全相同,唯一不同的是方法实现内容。
注:1.重写父类方法时,修改方法的修饰权限只能从小的范围到大的范围
2.在实例化子类对象时,父类无参构造方法将被自动调用,有参构造方法不能被自动调用,用户只能使用super关键字调用父类的构造方法
语法:
public class 子类 extends 父类{
……
}
extend是后面只能有一个父类
2.2super关键字
public class 子类 extends 父类{
public void do(){
super.do();
}
}
2.3instanceof关键字
使用instanceof判断是否存在继承关系
子类对象 instanceof 父类名称/接口名称
class A
class B
class C
C c = new C();
c instanceof B ====》 ture
2.4 Object 类
Java中的每一个类都源于java.lang.Object类,如String、 Integer等类都是继承Object类,自定义类继承的也是Object类。
Object类中主要包括clone() 、 finalize()、equals()、toString
getClass()、notify() 、 notifyAll()、 wait() 等方法不能被重写,因为他们都是final类型。
2.4.1 getClass()方法
语法:getClass().getName();
它返回对象执行时的Class实例,然后使用此实例调用getName()方法可以取得类的名称
2.4.2 toString()方法
功能是将一个对象返回字符串形式,它会返回一个String实例。在实际的应用中通常重写toString()方法,为对象提供一个特定的输出模式。当这个类转换为字符串或与字符串连接时,将自动调用重写的toString方法。
2.4.3 equals()方法
equals()方法比较的是两个对象的实际内容,“==”比较的是两个对象的引用是否相等
2.5对象类型的转换
对象类型的转换主要包括向上转型和向下转型
2.5.1 向上转型
例如:平行四边形类继承了四边形类,四边形类中存在一个draw()方法,它的参数是Q(四边形类)的类型,而在平行四边形类的主方法中调用draw()时 给与的参数类型确实P(平行四边形)类型的。这就是等于说:平行四边形也是一种类型的四边形,所以可以将平行四边形类的对象看作是一个四边形的类的对象,这就是相当于Q obj = new P;就是等于将子类对象赋值给父类类型的对象,这就是向上转型
2.5.2 向下转型
向下转型是将比较抽象的类型转换为比较具体的类
但是这样会出问题,例如不能说所有的鸟都是麻雀,也就是说子类对象总是父类的一个实例。但父类对象不一定是子类的实例,所以不能将父类的对象直接赋予子类。
在做向下转型操作时,将特性范围小的对象转换为特性范围大的对象肯定会出现问题,所以这是需要将父类对象强制转化为某个子类对象,这种方式称为显式类型转换,同时要向编译器指明要将父类对象转换为哪一种类型的子类对象。
3.多态
利用多态可以使程序具有良好的扩展性,并可以对所有类对象进行通用的处理。
同一个变量,同一个方法,执行出不同的结果
语法:
• 父类类型 引用变量名 = new 子类类型();
• 如:
Shape sr = new Rect();
sr.show();
特点:
• 当父类类型的引用指向子类类型的对象时,父类类型的引用可以直接调
用父类独有的方法。
• 当父类类型的引用指向子类类型的对象时,父类类型的引用不可以直接
调用子类独有的方法。
• 对于父子类都有的非静态方法来说,编译阶段调用父类版本,运行阶段
调用子类重写的版本(动态绑定)。
• 对于父子类都有的静态方法来说,编译和运行阶段都调用父类版本。
4.方法的重载
方法的重载就是在同一个类中允许存在一个以上的同名方法,只要这些方法的参数个数或类型不同即可,有以下几种
1.方法名相同,参数个数不同
2.方法名相同,参数顺序不同
3.方法名相同,参数类型不同
4.方法名相同,参数不同,且返回值类型也不同
虽然在方法重载中可以使两个方法的返回值类型不同,但是只有返回类型不同并不足以区分两个方法的重载,还需要通过参数的个数以及参数的类型来设置。
通过上述就可以确定,编辑器是利用方法名、方法各参数类型和参数的个数以及参数的顺序来确定类中的方法是否唯一。
5.抽象类
关键字:abstract
概念:
使用abstract关键字定义的类为抽象类,而使用这个关键字定义的方法称为抽象方法,抽象方法没有具体的方法体,这个方法本身没有任何意义,除非重写,而承载这个抽象方法的抽象类必须被继承,实际上抽象类除了被继承以外没有任何意义,在解决实际问题时,一般将父类定义为抽象类,需要使用这个父类进行继承与多态处理。
如果声明一个抽象的方法,就必须将承载这个抽象方法的类定义为抽象类,不可能在非抽象类中获取抽象方法,只要类中有一个抽象方法,此类就被标记为抽象类。抽象类被继承后需要实现其中所有的抽象方法,也就是保证相同的方法名称、参数列表和相同的返回值类型创建出非抽象方法,当然也可以是抽象方法。
抽象方法:
• 抽象方法主要指不能具体实现的方法并且使用abstract关键字修饰,也就是没有方法体。
• 具体格式如下:
访问权限 abstract 返回值类型 方法名(形参列表);
public abstract void cry();
抽象类:
抽象类主要指不能具体实例化的类并且使用abstract关键字修饰,也就是不能创建对象。
抽象类和抽象方法的关系
• 抽象类中可以有成员变量、构造方法、成员方法;
• 抽象类中可以没有抽象方法,也可以有抽象方法;
• 拥有抽象方法的类必须是抽象类,
因此真正意义上的抽象类应该是具有抽象方法并且使用abstract关键字修饰的类。
抽象类的实际意义
• 抽象类的实际意义不在于创建对象而在于被继承。
• 当一个类继承抽象类后必须重写抽象方法,否则该类也变成抽象类,也
就是抽象类对子类具有强制性和规范性,因此叫做模板设计模式。
抽象类的应用
• 银行有 定期账户和活期账户。继承自 账户类。账户类中:
• public class Account{
private double money;
public double getLixi(){}
}
6.接口
接口的基本概念
接口就是抽象类的延伸,接口中所有的方法都没有方法体
• 接口就是一种比抽象类还抽象的类,体现在所有方法都为抽象方法。
• 定义类的关键字是class,而定义接口的关键字是interface。
接口中,方法必须被定义为public 或 abstract 形式,其他修饰形式不被编译器认可,在接口中定义的任何字段都自动是static 和 final 的
• 如:
金属接口 货币接口 黄金类
类和接口之间的关系
主要区别:
• 定义抽象类的关键字是abstract class,而定义接口的关键字是interface。
• 继承抽象类的关键字是extends,而实现接口的关键字是implements。
• 继承抽象类支持单继承,而实现接口支持多实现。
• 抽象类中可以有构造方法,而接口中不可以有构造方法。
• 抽象类中可以有成员变量,而接口中只可以有常量。
• 抽象类中可以有成员方法,而接口中只可以有抽象方法。
• 抽象类中增加方法时子类可以不用重写,而接口中增加方法时实现类需要重写(Java8以前的版本)。
• 从Java8开始增加新特性,接口中允许出现非抽象方法和静态方法,但非抽象方法需要使用default关键字修饰。
• 从Java9开始增加新特性,接口中允许出现私有方法。
1.方法名相同,1.参数个数不同。1.方法名相同,参数个数不同。
instanceof关键字
3instanceof关键字
extends后面只可以有一个父类
extends后面只可以有一个父类