zoukankan      html  css  js  c++  java
  • 构造方法

    一.构造方法

     1.与以前的不同 

    我们在没学构造方法之前,若要给我们的一个对象的属性赋值之类的,只能在实例化对象之后才能通过方法等途径去进行复制,但这种形式可以说是一种间接的对于对象属性的描述。     通过构造方法我们可以在创建之初就直接给我们的对象属性赋值。

    2.作用

    在建立之初便给对象赋值,更相当于一种出厂设置,当然我们是可以修改的

    3.一些基础知识

    每一个类,不管你是抽象类,还是普通类,final类型的类都是必须拥有自己的构造方法的,这是必须的,若是我们不手动写,则系统会自动给我们添加构造方法,不过只是一个空参数的构造方法

    格式 :  权限   方法名(参数列表){              

    注意方法名一定要与类名一模一样

    }

    二.构造方法的重载

    构造方法在某些地方是与普通方法很像的,比如说可以重载

    这种重载是通过参数列表的不同来进行的

    三.this关键字(必须写在构造方法第一行)

    在构造方法中最为重要的便是两个关键字的使用与理解

    1.在前面的总结中我们已经说到this关键字是可以存储本类中的地址,然后通过指针进行一些同名数据的赋值等操作

    public Person(String name,int age) {
    	  this.name=name;
    	  this.age=age;
      }
    

      从我们上面的代码可看出,这种特性仍然没有丢失。

    2.this()

    这是直接通过this引用在本类中的另一个构造方法,因为我们的方法名与类名相同,所以这便涉及到了方法的重载

    至于为什么要在一个类中引用自己的构造方法呐?

    当我们存在多个构造方法时可能会出现功能相同的构造方法,如果我们要测试的话,就要在测试类中实例化两个对象,很麻烦,并且这些功能相同的方法在某种程度上更像是一种程序的赘余,很不好。

    具体使用细节如下:

    package cn.itcast.demo4;
    
    public class Person {
        private String name;        
        private int num;
         //出于安全性考虑此处为私有定义
        
        public Person() {
               this("刘宇剑",2);  //this存的是有参构造方法2地址
               //指向有参构造方法2,相当于是调用了2
                System.out.println("我是一个空参构造方法");
        }   
        
        public Person(String name,int num) {
            this.name=name;
            this.num=num;
        }    //这是构造方法2
        
        public String getName() {           //以下均为对私有类型的处理    
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getNum() {
            return num;
        }
        public void setNum(int num) {
            this.num = num;
        }
        
    }
    
    package cn.itcast.demo4;
    /*
     * 测试类
     */
    public class Test {
    
        public static void main(String[] args) {
            
        Person pe=new Person();   //此处我们仅仅使用一个空参便可以
        
        System.out.println(pe.getName()+pe.getNum());
        }
    
    }

    四.super关键字(必须写在构造方法第一行)

    关于super关键字我们至少知道的是该关键字指向父类中的属性

    1.父与子

    其实无论在何种情况下,父类与子类之间最重要的便是继承,在我看来super的存在是为了完成对父类中构造方法的继承(这个就是个人理解了。。。)。    我们要首先清楚在子类继承中的一些知识:

    类和类之间存在继承关系后,系统所自动添加的构造方法会有一个隐式代码super(),这个代码中的super存储了父类构造方法的地址,可以指向父类构造方法,进而继承父类构造方法中的属性

    2.无论如何子类都要间接或者直接调用父类的构造方法

    直接super()

    间接:以this()作为中间桥梁代码如下:

    package cn.itcast.demo6;
    
    public abstract class Person {
      private String name;
      private int age;
      
      public Person(String name,int age) {
          this.name=name;
          this.age=age;
      }  //我下面把get,set方法删了,有点多。。
    }
    
    
    package cn.itcast.demo6;
    
    public  class Worker extends Person{
          
         public Worker(String name,int age)          //这里为了继承所以要参数一样
         {         
             super(name,age);                  //继承父类方法中的内容
         }
         public Worker() {
             this("1234",33);    //通过参数指向第一个构造方法
         }
    }

    五.构造方法内存过程

    1.一般构造方法的内存过程

     class文件先进入方法区,然后main方法进入栈内存中,当我们开始实例化对象时,第一个对象便进入了堆内存完成初始化(系统自动初始化)同时构造方法进入了栈内存中运行,完成其功能后死亡

    2.继承中的构造方法内存过程

    父类class文件先进入方法区,然后子类class再进去,然后main方法进入栈内存中,当我们开始实例化对象时,第一个对象便进入了堆内存完成初始化(系统自动初始化),此时堆内存中有两个内存区域,一个是父类的,另一个是子类的,实例化对象便存在于子类的存储区域,同时子类与父类的构造方进入了栈内存中运行,此时先运行子类的构造方法,通过super找到父类的构造方法。

    六.总结

    这块卡住我的就是super,this的指向问题,其实总体并没有太多信息量,所以只要相同指向问题这个知识点基本就算过了。

  • 相关阅读:
    orbis 链接 .a的问题
    程序的循环结构
    程序分支控制
    字符类型及常用的函数
    数字数据类型
    基础练习
    了解计算机
    python基础练习
    markdown基本使用
    jupyterhub
  • 原文地址:https://www.cnblogs.com/roseneverdie/p/10114511.html
Copyright © 2011-2022 走看看