一、面向对象特征之三:多态性
1.理解多态性
一个事物的多种形态
2.对象的多态性
父类的引用指向子类的对象(或子类的对象赋给父类的引用)
3.多态的使用:虚拟方法的调用
有了对象的多态性以后,我们在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法。
4.多态性使用的前提
●类的继承关系
●方法的重写
5.对象的多态性,只适用于方法,不适用于属性,是运行时行为
虚拟方法的调用
多态性的使用举例
package Test;
public class AnimalTest {
public static void main(String[] args) {
AnimalTest test = new AnimalTest();
test.func(new Dog());
test.func(new Cat());
}
//多态性的使用,省去了方法的重载
public void func(Animal animal){//Animal animal = new Dog();
animal.eat();
animal.shout();
}
}
class Animal{
public void eat(){
System.out.println("动物:进食");
}
public void shout(){
System.out.println("动物:叫");
}
}
class Dog extends Animal{
public void eat(){
System.out.println("狗吃骨头!");
}
public void shout(){
System.out.println("汪汪汪");
}
}
class Cat extends Animal{
public void eat(){
System.out.println("猫吃鱼!");
}
public void shout(){
System.out.println("喵喵喵");
}
}
二、instanceof 操作符
x instanceof A:检验x是否为类A的对象,返回值为boolean型。
➢要求x所属的类与类A必须是子类和父类的关系,否则编译错误。
➢如果x属于类A的子类B,x instanceof A 值也为true。
三、Object类的使用
Object类是所有Java类的根父类
如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类
1.equals()方法
面试题: == 和 equals 的区别
●== 既可以比较基本类型也可以比较引用类型。对于基本类型就是比较值,对于引用类型就是比较内存地址
●equals的话, 它是属于java.lang.Object类里面的方法, 如果该方法没有被重写过默认也是==;我们可以看到String等类的equals方法是被重写过的,而且String类在日常开发中用的比较多,久而久之,形成了equals是比较值的错误观点。
●具体要看自定 义类里有没有重写Object的equals方法来判断。
●像String、Date、File、包装类等都重写了Object类中的equals()方法,重写以后,比较的不是两个引用的地址是否相同,而是比较两个对象实体内容是否相同
2.toString()方法
像String、Date、File、包装类等都重写了Object类中的toString()方法,使得在调用对象的toString()时,返回实体内容。
四、包装类的使用
类型的强转,两者必须有子父类的关系。
java提供了8种基本数据类型对应的包装类,使得基本数据类型的变量具有类的特征
●针对八种基本数据类型定义相应的引用类型一包装类(封装类)
●有了类的特点,就可以调用类中的方法,Java才是真正的面向对象
基本类型、包装类、与String类之间的转换
1.基本数据类型 ---> 包装类
package baozhunglei;
import org.junit.Test;
public class WrapperTest {
//转换成包装类调用构造器
@Test
public void test1(){
int num1 = 10;
Integer in1 = new Integer(num1);
System.out.println(in1.toString());
Integer in2 = new Integer("666");
System.out.println(in2.toString());
Float f1 = new Float(66.6f);
Float f2 = new Float("66.6");
System.out.println(f1);
System.out.println(f2);
Boolean b1 = new Boolean(true);
Boolean b2 = new Boolean("TruE");
System.out.println(b2);//true
Boolean b3 = new Boolean("true666");
System.out.println(b3);//false
}
}
2.包装类 ---> 基本数据类型
package baozhunglei;
import org.junit.Test;
public class WrapperTest {
@Test
public void test2(){
Integer in1 = new Integer(12);
int i1 = in1.intValue();//转换为基本数据类型
System.out.println(i1 + 1);
}
}
自动装箱
public void test3(){
int num2 = 10;
Integer in1 = num2;
boolean b1 = true;
Boolean b2 = b1;
}
自动拆箱
int num3 = in1;
3.基本数据类型、包装类 ---> String类型
package baozhunglei;
import org.junit.Test;
public class WrapperTest {
@Test
public void test4(){
int num1 = 10;
//方式1:
String str1 = num1 + "";
//方式2:调用String的valueOf()方法
float f1 = 12.3f;
String str2 = String.valueOf(f1);
Double d1 = new Double(12.4);
String str3 = String.valueOf(d1);
}
}
4.String类型 ---> 基本数据类型、包装类
public void test5(){
String str1 = "123";
int num = Integer.parseInt(str1);
}