java上转型对象抽象类_java-上转型对象&抽象类-学习记录

上转型对象:

如果B类是A类的子类(或间接子类),当用子类创建对象b并将这个对象的引用放到父类对象a中时,如:

A a;

a = new b()

A a;

B b = new B();

a = b;

则称a是b的上转型对象。

对象b的上转型a的实体是有子类B创建的,但是上转型对象会失去子类B的一些属性和功能。

上转型对象具有以下特点

上转型对象不能操作子类新增加的成员变量,不能使用子类新增的方法。即为较子类B失去一些属性和功能,这些属性和功能是新增的。

上转型对象可以操作子类继承或隐藏的成员变量,也可以使用子类继承的或重写的方法。即为上转型对象可以操纵父类原有的属性和功能,无论这些方法是否被重写。

上转型对象调用方法时,就是调用子类继承和重写过的方法。而不会是新增的方法,也不是父类原有的方法。

可以将对象的上转型对象再强制转换到一个子类对象,强制转换过的对象具有子类所有属性和功能。

注意:

1.不可以将父类对象引用赋给子类。

2.如果子类重写了父类的静态方法(static),那么子类对象的上转型对象不能调用子类重写的静态方法,只能调用父类的静态方法。

抽象类:

用关键字abstract修饰的类称为抽象类,如:

abstract class A{

...

}

用关键字abstract修饰的方法称为抽象方法,如:

abstract int way (int x , int y);

对于抽象方法,只能声明不能实现。且不能同时和 final修饰同一个方法或类,也不能用 static修饰 abstract 方法。

意义:

抽象类可以抽象出重要的行为标准(用抽象方法表示)。即抽象类封装了子类必须有的行为标准,而标准的具体行为在子类中实现。

注意:

1,抽象类中可以有构造方法及非抽象方法。

2,子类必须全部覆写抽象类中的全部抽象方法

3.抽象类不能用new创建对象

4,abstract类的对象作为上转型对象

//========================================例题

要求有一个abstract类,类名为Student。Student的子类有Genstudent、Outstudent。学生的共同属性是,学号,姓名,年龄。共同行为是吃饭。有差异的行为是学习。

有一个School类,该类用Student对象数组作为成员,Student对象数组的单元可以是Genstudent对象的上转型对象、Outstudent对象的上转型对象。

编写测试类进行测试School对象中所有学生名单显示。

abstract class Student

{

int num,age;

String name;

public String nomal_act()//非抽象方法,可以实现

{

return"学号 :"+num+" 姓名 :"+name+" 年龄 :"+age+" n 共同行为:吃饭 ";

}

public abstract String deffer_act();//抽象方法,不可以实现

}

class Genstudent extends Student

{

public Genstudent(int num,int age,String name)

{

super.num = num;

super.age = age;

super.name = name;

}

public String deffer_act()

{

return" n 差异性为:努力学习";

}

}

class Outstudent extends Student

{

public Outstudent(int num,int age,String name)

{

super.num = num;

super.age = age;

super.name = name;

}

public String deffer_act()

{

return" n 差异性为:不学习";

}

}

class School

{

String inform;

public void set_inform(Student stu)//设置信息

{

inform = stu.nomal_act()+stu.deffer_act();

}

public void Show_inform()//输出信息

{

System.out.println(inform);

}

}

public class Test

{

public static void main(String args[])

{

int person = 0;//学生信息数量,默认为0

Scanner input = new Scanner (System.in);//创建一个键盘扫描类对象

School[] school = new School[3];//创立数组对象

Student stu ;//不能用 new创建对象

System.out.println("================================录入信息==============================");

System.out.println("输入要录入学生信息数目");

person = input.nextInt();

for(int i = 0;i< person;i++)

{

school[i] = new School();// school[i]实例化,没有会报错

System.out.println("输入学号,名字,年龄,以及是否好学(Y/N)?");

int num = input.nextInt();

String name = input.next();

int age = input.nextInt();

String act= input.next();

stu =new Outstudent(num,age,name);//避免 stu未实例化

if(act.equals("Y")){ stu =new Genstudent(num,age,name);}//差异行为判断

school[i].set_inform(stu);

}

System.out.println("=================================信息表===============================");

for(int i = 0;i< person ;i++)

{

school[i].Show_inform();

}

}

}

//最近在学Java想把进程记录下来,要是有错。。告诉我就好,不要骂我,会哭的哦。

内容来源于网络如有侵权请私信删除

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值