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

  • 相关阅读:
    【转】编写高质量代码改善C#程序的157个建议——建议61:避免在finally内撰写无效代码
    【转】编写高质量代码改善C#程序的157个建议——建议60:重新引发异常时使用Inner Exception
    【转】编写高质量代码改善C#程序的157个建议——建议59:不要在不恰当的场合下引发异常
    【转】编写高质量代码改善C#程序的157个建议——建议58:用抛出异常代替返回错误代码
    【转】编写高质量代码改善C#程序的157个建议——建议57:实现ISerializable的子类型应负责父类的序列化
    elasticsearch从入门到出门-02-简单的CRUD
    elasticsearch从入门到出门-01windows上安装使用
    Idea 使用的技巧和设置
    Ubuntu16.04 安装搜狗输入法
    Ubuntu 下安装JDK1.8
  • 原文地址:https://www.cnblogs.com/cgj1994/p/9703987.html
Copyright © 2020-2023  润新知