一:final关键字
final最终,可以修饰类,属性,方法
final 修饰类,类不能被继承
final 修饰属性,属性就变成了常量
final 修饰方法,方法就不能被重写
常量:不能被重新赋值,命名全大写。
二:static
static 静态修饰符
1.静态修饰属性和方法
2.一旦修饰属性和方法就变成了类属性,类方法
3.被static修饰的属性和方法随着类加载而初始化
4.且被static修饰的属性和方法在内存中只有一份,被所有该类对象共享
5.静态的属性和方法不会随着创建对象进堆中,就存在于静态域。
以前每次创建对象,每次都有属于自己的属性,这些属性叫对象属性,现在static修饰了属性和方法后,这属性和方法不再属于某个对象,还是属于类,称为类属性类方法。
三:语法应用
静态修饰的属性和方法建议直接通过类名调用。
因为,静态的属性和方法随着类的加载就已经出现在内存中,并初始化成功,意味着就可以使用了,就没必要再通过创建对象取调用,这样反而耽误时间空间。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7uceFcVS-1676507095883)(D:\前锋学习笔记\笔记\image-20230215111410099.png)]
练习的时候:将一些测试方法都定义成static方便调用
static方法只能调用静态方法和静态属性
因为:静态修饰的属性和方法随着类的加载就已经出现在内存中,并初始化成功,而对象属性对象方法(非静态属性和非静态方法)是需要创建像才会出现
总结:静态只能调用静态
非静态方法能调用静态方法和属性。
静态方法内不能调用this
总结
到底什么时候用static?
-
main方法方便调用其他方法时,将其他方法定义成静态
-
当有些数据必须共享时,就需要使用static。
四 多态
程序中的多态:某个方法的多种形态,同一个方法,执行时会出现不同的效果
多态形成的前提条件:
1.有继承关系(或者实现接口)。
2.子类重写父类方法。
3.父类引用指向子类对象,也叫向上转型。
编译看父类,运行看子类。
父类引用父类,运行看子类
public class Animal {
String name;
public void eat(){
System.out.println("动物吃");
}
}
class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗吃骨头");
}
}
class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
class test{
public static void main(String[] args) {
Animal animal = new Dog(); // 子类向上转型,父类引用子类
animal.eat();
animal = new Cat();
animal.eat();
}
}
五 :向上转型&向下转型
向上转型:父类引用子类的对象,子类对象向上转型成了父类
向下转型:父类引用向下转型成子类默认不允许需要强制转换来完成
Dog dog = (Dog) animal;
什么时候需要向下转型? 当需要调用子类特有的方法时,就需要将父类引用向下转型成子类对象,才可以有子类特有的方法。
总结:
大部分多态的使用场景就是将方法的参数列表设计成父类类型,调用方法时传入子类类型,运行得到子类的效果。
package com.poly;
public class Bulb {
// 发光的方法
public void shine(){
System.out.println("会发光!!!");
}
}
// 红色
class red_bulb extends Bulb{
@Override
public void shine() {
System.out.println("开红灯");
System.out.println("红灯亮");
System.out.println("发红光");
}
}
// 绿灯
class green_bulb extends Bulb{
@Override
public void shine() {
System.out.println("开绿灯");
System.out.println("绿灯亮");
System.out.println("发绿光");
}
}
class TableLamp{
public static void main(String[] args) {
fg(new green_bulb());
fg(new red_bulb());
}
public static void fg(Bulb bulb){
if (bulb instanceof green_bulb){
new green_bulb().shine();
}else if (bulb instanceof red_bulb){
new red_bulb().shine();
}
}
}