java学习笔记(六)----对象的类型转换, 匿名内置类
2006-05-31 12:49
866 查看
对象的类型转换
-- 子类对象可以自动转换成父类
-- 父类转换成子类必须使用强制转换
-- 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());
-- 子类对象可以自动转换成父类
-- 父类转换成子类必须使用强制转换
-- 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());
相关文章推荐
- [原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),property节点,在hibernate 中 java类型 与sql类型之间的对应关系,Java 时间和日期类型的映射,Java 大对象类型 的 映射 (了解),映射组成关系
- 自学Java系列 笔记5 Java学习之匿名对象
- Java 学习笔记(0x01) 数据类型转换
- C#特性 学习笔记(对象初始化器 匿名类型 扩展方法)
- JAVA学习笔记3--类,对象,变量,方法,构造方法,this,引用类型
- 【JavaWeb】JSP学习笔记(一)环境|目录|JSP基础语法|内置对象
- java学习笔记(2)基本数据类型对象包装类
- [javase学习笔记]-6.5 类类型参数与匿名对象
- Java框架spring 学习笔记(八):注入对象类型属性
- Java基础学习笔记十 Java基础语法之final、static、匿名对象、内部类
- java中string 类型的对象间比较的学习笔记
- xStream 学习笔记 - Java对象与XML相互转换简单示例
- 学习笔记:DataTables之数据读取和操作(java对象转换为json对象)
- C#学习笔记--引用类型分类,对象类型、字符串类型、数字类型,类型转换
- Java学习笔记二十六:Java多态中的引用类型转换
- (25)Java学习笔记——常用对象API / 基本类型包装类
- Java学习笔记8. 数据类型的转换
- Java学习笔记一:基本语法:类和对象的介绍、数组、引用类型
- Core Java 学习笔记——2.基本数据类型&类型转换
- Java之学习笔记(20)-----------类型转换