学习Java的第十四天-多态

什么是多态
从字面的意思上理解,多态就是多种形态。
同一个动作作用于不同的对象产生不同的行为
多态性指的是什么?多态性,可以理解为一个事物的多种表现形态。在Java中有两种体现:
方法的重载(overload)和重写(overwrite)
子类对象的多态性(可以直接应用在抽象类和接口上)
对象的多态性是什么?:一个对象多种形态;在Java中,子类的对象可以替代父类的对象使用
我们在之后的学习中会经常与多态打交道,比如:IO、集合、JDBC等等。
多态性有两种
编译时多态性
对于多个同名方法,如果在编译时能够确定执行同名方法中的哪一个,则称为编译时多态性。

运行时多态性
如果在编译时不能确定,只能在运行时才能确定执行多个同名方法中的哪一个,则称为运行时多态性。
方法重写和重载的区别
方法重写的规则
在继承关系的子类中
重写的方法名、参数、返回值类型必须与父类相同
私有方法不能继承因而也无法重写
学习Java的第十四天-多态
对象的转型
对象转型分为:
—向上转型
—向下转型
学习Java的第十四天-多态
学习Java的第十四天-多态
instanceof运算符
该运算符用来判断一个对象是否属于一个类或者实现了一个接口,结果为true或false
在强制类型转换之前通过instanceof运算符检查对象的真实类型,可以避免类型转换异常,从而提高代码健壮性
final 关键字
final修饰的类不能被继承。提高安全性,提高程序的可读性。
比如:String类、System类、StringBuffer类
final修饰的方法不能被子类重写。
比如:Object类中的getClass()。
final修饰的属性为常量。一旦初始化后,不可再被赋值。习惯上,常量用大写字符表示。
final标记的成员变量必须在声明的同时或在每个构造方法中或代码块中显式赋值,然后才能使用。
比如:final double PI=3.14;
若变量用static final修饰:全局常量。比如:Math 类的当一个类被final修饰符修饰的时候是无法被继承的
学习Java的第十四天-多态
当父类C的finalMethod方法被final关键字修饰后,其子类D是无法重写finalMethod的
学习Java的第十四天-多态
final修饰的属性为常量,一旦初始化后,不可再被赋值。习惯上,常量用大写字符表示
学习Java的第十四天-多态
static关键字
当我们通过new关键字创建对象的时候,这时系统才会分配内存空间给每个对象,其方法才可以供外部调用。
我们有时候希望无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份。

使用范围:
在Java类中,可用static修饰属性、方法、代码块、内部类

被修饰后的成员具备以下特点:
随着类的加载而加载
优先于对象存在
修饰的成员,被所有对象所共享
访问权限允许时,可不创建对象,直接被类调用
类变量
学习Java的第十四天-多态
创建两个SportsMan对象
SportsMan s1=new SportsMan(“张三”,19,”中国”);
SportsMan s2=new SportsMan (“李四”,19,”中国”);
SportsMan类中的变量nation是一个实例变量,它属于类的每一个对象,不能被同一个类的不同对象所共享。
上例中p1的nation独立于p2的nation ,存储在不同的空间。p1中的radius变化不会影响p2的nation ,反之亦然。
如果想让一个类的所有实例共享数据,就用类变量!

由类创建的所有的对象,都共用这一个属性
当其中一个对象对此属性进行修改,会导致其他对象对此属性的一个调用。
类变量随着类的加载而加载的,而且独一份
静态的变量可以直接通过“类.类变量”的形式来调用
类变量的加载是要早于对象。所以当有对象以后,可以“对象.类变量”使用。但是"类.实例变量"是不行的。
类变量存在于静态域中。
学习Java的第十四天-多态
通常的方法都会涉及到对具体对象的操作。这些方法在调用时,需要隐式的传递对象的引用。没有对象的实例时,可以用类名.方法名()的形式访问static标记的类方法。
在静态方法里只能直接调用同类中其它的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。
静态方法不能以任何方式引用this关键字。因为静态方法在使用前不用创建任何实例对象,当静态方法被调用时,this所引用的对象根本就没有产生。
main() 方法是静态的,因此JVM在执行main方法时不创建main方法所在的类的实例对象,因而在main()方法中,我们不能直接访问该类中的非静态成员。

类属性、类方法的作用
随着类的加载而加载,只加载一次
类属性作为该类各个对象之间共享的变量。
在设计类时,分析哪些类属性不因对象的不同而改变,将这些属性设置为类属性。
如果方法与调用者无关,则这样的方法通常被声明为类方法,由于不需要创建对象就可以调用类方法,从而简化了方法的调用。
静态初始化
一个类中可以使用不包含在任何方法体中的静态代码块。当类被载入时,静态代码块被执行,且只被执行一次。静态块经常用来进行类属性的初始化。
static块通常用于初始化static(类)属性