多态
多态的前提:必须有父子类关系
public class Person { public void eat() { System.out.println("人吃饭"); } }
public class Student extends Person{ public void eat() { System.out.println("学生吃饭"); } }
public static void main(String[] args){ person p = new Student(); //将子类指向父类引用 }
public static void main(String[] args) { // 1.父类,子类都是普通类的多态 // 将一个Student对象赋值给Student引用变量 Student s = new Student(); // 多态前提必须有有子父类关系不能多态 // 将一个Student对象赋值给person引用变量 // 多态体现形式子类对象指向父类引用 Person p = new Student(); // 2父类是抽象类,子类是普通类多态 Animal a = new Cat(); // 3父类是接口,子类是普通类多态 Smoking smoke = new Man(); }
多态的成员的特点 父类引用调成员变量是调用父类,调用成员方法调用子类重写后的成员方法
public static void main(String[] args) { // 多态 // 当父类引用调用成员方法时, // 如果父类有编译成功,子类重写,调用子类重写后方法, // 如果子类没有重写调用父类方法 // 如果父类没有调用失败 // 当父类引用成员变量时 // 父类有,编译成功,调用父类的成员变量 // 总结 // 父类引用调成员变量是调用父类,调用成员方法调用子类重写后的成员方法 Person p = new Student();//向上转型 p.eat(); System.out.println(p.mun); }
interfaceof关键字
格式
boolean b = 对象 instanceof 数据类型;
public static void main(String[] args) { Person p = new Student();//向上转型 boolean flag = p instanceof Person; boolean flag1 = p instanceof Man; System.out.println(flag); System.out.println(flag1); }
多态的转型
向上转型 格式
父类类型 变量名 = new 子类类型();
向下转型 格式
子类类型 变量名 = (子类类型) 父类类型的变量;
向下转型的前提条件是 向上转型
向上转型的好处是 隐藏了子类类型,提高了代码的扩展性
向下转型的好处是 能实现子类特有功能
构造方法
格式 修饰符 构造方法名(参数列表){ }
public class Person { private String name; private int age; public Person(String name,int age){ this.name=name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
public class Text { public static void main(String[] args) { Person p = new Person("zhangsan",18); System.out.println(p.getName()+"..."+p.getAge()); } }
构造方法调用和内存图解
1、首先会将main方法压入栈中,执行main方法中的 new Person("zhangsan",18);
2、在堆内存中分配一片区域,用来存放创建的Person对象,这片内存区域会有属于自己的内存地址(0x001)。然后给成员变量进行默认初始化(name=null,age=0)。
3、执行构造方法中的代码(age =age ; name = name;),将变量age对应的23赋值给age,将变量name对应的”张三赋值给name,这段代码执行结束后,成员变量age和name的值已经改变。执行结束之后构造方法弹栈,Person对象创建完成。将Person对象的内存地址0x001赋值给p。
与set的区别
构造方法先创建对象赋值然后在分配地址,set是先创建对象分配地址然后赋值
当一个类没有构造方法时,系统默认提供一个空参构造;
当一个类有构造方法时,系统不会提供空参构造
可以再通过set方法进行改值