本帖最后由 杨兴庭 于 2013-7-8 12:32 编辑
看见有人问过这些问题,将自己原来写过的程序发给大家看一下
/*
2013/5/16 0:38:21
抽象类和多态的应用:
1、当定义的一个抽象类时,应在其class前面添加abstract(抽象),
在其内也需要添加abstract。
2、抽象的应用:当你点击一个菜单,菜单就相当予一个抽象类,它
不执行任何一个东西,但菜单中得子项,也就是它的子类可以可
以执行其下的命令。
3、抽象和多态的应用:抽象表示为一个动得含义,但其没有任何动
的命令去执行,这样就是抽象类,但其下面的子类,如人、鱼、
猫、等只需要用到多态的特性,将子类赋给基类,基类调用子类
继承来得动这个函数,就能实现人、鱼、猫、三者的动得命令。
*/
abstract class A
{
abstract public void f()
}
class B extends A
{
public void f()
{
System.out.printf("BBBB\n");
}
}
public class TestAbsPoly_1
{
public static void main(String[] args)
{
B bb = new B();
bb.f();
//A aa = new A();//error
A aa;//可以定义一个抽象类的引用,但是不能定义
aa = bb;
aa.f();
}
}
/*
2013/5/15 23:09:36
1、在多态中已经证明,可以将子类的地址赋给基类,此时
基类就可以去调用子类中得函数,但这个函数不是子类特
有地函数,是从基类继承来得函数,或者对从基类中继承
的继承的函数的重写函数(下面是对其的解释)。
2、基类如果通过这种多态的特性,可以调用子类的特有函数
时,此时子类函数的安全性,已经不存在,同时也会造成
程序的混乱。
3、 因为有多态我们可以将子类的地址赋给基类,但又因为
多态的特性而不能允许,基类去调用基类特有函数,这种
也是多态的一种特性。
*/
class A
{
public void f()
{
System.out.printf("AAAA\n");
}
}
class B extends A
{
public void f()
{
System.out.printf("BBBB\n");
}
public void g()
{
System.out.printf("GGGG\n");
}
}
public clsaa Test_A
{
public static void main(String[] args)
{
A aa = new A;
B bb = new B;
aa = bb;
aa.g();//错误写法,语法不错误
}
}
/*
2013/5/15 22:47:55
1 、在子类可以转化为父类(aa = bb),但这里是将bb中得地址赋给aa,
aa就可以调用bb中得值
2 、不可以将(bb = aa ),因为基类是一个一般值,不是特殊值,而子
类是一个特殊值,即特殊值可以转化成为一般值,也就表明在一个类
组中子类可以变为基类。(*-*但此处应记住有一个特殊情况)
3 、在第2项中也说明不能将基类赋给子类,但又以个特殊例子,先进行
aa = bb; 在写bb = (B)aa,因其在执行父类转化子类之前,已将
将子类的地址发给基类,此时基类aa代表子类,所以可以正常进行,
(*-*但为什么上面已经将子类地址发送给基类,还要在后面加强制,
转化呢?
---一种解释:java语法对这种语言不支持,
二中解释:防止程序员在不明白其中原理情况下,进行的未知性操作)。
*/
class A
{
public void f()
{
System.out.printf("AAAA\n");
}
}
class B extends A
{
public void f()
{
System.out.printf("BBBB\n");
}
}
public class Test_B
{
public static void main(String[] args)
{
A aa = new A();
B bb = new B();
bb.f();
aa.f();
aa = bb;
bb = (B)bb;
bb.f();
}
}
|