欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-25 15:54:32
上转型对象: 如果B类是A类的子类(或间接子类),当用子类创建对象b并将这个对象的引用放到父类对象a中时,如: A a; a = new b() 或 A a;B b = new B();a = b; 则称a是b的上转型对象。 对象b的上转型a的实体是有子类B创建的,但是上转型对象会失去子类B的一些属 ......

上转型对象:

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

a a;
a = new b()
a a;
b b = new b();
a = b;
则称a是b的上转型对象。

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

上转型对象具有以下特点

  1. 上转型对象不能操作子类新增加的成员变量,不能使用子类新增的方法。即为较子类b失去一些属性和功能,这些属性和功能是新增的。
  2. 上转型对象可以操作子类继承或隐藏的成员变量,也可以使用子类继承的或重写的方法。即为上转型对象可以操纵父类原有的属性和功能,无论这些方法是否被重写。
  3. 上转型对象调用方法时,就是调用子类继承和重写过的方法。而不会是新增的方法,也不是父类原有的方法。
  4. 可以将对象的上转型对象再强制转换到一个子类对象,强制转换过的对象具有子类所有属性和功能。

注意:

         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想把进程记录下来,要是有错。。告诉我就好,不要骂我,会哭的哦。