多态
多态的前提:必须有父子类关系
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方法进行改值