一、向上转型向下转型
明确引用类型和对象类型的概念
首先要知道那个是引用类型,那个是对象类型
Hero h = new Hero();
有一个对象 new Hero(), 有一个引用 h
引用类型 ----> Hero
向上转型:子类转为父类类型
Zi zi = new Zi();
zi.setSex("男");
zi.setMajor("美容美发");
boolean flag = zi instanceof Fu;
System.out.println(flag);
Fu fu = zi;
//调用了子类中的toString方法
System.out.println(fu);
向下转型:父类转换成子类对象
向下转型的对象,必须使用instanceof关键字进行判断,是否可以向下转型
Fu fu = zi;
//调用了子类中的toString方法
System.out.println(fu);
Fu fu1 = new Student("张无忌",25,"武当山职业技术学院光明顶分校","校长");
System.out.println(fu1);
//Fu f = new Fu("张三丰",101);
//boolean flag2 = f instanceof Zi;
//System.out.println(flag2);//false
//ClassCastException
//抛出表示代码尝试将对象转换为不属于实例的子类
//Zi zi1 = (Zi)f;
//System.out.println(zi1);
if(fu1 instanceof Student){
Student student = (Student)fu1;
System.out.println(student);
}
if(fu1 instanceof Zi){
Zi zi1 = (Zi)fu1;
System.out.println(zi1);
}
三种区别:
Zi zi = new Zi();
1、自己定义的方法
2、从父类中继承过来的方法
3、存在重写,则调用重写之后的方法
Fu fu = new Fu();
只能调用父类自己的方法
Fu fu = new Zi();
1、父类自己的方法
2、如果子类重写了父类的方法,可以调用重写之后的方法
二、抽象类:
使用abstract进行修饰的类
特点:
1、不能够直接使用抽象类创建对象,必须通过子类继承并且实现里面的抽象方法,
再通过子类进行创建对象使用
2、抽象类和抽象方法都需要使用abstract进行修饰,抽象方法必须定义在抽象类中
3、只有实现类父类中所有的抽象方法都被实现之后,子类才能创建对象,否则子类也
要变成一个抽象类
4、抽象类,可以没有抽象方法,但是没有抽象方法的抽象类,没有存在的意义
5、抽象类也可以继承抽象类(单继承,只能继承一个直接的抽象了)
6、抽象类中可以有构造函数,但是无法创建对象
什么情况下定义成抽象
1、当类中有抽象方法的时候
有抽象方法的类是不是抽象类?
抽象类中是否必须有抽象方法?
2、当子类继承一个抽象类的时候,不想实现抽象类中的抽象方法,那么就把子类也变成抽象类
3、当一个类实现一个接口的时候,能不能继承抽象类?
当一个类实现一个接口的时候,不能实现所有的抽象方法
抽象类中能不能有普通的方法
4、抽象方法必须放在抽象类中
抽象类中可以没有抽象方法,但是如果没有的话,抽象类就失去了抽象的意义
抽象类语法
public abstract class 类名{
}
抽象方法语法
没有方法体的方法,abstract和方法体之间只能保留一个
public abstract ({参数列表});
特点:
没有方法体,也没有花括号
不能和
private 私有的,子类无法继承,就无法进行抽象方法的实现
static 静态的方法是属于类的
final 修饰的方法不能被重写
关键字一起使用
什么时候把类定义成一个抽象类?
当不知道一个方法具体的方法实现内容的时候定义成一个抽象方法
抽象方法又必须定义在抽象类中
知道所有的子类中都必须拥有一个方法,但是所有的子类的实现方法都
不同,那么父类提供的方法就失去了意义,那么父类中就提供一个抽象的
方法出来,让子类去实现
1、抽象类一定是一个父类么?
是的,因为抽象类是不断抽取出来,一般把共性的一些子类都有的方法
但是不知道子类具体实现的步骤,要把这些定义在父类中完成抽象方
法的定义
2、抽象类中是否可以不定义抽象方法?
可以,但是这个没有抽象方法的抽象类的意义何在?
就是无法创建对象,方法也无法调用
3、abstract不能和什么一起使用
private
static
final
4、抽象方法:只有方法的声明,没有具体实现的方法
抽象类:有抽象方法的类叫抽象类
基本数据类型的封装类型
在java中8个基本数据类型都有与它对应的封装类型
因为基本数据类型不能调用方法和属性
所以要通过封装类型来访问属性和方法
三、装箱拆箱
byte ---> Byte
short ---> Short
int ---> Integer
long ---> Long
float ---> Float
double ---> Double
char ---> Character
boolean ---> Boolean
3、String转基本类型
除了char类型之外,其余的基本数据类型都符合
封装类型 变量名 = new 封装类型("字符串内容为与对应封装类型格式相同的数据");
还可以通过基本数据类型的封装类型中的parseXXX(String s),将字符串转换为对应类型的数据
Byte 类 static byte parseByte(String s)
将字符串参数解析为带符号的十进制byte
Short 类 static short parseShort(String s)
将字符串参数解析为带符号的十进制short
Integer 类 static int parseInt(String s)
将字符串参数解析为带符号的十进制int
Long 类 static long parseLong(String s)
将字符串参数解析为带符号的十进制Long
Float 类 static float parseFloat(String s)
将字符串参数解析为带符号的十进制Float
Double 类 static double parseDouble(String s)
将字符串参数解析为带符号的十进制Double
Boolean 类 static boolean parseBoolean(String s)
将字符串参数解析为带符号的十进制Boolean
char可以使用String类型中的charAt方法将字符取出来
char c = s.charAt(0);
int < ---- > Integer转换
1、构造方法
int a = 10;
Integer x = new Integer(a);
2、通过Integer类中的一个静态方法valueOf方法
Integer z = Integer.valueOf(a);
自动装箱和自动拆箱
自动装箱 int ----------- valueOf(int n) -------> Integer
自动拆箱 Integer --------- intValue() -----------> int