本节内容:(Object, 多态,instanceof , 重名函数覆盖思想,eclipse小技巧)
Object:Java的类默认 extends Object
为什么?
通过Object 这个父类可以增加一些函数例如finalize来实现垃圾回收等功能.
好处:可以在Vector中v.add(new Cust())即添加对象 ,可以在Vector中强制类型转换.
多态
1:即使父类的引用指向了子类对象,也无法直接调用子类新定义的成员
import java.util.*;
public class Main
{
public static void main(String [] args)
{
A a = new B();
a.print();
}
}
class A{
}
class B extends A
{
void print()
{
System.out.println("HEllo");
}
}
报错:
cannot find symbol
a.print();
2:但可以通过强制类型转换地把父类地引用强制转换成子类地引用,然后进行调用(有可能出错)
import java.util.*;
public class Main
{
public static void main(String [] args)
{
A a = new B();
B tmp = (B) a;
tmp.print();
}
}
class A{
}
class B extends A
{
void print()
{
System.out.println("HEllo");
}
}
输出:HEllo
二元运算符 instance of
instanceof是Java的一个二元操作符,和==,>,<是同一类东东。由于它是由字母组成的,所以也是Java的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据。举个例子:
String s = "I AM an Object!";
boolean isObject = s instanceof Object;
我们声明了一个String对象引用,指向一个String对象,然后用instancof来测试它所指向的对象是否是Object类的一个实例,显然,这是真的,所以返回true,也就是isObject的值为True。
摘用粉丝的代码:
import java.util.*;
public class Main
{
public static void main(String[] args) throws Exception
{
MB mb = new MB();
USB ust = new USt();//父类指向子类的对象
USB mp3 = new MP3();
mb.useUSB(ust);
mb.useUSB(mp3);
}
}
class MB
{
void useUSB(USB usb)//父类的引用指向子类的对象,父类的引用不能直接调用子类新的方法
{
if(usb instanceof USt) {
USt temp = (USt)usb;//强制转化为子类就可以调用新的——间接调用
temp.print2();
}
else
{
MP3 temp = (MP3)usb;
temp.open();
}
}
void print()
{
System.out.println("这是主板");
}
}
class USB
{
void print1()
{
System.out.println("这是USB");
}
}
class USt extends USB//子类
{
void print2()
{
System.out.println("这是USt");
}
}
class MP3 extends USB
{
void open()
{
System.out.println("MP3 open");
}
}
输出:
这是USt
MP3 open
不过一般不用这种方式,而是通过run方法覆盖的方式来避免类型转换.
在此程序中,通过print重名函数覆盖的方式实现向下兼容
package caipiao;
import java.util.*;
import java.util.Vector;
public class caipiao
{
public static void main(String[] args) throws Exception
{
MB mb = new MB();
USB ust = new USt();
USB mp3 = new MP3();
mb.useUSB(ust);
mb.useUSB(mp3);
}
}
class MB
{
void useUSB(USB usb)//父类的引用指向子类的对象,父类的引用不能直接调用子类新的方法
{
usb.print();
}
void print()
{
}
}
class USB
{
void print()
{
System.out.println("这是USB");
}
}
class USt extends USB//子类
{
void print()
{
System.out.println("这是USt");
}
}
class MP3 extends USB
{
void print()
{
System.out.println("MP3 open");
}
}
class MP4 extends USB
{
void print()
{
System.out.println("MP4 open");
}
}
输出:
这是USt
MP3 open
可以发现,我们省去了判断usb 类型的过程,也就是不用instanceof函数啦]
向下兼容亦是如此,像老师所说,如果后续还有MP4,MP5之类横空出世,我们只需要加两行代码,而不需要修改USB
加上class MP4, USB mp4 = new MP4(),mb,useUSB(mp4)就可以完成MP4的添加
package caipiao;
import java.util.*;
import java.util.Vector;
public class caipiao
{
public static void main(String[] args) throws Exception
{
MB mb = new MB();
USB ust = new USt();
USB mp3 = new MP3();
USB mp4 = new MP4();
mb.useUSB(ust);
mb.useUSB(mp3);
mb.useUSB(mp4);
}
}
class MB
{
void useUSB(USB usb)//父类的引用指向子类的对象,父类的引用不能直接调用子类新的方法
{
usb.print();
}
void print()
{
}
}
class USB
{
void print()
{
System.out.println("这是USB");
}
}
class USt extends USB//子类
{
void print()
{
System.out.println("这是USt");
}
}
class MP3 extends USB
{
void print()
{
System.out.println("MP3 open");
}
}
class MP4 extends USB
{
void print()
{
System.out.println("MP4 open");
}
}
输出:
这是USt
MP3 open
MP4 open
###
一些eclipse小技巧(课上)
1:快速定位菜单
window -> show view ->outline
即可出现这个界面,可以快速定位到每一个类以及函数,以进行修改.