java学习笔记(六)----对象的类型转换, 匿名内置类

原创 2006年05月31日 12:49:00


对象的类型转换
--  子类对象可以自动转换成父类
--  父类转换成子类必须使用强制转换
--  instanceof操作符可以用它来判一个实例对象是否属于一个类。

class A
{ public void func1()
  {  System.out.println("A func1 is calling") }
  public void func2()
   { func1(); }
}

class B extens A
{ public void func1()
  { System.out.println("B func1 is calling");}
  public void func3()
  { System.out.println("B func3 is calling");}
}
class C
{   public static void main(String[] args)
   { B.b=new B();
     callA(b);  //编译器可以自动将子类转换为父类
     A.a=b;   //可以使父类对象等于子类对象
     callA(new B());// 编译器可以自动将子类转换为父类
   }
   public static void callA(A a) //子类对象可以自动转换成父类
   { a.func1();
     a.func2();
     a.func3(); //如果加这个方法的话,编译就出错了,因为传进来的虽然是类B,但接收数据的是类A,类A中不包含func3的方法
                //如果将以上callA(A a)中的代码改为B b=a; b.func1(); b.func2(); b.func3(),这样的话就出错了,因为,这样的话编译就认为是把A类对象给了B类对象,但是A类中没有func3的方法,所以编译出错了。但可以把 B b=a; 改为B b=(B)a; 用强制类型转换,这样就没错了,
在这个基础上,  B b=(B)a;
             b.func1();
             b.func2();
             b.func3();
            如果把main函数中的callA(new B())改为callA(new A())结果就错了,但在编译时没错,是在运行时错的,因为编译时,B b=(B)a;欺骗了编译器,没有语法错误,而在A类中没有func3(),所以是在运行时错了。    
   
    为了解决上面的所有问题,可以将这个方法中的所有代码,改为以下的代码:
        if(a instanceof B)   //如果对象a确实是一个类B的对象,就执行下面的语句
          { B b=(B)a;       //instanceof 判断一个对象是否是某一个类的实例
             b.func1();
             b.func2();
             b.func3();
           }
        else
         {a.func1();  //否则就不进行转换
          a.func2();
         }
                            
     }

 

equals方法,

class Student
{ private String name;
  private int age;
  public Student(String name,int age)
  { this.name=name;
    this.age=age;
  }
  public boolean equals(object obj)  //如果不加这个方法,下面的Student对象即使里面的内容都一样输出的也是not equals, 因为它们不是相同的对象,但是加上这个方法后,就可以判断这两个对象中的内容是否相等。
  {  Student st=null;
     if (obj instanceof Student)
     {  st=(Student)obj;
        if (st.name=name && st.age=age)
          return true;
        else
          return false;
      }
      else
          return false;
  }
  public static void main(String[] args)
  { Student st1=new Student("zhangshan",20);
    Student st2=new Student("wangwu",20);
    if(st1.equals(st2))
        System.out.println("equals");
    else
        System.out.println("not equals");
  }

 

接口的应用    匿名内置类
interface PCI
{ void start();
  void stop();
}
class NetWorkCard implements PCI
{ public void start()
  { System.out.println("Send...");}
  public void stop()
  { System.out.println("Stop...");}
}
class SoundCard implements PCI
{ public void start()
  { System.out.println("du..du");}
  public void stop()
  { System.out.println("sound stop"); }
}
class MainBoard
{ public void usePCIcard(PCI p)
  {  p.start();
     p.stop();
  }
}
class Bb
{ public static void main(String[] args)
  {  MainBoard mb=new MainBoard();
     NetWorkCard nc=new NetWorkCard();
     SoundCard sc=new SoundCard();
     mb.usePCIcard(nc);
     mb.usePCIcard(sc);
    
     mb.usePCIcard(new PCI())         //匿名内置类  (这里的new PIC()是建立一个PCI的子类对象)
        { public void start()
           { System.out.println("text start");}
          public void stop()
           { System.out.println("text stop");}
         });
    }
}
  以上的内置类可以写成下面型式
  class A implements PCI
  { public void start()
    { System.out.println("text start");}
    public void stop()
     { System.out.println("text stop");}
   }
   mb.usePCICard(new A());

匿名类部类

public static void main(String[] args) { A.B.Method();//静态方法直接访问 new A.B().Method2();//创建内嵌类的对象访...
  • Liaq325
  • Liaq325
  • 2013年02月04日 21:49
  • 600

内部链接和外部链接以及const对象在头文件中的若干问题

首先我们看一段示例代码: t1.h #ifndef T1_H_ #define T1_H_ #include "t2.h" #ifndef HHH #define HHH int da = 5;...
  • u014728341
  • u014728341
  • 2014年09月16日 08:54
  • 1073

对象锁或内部锁

1.理解synchronized首先需要明确以下概念: 什么是监视器:this,或者someclass.class。 什么是对象锁:this可以看做是java.lang.object的实例...
  • xinhai657
  • xinhai657
  • 2015年09月10日 18:55
  • 423

Java —— 对象类型转换和instanceof函数

说实话真的挺绕的。。。 /* * * 一个子类对象的类型可以向上转换成父类类型,即子类对象可以当作父类对象使用 * 这种转换是安全的,叫做自动类型转换 * 而一个父类对象类型一般是...
  • sxtopc
  • sxtopc
  • 2017年03月20日 17:19
  • 438

Spring AOP不拦截从对象内部调用的方法原因

拦截器的实现原理很简单,就是动态代理,实现AOP机制。当外部调用被拦截bean的拦截方法时,可以选择在拦截之前或者之后等条件执行拦截方法之外的逻辑,比如特殊权限验证,参数修正等操作。   但是最...
  • hao_yunfeng
  • hao_yunfeng
  • 2016年04月29日 10:27
  • 186

C# 在while循环中new的对象

一:   问:那每次循环都会new一个A?那内存不是会满吗?还是说要把这个初始化对象的动作放到循环外面的写法会比较好? 1 2 3 4 ...
  • lbc2100
  • lbc2100
  • 2017年12月26日 12:05
  • 12

【JavaScript】封装对象与强制类型转换

认识封装对象 在开始之前,我们先看一个例子,以便之后更轻松的理解封装对象的概念。"tick".toUpperCase //function toUpperCase() String....
  • hj7jay
  • hj7jay
  • 2017年04月19日 09:25
  • 521

Java对象类型转换的四个经验

一、向上转型与向下转型。 对象类型的转换在Java语言平台中经常遇到,主要包括向上转型与向下转型操作。程序开发人员需要熟练掌握这两个转型的方法以及其中容易出错的地方。如何来了解这两个转型的区别呢...
  • u014316462
  • u014316462
  • 2015年10月26日 21:37
  • 842

C# 对象类型的转化

is关键字: 可以检查对象是否与特定的类型兼容,可以用它来判断对象是否为给定的类型。 定义格式为  operand is type 在上述定义中,当type是一个类,而operand也是该类型,或继承...
  • yeshanghuazang
  • yeshanghuazang
  • 2015年11月23日 15:01
  • 340

Hibernate Session操纵的对象状态转换图

Session 的 save() 方法 Session 的 save() 方法使一个临时对象转变为持久化对象 Session 的 save() 方法完成以下操作: 把 News 对象加入到 ...
  • u013510614
  • u013510614
  • 2016年01月16日 14:29
  • 391
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java学习笔记(六)----对象的类型转换, 匿名内置类
举报原因:
原因补充:

(最多只允许输入30个字)