数据类型:决定数据在内存当中是什么样的存储形式
比如:
int类型:1bit符号位,32bit数值位
byte类型:1bit符号位,7bit数值位
float类型:1bit符号位,8bit阶位,23bit数值位
创建一个父类A:
public class A {
public String name;
public int age;
public void run(){
System.out.println("A跑得很快");
}
public void eat(){
System.out.println(name+"吃的很多...");
}
}
子类B:
public class B extends A{
public char sex;
public double height;
public void fly(){
System.out.println("B飞得很高");
}
}
Test类:
public class Test {
public static void main(String[] args) {
A a = new A();
B b = new B();
A ab = new B();
}
}
对象a的内存存储形式:A类的变量和方法都有。
对象b的内存存储形式:因为创建子类对象的前提是创建父类对象,所以b可以调用到A类和B类的变量和方法。
当子类B重写父类A中的run方法后,父类当中的run方法会被覆盖
A ab = new B();
对象ab的内存存储形式:因为创建子类对象的前提是创建父类对象,所以A类和B类的变量和方法都在。但由于ab的数据类型是A,所以ab只能调用到A中的name,age,eat()和被覆盖的run方法,即B中的run方法。
多态是什么?
多态就是事物的多种形态,一个对象在不同条件下所表现的不同形式
多态存在的三个必要条件
此处举例Animal是父类,Dog是子类
父类Animal:
//父类
public class Animal {
public int age = 11;
}
子类Dog:
//子类
public class Dog extends Animal {
public int age = 33;
}
测试:
public class Test {
public static void main(String[] args) {
//父类类型 对象 = new 子类类型()
Animal dog = new Dog();
System.out.println(dog.age);
}
}
控制台打印输出:父类中定义的age
11
此处举例Animal是父类,Dog是子类
父类Animal:
//父类
public class Animal {
public void eat() {
System.out.println("午餐吃狗粮");
}
}
子类Dog:
//子类
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("晚餐吃狗粮");
}
}
测试:
public class DemoApplication {
public static void main(String[] args) {
//父类类型 对象 = new 子类类型()
Animal dog = new Dog();
dog.eat();
}
}
控制台打印输出:调用的是子类中重写的方法
晚餐吃狗粮
对于子类独有的方法,父类无法访问,
父类Animal保持不变:
//父类
public class Animal {
public void eat() {
System.out.println("午餐吃狗粮");
}
}
子类Dog:增加子类独有的方法walk()
//子类
public class Dog extends Animal {
public void walk(){
System.out.println("子类独有的方法");
}
@Override
public void eat() {
System.out.println("晚餐吃狗粮");
}
}
测试:walk()方法报红,即编译报错
先了解什么是向上转型(儿子变父亲)
儿子向上转型,父亲是唯一的,因此是自动转换
对于子类来说,他们的父类是唯一的,而对于父类来说。他拥有很多的子类 ,所以一旦父类要转换成子类,就必须指定要变成哪个子类,必须有指向性,所以向下转型才是强制转换
向上转型
父类类型 变量名 = new 子类类型();
Animal dog = new Dog()
向下转型
子类类型 子类变量名 = (子类类型) 父类变量名
Dog dog1 = (Dog) dog;
dog1.walk; //此时可以使用子类独有的方法了
测试:
public class Test {
public static void main(String[] args) {
//父类类型 对象 = new 子类类型()
Animal dog = new Dog();
//向下转型
//子类类型 子类变量名 = (子类类型) 父类变量名
Dog dog1 = (Dog) dog;
dog.eat(); //访问的是子类中重写的方法
//通过向下转型的子类对象调用子类独有的方法
dog1.walk();
}
}
控制台打印输出:
晚餐吃狗粮
子类独有的方法