概述
多态性:编译时类型与运行时类型不一致导致,相同类型变量调用同一个方法时出现多种行为特征
多态情况下,能调用的方法仅看声明类所定义的方法
编译时类型=声明类型
package practice;
import java.util.*;
class BaseClass{
public int book=6;
public void base() {
System.out.println("父类的普通方法");
}
public void test() {
System.out.println("父类被覆盖的方法");
}
}
public class Main extends BaseClass{
public String book="轻量级";
public void test() {
System.out.println("子类覆盖父类的方法");
}
public void sub() {
System.out.println("子类的普通方法");
}
public static void main(String[] args) {
BaseClass sc=new BaseClass();
System.out.println(sc.book);//6
sc.test();//父类被覆盖的方法
sc.base();//父类的普通方法
Main bc=new Main();
System.out.println(bc.book);//轻量级
bc.test();//子类覆盖父类的方法
bc.base();//父类的普通方法
bc.sub();//子类的普通方法
BaseClass p=new Main();//子类对象直接赋给父类引用变量
//运行该类对象时其**方法行为**总是表现出子类方法的行为特征
System.out.println(p.book);//6,这个是变量不属于方法行为
p.test();//子类覆盖父类的方法
p.base();//父类的普通方法
//如何在这里用p调用sub???
}
}
对于上面这个程序:
base()方法只有父类有,且没有发生过任何改动,所以输出时均是父类的普通方法
test()如果创建实例时的运行时类型为父类则输出父类test,如果运行时类型是子类则输出子类test【多态现象】
book不属于方法行为,实例变量不具有多态性
子类是一种特殊的父类,允许子类对象直接赋给父类引用变量,无需转换(即向上转型,由系统自动完成)
引用变量的强制类型转换
1、基本类型之间的转换只能在数值类之间转换,数值类型与布尔值不能转换
2、引用类型的转换只能在具有继承关系的两个关系之间进行
(若想把父类实例转换成子类实例,则该实例事实上是子类才行:编译时是父类,运行时是子类)
package practice;
import java.util.*;
public class Main{
public static void main(String[] args) {
double d=13.4;
long l=(long) d;
System.out.println(l);
int in=5;
//boolean b=(boolean) in;会显示错误
Object obj="Hello";
String objstr=(String) obj;
System.out.println(objstr);
Object obj2=new Integer(5);//该变量实际类型是Integer
String str=(String) obj2;//会报错,因为obj2现在是Integer类型不与String有继承关系
}
}
instanceof运算符判断是否能进行强制转换
对比的是编译类型和要转换的类
if(obj2 instanceof String)//引用类型变量 instanceof 类
{
String str=(String) obj2;
}
package practice;
import java.util.*;
public class Main{
public static void main(String[] args){
Object hello="Hello";
System.out.println(hello instanceof Object);//T
System.out.println(hello instanceof String);//T
System.out.println(hello instanceof Math);//F
System.out.println(hello instanceof Comparable);//T
String a="Hello";
System.out.println(hello instanceof Math);//F
}
}
初始化块
1、初始化块修饰符只能是static,被称为静态初始化块
2、系统先执行类里定义的初始化块
3、在构造器之前隐形执行
普通初始化块按顺序执行语句
package practice;
import java.util.*;
public class Main{
{
a=6;
}
int a=9;
public static void main(String[] args) {
System.out.println(new Main().a);//输出9 }
}
初始化块与构造器
初始化块是固定的不能引入其他数
静态初始化块
普通初始化块对类对象进行初始化,静态初始化块对类进行初始化,所以优先于普通初始化块执行
对类变量进行初始化,不能对实例变量进行初始化
package practice;
import java.util.*;
class Root{
static {
System.out.println("Root的静态初始化块");
}
{
System.out.println("Root的普通初始化块");
}
public Root(){
System.out.println("Root的构造器");
}
}
class Mid extends Root{
static {
System.out.println("Mid的静态初始化块");
}
{
System.out.println("Mid的普通初始化块");
}
public Mid(){
System.out.println("Mid无参数的构造器");
}
public Mid(String mg) {
this();
System.out.println("Mid有参数构造器"+mg);
}
}
class Leaf extends Mid{
static {
System.out.println("Leaf的静态初始化块");
}
{
System.out.println("Leaf的普通初始化块");
}
public Leaf() {
super("fengkuang");
System.out.println("Leaf的构造器");
}
}
public class Main{
public static void main(String[] args) {
new Leaf();
new Leaf();
}
}
Root的静态初始化块
Mid的静态初始化块
Leaf的静态初始化块
Root的普通初始化块
Root的构造器
Mid的普通初始化块
Mid无参数的构造器
Mid有参数构造器fengkuang
Leaf的普通初始化块
Leaf的构造器
Root的普通初始化块
Root的构造器
Mid的普通初始化块
Mid无参数的构造器
Mid有参数构造器fengkuang
Leaf的普通初始化块
Leaf的构造器
最后
以上就是合适白云为你收集整理的Java4 2021.6.26的全部内容,希望文章能够帮你解决Java4 2021.6.26所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复