------- android培训、java培训、期待与您交流! ----------
多态
1.多态:事物存在的多种体现形态。
2.多态的体现:父类或者是接口的引用,指向自己的子类对象
父类 f= new 子类();
3.多态的好处和弊端
好处:代码的复用性提高,扩展性增强,后期维护性增强,代码量也减少
弊端:只能访问父类中具备的方法,不可以访问子类中特有的方法。
4.多态的前提
必须是类与类之间有关系。要么继承,要么实现;通常会存在覆盖。
5.例:Animal a=new Cat();//向上转型,类型提升
Cat c=(Cat)a;//向下转型
能转换的是父类的引用指向了自己的子类对象时,该引用可以被提升,也可以被强制转换。
在多态中,自始至终都是子类对象在做着类型的变化。
例如.
class毕姥爷{
void 讲课(){
System.out.println("企业管理");
}
void 钓鱼(){
System.out.println("钓鱼");
}
}
class 毕老师 extends 毕姥爷{
void 讲课(){
System.out.println("JAVA");
}
void 看电影(){
System.out.println("看电影");
}
}
class {
public static void main(String[] args) {
毕姥爷x = new毕老师(); //毕老师对象被提升为了毕姥爷类型。
// x.讲课();
// x.看电影(); //错误.
毕老师y = (毕老师)x; //将毕姥爷类型强制转换成毕老师类型。
y.看电影();//在多态中,自始自终都是子类对象在做着类型的变化。
}
}
6.如何判断对象是哪一个具体的子类类型呢?
可以通过一个关键字instanceof;
格式:对象 intanceof类型(类类型接口类型)
7.在多态中,成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。
8.在多态中,成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)。
9.在多态中,静态成员函数的特点:
无论编译和运行,都参考做左边。
例子:
class Fu
{
static intnum = 5;
voidmethod1()
{
System.out.println("fumethod_1");
}
voidmethod2()
{
System.out.println("fumethod_2");
}
staticvoid method4()
{
System.out.println("fumethod_4");
}
}
class Zi extends Fu
{
static intnum = 8;
voidmethod1()
{
System.out.println("zimethod_1");
}
voidmethod3()
{
System.out.println("zimethod_3");
}
staticvoid method4()
{
System.out.println("zimethod_4");
}
}
class DuoTaiDemo4
{
publicstatic void main(String[] args)
{
Fuf = new Zi();
System.out.println(f.num);
Ziz = new Zi();
System.out.println(z.num);
f.method1();//覆盖
f.method2();//继承
f.method3();//编译不通过
例如:
class A {
public int i= 10;
}
class Bextends A{
public int i= 20;
}
public classTest{
publicstatic void main(String args[]){
B b = newB();
A a =b;
System.out.println(b.i);
System.out.println(a.i);
}
}
Object类
1.Object是所有类的直接或者间接父类,传说中的上帝。
该类中定义的是所有对象都具备的功能。
2.== 与equals的区别
1). “==”是比较运算符,“equals”是Object定义的方法
2). “==”在基本数据类型中比较的是基本数据类型的具体数值。而“==”在引用数据类型中比较的是对象的地址值。
3). boolean equals(Objectobj)方法,在Object类中是比较对象的地址值。日后开发要覆盖equals方法,建立对象自己独特的比较形式。
例子:
public boolean equals(Object obj){
if(!(obj instanceof Person))
return false;
Person p = (Person)obj;
return this.age == p.age;
}
例子:
Integer a = new Integer(55);
Integer b = new Integer(55);
Integer c = 55;
Integer d = 55;
Integer e = 155;
Integer f = 155;
System.out.println(a==b);//false
//这里比较的是两个对象的地址,new了两个对象,开辟了两个不同的空间,所以这两个空间的地址当然不一样了。只是这两个对象里边的值都指向的是常量池里边的 55.
System.out.println(c==d);//true
System.out.println(e==f);//false
//Integer类的内部,有一个常量静态数组, 在Integer类被加载的时候,预先创建了-128 ~ 127的Integer对象,所以当声明的Integer类型变量的值在-128 ~ 127的范围内时,不会新创建对象, 直接引用数组中创建好的。
3.StringtoString():将对象变成字符串,默认返回的格式:类名@哈希值=getClass().getName()+'@'+Integer.toHexString(hashCode());
例子:
public String toString(){
return "person : "+age;
}
4.ClassgetClass():获取正在运行的对象所属的字节码文件的对象。也就是说如果Demo d = new Demo();d.getClass():获取的就是d执行的对象所属的字节码文件Demo.class对象。
5.通常equals、toString、hashCode在应用中都会被复写,建立具体对象的特有的内容,也就是覆盖。
------- android培训、java培训、期待与您交流! ----------