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