类的继承
extends为继承关键字,需要继承父类时,
public class 子类类名 extends 父类类名{}//继承关键字使用
Java每个类只能继承一个父类
super是父类的意思super()是使用父类的意思
Object类
对象类型的转换
向上转型
将子类对象赋值给父类引用。自动类型转换。
例子:Animal a=new dog();
向下转型
将父类对象赋值给子类引用,强制类型转换。
例子:Dog a=(Dog)new Animal();
方法的重载
不定长参数
子类重写父类的方法
返回参数相同 方法名相同 传入参数相同 只有方法体不同
传入参数不注重顺序,注重类型!
转型
向上转型:将子类类型的对象转换为父类类型的对象。即把子类对象直接赋值给父类类型的对象。
自动类型转换
Animal a=new Dog();
向下转型:将父类类型的对象转换为子类类型的对象。将父类对象赋值给子类引用。
强制类型转换
Dog a=(Dog)new Animal();
【例题7.5】tom是谁?
使用向上转型模拟如下场景:这里有一个人,他叫tom,他是一名教师
package Seven;
class People1{}
class Teacher extends People1{}
public class Demo3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
People1 tom=new Teacher();
}
}
因为人类(people)是教师类(Teacher)的父类,所以通过向上转型,能够把教师类型的对象(new Teacher();)直接赋值给人类(People)类型的变量(tom)。进行向上转型,父类类型的对象而可以引用子类类型的对象。而且,向上转型是安全的。
【例题7.6】谁是鸽子?
编写代码证明“可以说某只鸽子是一只鸟,却不能说某只鸟是一只鸽子”:鸟类是鸽子类的父类,用Bird表示鸟类,pigeon表示鸽子类。
package Seven;
class Bird{}
class Pigeon extends Bird{}
public class Sevensix {
public static void main(String[] args) {
// TODO Auto-generated method stub
Bird bird=new Pigeon();//某只鸽子是一只鸟
Pigeon pigeon=bird;//某只鸟是一只鸽子
}
}
报错:Type mismatch: cannot convert from Bird to Pigeon
翻译:类型不匹配
截图:
解决方法:强制类型转换
向下转型语法:
子类类型 子类对象 =(子类对象)父类对象;
package Seven;
class Bird{}
class Pigeon extends Bird{}
public class Sevensix {
public static void main(String[] args) {
// TODO Auto-generated method stub
Bird bird=new Pigeon();
Pigeon pigeon=(Pigeon)bird;
}
}
截图:
注意:(1)两个没有继承关系的对象不可以进行向上转型或者向下转型
(2)父类对象可以强制转换为子类对象,但有一个前提:这个父类对象要先引用这个子类对象。
重载
方法名相同 参数不同即为重载
一:返回参数不同
二:传入参数不同
顺序不同,也叫重载
【例题7.8】编写不同形式的加法运算方法
package Seven;
public class OverLoadTest {
public static int add(int a,int b) {//定义一个方法
return a+b;
}
public static double add(double a,double b) {//与第一个方法名相同、参数类型不同
return a+b;
}
public static int add(int a) {//与第一个方法参数个数不同
return a;
}
public static int add(int a,double b) {//先int参数,后double参数
return a;//输出int参数值
}
public static int add(double a,int b) {
return b;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("调用add(int,int)方法:"+add(1,2));
System.out.println("调用add(double,double)方法:"+add(2.1,3.3));
System.out.println("调用add(int)方法:"+add(1));
System.out.println("调用add(int,double)方法:"+add(5,8.0));
System.out.println("调用add(double,int)方法:"+add(5.0,8));
}
}
代码截图如下:
总结:参数类型不同,参数顺序不同,参数个数不同都构成重载
不定长参数方法:
返回值 方法名 (参数数据类型...参数名称)
【例题7.9】使用不定长参数重载加法运算方法
package Seven;
public class OverLoadTest2 {
public static int add(int a,int b) {
return a+b;
}
public static double add(double a,double b) {
return a+b;
}
public static int add(int a) {
return a;
}
public static int add(int a,double b) {
return a;
}
public static int add(double a,int b) {
return b;
}
public static int add(int ...a) {//定义不定长参数方法
int s=0;
for(int i=0;i<a.length;i++) {//根据参数个数做循环操作
s+=a[i];//将每个参数累加
}
return s;//将计算结果返回
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("调用add(int,int)方法:"+add(1,2));
System.out.println("调用add(double,double)方法:"+add(2.1,3.3));
System.out.println("调用add(int)方法:"+add(1));
System.out.println("调用add(int,double)方法:"+add(5,8.0));
System.out.println("调用add(double,int)方法:"+add(5.0,8));
//调用不定长参数放法
System.out.println("调用不定长方法:"+add(1,2,3,4,5,6,7,8,9));
System.out.println("调用不定长方法:"+add(1));
}
}
运行结果及截图如下:
final
final修饰变量——常量
final修饰方法——该方法不可以被重写
final修饰类——不可以被继承
package Seven;
public class FinalData {
static final double PI=3.1415926;
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("圆周率的值为:"+PI);
System.out.println("半径为·3的圆的周长为:"+(2*3*PI));
//尝试修改PI的值
PI=3.1415927;
}
}
package Seven;
class Dad {
public final void trunOnTheTv() {
System.out.println("爸爸打开了电视");
}
}
class Baby extends Dad{
public final void trunOnTheTv() {
System.out.println("宝宝也要打开电视");
}
}
如上述代码则报错:Cannot override the final method from Dad
翻译:无法覆盖爸爸的最终方法
截图如下:
instanceof关键字
用于判断父类对象是否为子类对象的实例。还可以判断一个类是否实现了某个接口
【例题7.7】分析几何图形之间的继承关系
package Seven;
class Quedrangle{}//四边形类
class Square extends Quedrangle{}//正方形类继承四边形类
class Circular{};
public class Demo5 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Quedrangle q=new Quedrangle();//四边形对象
Square s=new Square();//正方形对象
System.out.println(q instanceof Square);//判断四边形是否为正方形的子类
System.out.println(s instanceof Quedrangle);//判断正方形是否为四边形的子类
System.out.println(q instanceof Circular);//判断正方形是否为圆形的子类
}
}
因为无法判断正方形为圆形的子类所以报错:Incompatible conditional operand types Quedrangle and Circular
翻译:不兼容的条件操作数类型 Quedrangle 和 Circular
去除最后一行代码,代码截图如下:
多态
利用多态可以使程序具有良好的扩展性,并可以对所有类对象进行通用的处理。
【例题7.12】
package six;
class Shape{}//图形类
class Square extends Shape{}//正方形继承图形类
class Circular extends Shape{}//圆形类继承图形类
public class Demo6 {
public static void draw(Shape s) {//绘制方法
if(s instanceof Square) {//如果是正方形
System.out.println("绘制正方形");
}
else if(s instanceof Circular) {//如果是圆形
System.out.println("绘制图形");
}
else {//如果是其他图形
System.out.println("绘制父类图形");
}
}
public static void main(String[] args) {
draw(new Shape());//调用draw方法判断Shape为什么图形
draw(new Square());
draw(new Circular());
}
}