Java 多态 构造方法

多态

多态的前提:必须有父子类关系

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方法进行改值

 

posted @ 2018-09-27 09:31  元气满满01  阅读(299)  评论(0)    收藏  举报