20150902 Java学习笔记-构造方法,关键字,封装性

来源:互联网 发布:勇士vs马刺数据统计 编辑:程序博客网 时间:2024/06/06 03:57

1. 构造方法

构造方法的作用:在对象实例化的时候为类之中的属性进行初始化操作.
类之中编写构造方法后的结构要进行一些说明: 类之中会存在属性,构造方法,普通方法,所以一定要先写属性,随后写构造方法,最后写普通方法. 还有如果定义了多个构造方法,请按照参数的个数顺序进行排列

2.this关键字

1.程序本身具备就近取用原则, 所谓的近,是以”{}”为范围,为了明确的分辨出是属性还是参数,所以在进行属性访问的时候都要加上this,即”this.属性”的方式进行访问,结论:只要访问类之中的属性,前面永远都要加上this关键字
2.使用this还可以调用类中的方法,而对于方法有两类:
第一类:本类的普通方法,this.方法();
第二类:本类的构造方法,this();
一般而言,如果一个类中有多个构造方法的时候就可以利用this()的形式进行构造方法间的调用.但是在用this调用其他构造方法时有如下 要求:构造的调用必须放在构造方法的首行. 构造方法是在对象实例化的时候只调用一次,而对象实例化之后才可以重复调用类中的方法.同时在利用this调用构造方法的时候请保留有一个出口.至少要保留一个不使用this调用其他构造的作用.
3.this里面有个最麻烦的概念就是表示当前对象.

3.static关键字

  1. static定义属性

对于公共属性,最好用static定义,属性成了全局属性,所有对象所有,面对static属性可以发现由于其可以利用类名称直接调用,所以在很多书上也会将其称为类属性.对于类属性有一个最大的特征,可以在一个类没有实例化产生对象的时候,直接进行操作. 所以static定义的属性不受对象的控制,不管是否有对象,都不影响其使用,所以对于我们static属性而言,虽然定义在类之中,但是却独立于类存在这里写图片描述

2.static定义方法

对于程序而言,属性一定要用private封装,不管static属性,还是非static属性
static定义的方法同样可以用类名调用. 在一类之中发现存在static方法,也存在有非static方法,那么这两者之间的调用是存在限制的:

  • 使用static定义的方法只能够调用static属性或static方法
  • 使用非static定义的方法可以调用static属性或static方法
    这是语法上的限制,那么除了这些语法上的限制之外,我们来进一步分析,为什么会存在这样的限制呢?
    所有的普通属性是在类对象实例化的时候才进行内存空间的分配,而所有的普通方法需要在类实例化对象产生之后才可以进行调用. static定义的属性或方法可以在类没有实例化对象的时候进行调用 .调用static方法的时候有可能还没产生实例化对象呢, 既然没产生实例化对象,我们就不能 调用属性,不能调用非static方法 ,所以进一步想既然有可能在调用static方法的时候, 没有实例化对象产生, 那么我们可能存在this这个当前对象吗? 所以Java语法限制了以上两条

4.代码块

  • 所谓的普通代码块指的就是定义在方法之中,利用”{}”声明的部分.如果将代码块定义在类之中,那么就形成了构造块的概念
  • 构造块优先于方法执行
    3.如果在代码块上加上了static关键字,那么就表示是一个静态块,而静态块的使用要分两种情况
  • 情况一:定义在非主类之中
  • 情况二:定义在主类之中
    静态块优先于构造块执行,并且不管你有多少个实例化对象,静态块只调用一次.一般而言,静态块往往是为static属性初始化的. 静态块的代码优先于主方法执行

5.案例实现封装

这里写图片描述

package com.buaa.day3;class emps{//雇员类    //所有属性必须使用private封装    private int empno ;//雇员编号    private double sal;//雇员薪资    private double comm ;//佣    private String ename ;//雇员姓名    private String job ;//基本工资    public int getEmpno() {return empno;}    public String getEname() {return ename;}    public String getJob() {return job;}    public double getSal() {return sal;}    public double getComm() {return comm;}    public void setEmpno(int empno) {this.empno= empno;}    public void setEname(String ename) {this.ename=ename;}    public void setSal(double sal) { this.sal=sal;}    public void setJob(String job){this.job=job;}    public void setComm(double comm){this.comm =comm;}    public emps(){}    public emps( int empno,double sal,double comm ,String ename ,String job){        this.empno = empno;//雇员编号        this.sal = sal;//雇员薪资        this.comm = comm;//佣        this.ename = ename;//雇员姓名        this.job = job;//基本工资    }    public String getIfo(){        return "雇员编号:"+this.empno+               ",姓名:"+this.ename+               ",职位:"+this.job+               ",工资:"+this.sal+               ",佣金:"+this.comm;    }}public class EMP {    /**     * @param args     */    public static void main(String[] args) {        // TODO Auto-generated method stub        emps voEmps = new emps(12,800.0,0.0,"li","clerk");        System.out.println(voEmps.getIfo());//以上代码之中发现你并没有调用setter getter 方法,那么还有必要编写吗?//setter除了设置内容的功能之外,在开发中还有取得的操作,而getter可以取得单个数据,不管是否使用,永远必须提供。        voEmps.setJob("manager");        System.out.println(voEmps.getIfo());        System.out.println(voEmps.getEname());    }}
0 0