目录
多态
基于封装,继承
分类
编译时多态--已检查多态
方法重载--在编译时可以根据方法的参数列表来确定调用哪一个重载之后的方法运行时多态
运行时多态--未检查多态
向上造型--
将子类对象赋值给父类类型的引用
例如
Animal animal = new Dog();//Animal是父类,Dog是Animal的子类
特点
编译看左边,运行看右边
向下造型
强制类型转换
格式
(要强转的类型)变量
Person p = new Person();
Student stu = (Student)p;
注意
如果变量和要强转的类型之间存在继承关系 编译可能不报错,但是如果变量本质上不是要强转的类型的对象,运行会抛出异常
ClassCastException--类强制转换异常
如果编译时检查到变量和要强转的类型之间没有任何继承关系,编译直接报错
多态的案例
类Pet 父类
属性: name age
方法: 陪伴
类Dog Cat
1*向上造型
类 Teacher
属性 name
Teacher t = new Teacher();
t.setName("lsp");
Cat cat = new Cat();
cat.setName("xiaomao");
cat.setAge(2);
t.setPet(cat);//向上造型
System.out.println(t.getPet().getName());
无论对象是谁,都可以赋值给父类类型的属性
2*向上造型 使用父类类型作为方法的参数数据类型 参数实际赋值是子类对象
类 PetShop 宠物商店
属性 name
方法 进货 参数
3*向上造型 使用父类类型作为方法的返回值数据类型 实际返回的是子类对象
PetShop 宠物商店
方法 卖宠物 sell
4*使用父类类型作为数组元素的类型 实际存储的是子类类型
instanceof --判断变量是否是指定类型的对象, 是结果为true,否结果为false
格式:
变量名 instanceof 类名
例如
pet instanceof Dog
判断pet变量是否为Dog类型的变量
方法重写五大原则:
反证
1*子类方法的权限修饰符必须大于或等于父类方法的权限修饰符
假设: 子类方法的权限修饰符小于父类方法的权限修饰符
classFather{
public void method(){}
}
class Son extends Father{
pricate void method(){}
}
main{
Father f = new Son();
f.method();
}
2*如果父类方法的返回值类型为引用数据类型,则子类中重谢的方法返回值数据类型小于或等于父类的返回值类型
假设: 子类返回值类型大于父类返回值类型
class Animal{}
class Dog extends Animal
classFather{
public Dog method(){}
}
class Son extends Father{
pricate Animal method(){}
}
main{
Father f = new Son();//向上造型
Dog dog = f.method();//编译检查Father类中的method方法类型能否赋值给Dog dog
}
特点:
1*灵活
2*可扩展行
3*代码复用性
static关键字
应用位置:
static修饰成员属性--静态属性 类属性
static修饰成员方法--静态方法 类方法
static修饰代码块 --静态代码块
static修饰内部类 --内部类讲解
静态属性:
场景
当属性与对象无关,和类相关时,可以选择用static修饰该属性--静态属性 类属性
特点
一旦队友对象改变了静态属性的值,则其他对象的值也会被改变
使用
建议:
类名.静态属性
不建议:
对象.静态属性
静态方法:
static修饰方法
场景:
无需创建对象就可以调用方法,可以使用static修饰该方法
使用:
建议:
类名.静态方法
不建议:
对象.静态方法
注意:
静态方法也是需要调用才会执行
非静态的属性和方法必须都要通过对象调用
静态方法无法直接调用非静态方法
静态方法随着类加载时加载到静态区
非静态方法随着创建类的对象加载到堆中
静态方法中不能定义静态变量
静态方法是可以重载的
静态方法不能重写 ,虽然不允许重写,但是允许子类中存在和父类一模一样的静态方法
案例:
Arrays.toString
实际开发中,静态方法多常见于工具类中
静态代码块
格式
static{
}
位置
类中方法外
执行
当创建对象时
通过类调用静态属性
通过类调用静态方法
静态代码块只执行一次
场景
在静态代码块中读取项目的配置文件
执行顺序
1*单个类 静态代码块 构造代码块 构造方法
先静态,后非静态
2*子父类 静态代码块 构造代码块 构造方法
先静态 后非静态 先父后子
Java内存
java内存被划分为以下几大部分
栈内存 :方法执行在栈内存开辟空间
堆内存:new出来的对象
方法区:静态区
本地方法栈:native修饰的方法
寄存器(程序计数器): 指定下一步要执行的程序