文章目录
一、封装
1. 权限修饰符可以修饰什么?
类(类、接口等)、属性、方法、构造器、内部类
类(外部类):public和缺省
属性:4种
方法:4种
构造器:4种
内部类:4种
二、继承
(1)子类会继承父类的所有特征(属性、方法)
但是,私有的在子类中是不能直接使用的
(2)子类不会继承父类的构造器
因为,父类的构造器是用于创建父类的对象的
(3)子类的构造器中又必须去调用父类的构造器
在创建子类对象的同时,为从父类继承的属性进行初始化用,可以借助父类的构造器中的代码为属性赋值。
(4)Java只支持单继承:一个子类只能有一个“直接”父类
(5)Java又支持多层继承:父类还可以有父类,特征会代代相传
(6)一个父类可以同时拥有很多个子类
三、多态
1. 语法
父类 引用/变量 = 子类的对象;
2. 前提
(1)继承
(2)方法的重写
(3)多态引用
3. 现象
编译时看左边/"父类",运行时看右边/"子类"。
编译时,因为按父类编译,那么只能父类有的方法,子类扩展的方法是无法调用的;
执行时一定是运行子类重写的过的方法体。
4. 示例
Person类
public class Person {
public void eat() {
System.out.println("吃饭");
}
public void walk() {
System.out.println("走路");
}
}
Woman类
public class Woman extends Person {
public void eat() {
System.out.println("细嚼慢咽的吃饭");
}
public void walk() {
System.out.println("婀娜多姿走路");
}
public void shop() {
System.out.println("买买买...");
}
}
Man类
public class Man extends Person {
public void eat() {
System.out.println("狼吞虎咽的吃饭");
}
public void walk() {
System.out.println("大摇大摆的走路");
}
public void smoke() {
System.out.println("吞云吐雾");
}
}
DemoTest
public class DemoTest{
public static void main(String[] args) {
Person p = new Woman();//多态引用
p.eat();//执行子类重写
p.walk();//执行子类重写
//p.shop();//无法调用
}
}
5. 应用
(1)多态参数:形参是父类,实参是子类对象
(2)多态数组:数组元素类型是父类,元素存储的是子类对象
6. 向上转型与向下转型:父子类之间的转换
(1)向上转型:自动类型转换
当把子类的对象赋值给父类的变量时(即多态引用时),在编译时,这个对象就向上转型为父类。此时就看不见子类“特有、扩展”的方法。
(2)向下转型:强制转换。有风险,可能会报ClassCastException异常。
当需要把父类的变量赋值给一个子类的变量时,就需要向下转型。
要想转型成功,必须保证该变量中保存的对象的运行时类型是<=强转的类型
(1)示例代码
Person类
public class Person{
//方法代码省略...
}
Woman类
public class Woman extends Person{
//方法代码省略...
}
ChineseWoman类
public class ChineseWoman extends Woman{
//方法代码省略...
}
DemoTest类
public class DemoTest{
public static void main(String[] args){
//向上转型
Person p1 = new Woman();
//向下转型
Woman m = (Woman)p1;
//p1变量中实际存储的对象就是Woman类型,和强转的Woman类型一样
//向上转型
Person p2 = new ChineseWoman();
//向下转型
Woman w2 = (Woman) p2;
//p2变量中实际存储的对象是ChineseWoman类型,强制的类型是Woman,ChineseWoman<Woman类型
}
}
7. instanceof
(1)作用
用来判断这个对象是否属于这个类型,或者说,是否是这个类型的对象或这个类型子类的对象
表达式语法格式:
对象/变量 instanceof 类型
运算结果:true 或 false
(2)示例代码
Person类
public class Person{
//方法代码省略...
}
Woman类
public class Woman extends Person{
//方法代码省略...
}
ChineseWoman类
public class ChineseWoman extends Woman{
//方法代码省略...
}
DemoTest类
public class DemoTest{
public static void main(String[] args){
Person p = new Person();
Woman w = new Woman();
ChineseWoman c = new ChineseWoman();
if(p instanceof Woman){//false
}
if(w instanceof Woman){//true
}
if(c instanceof Woman){//true
}
}
}