访问包位置 | 类修饰符 | ||
---|---|---|---|
private | protected | public | |
本类 | 可见 | 可见 | 可见 |
同包其他类或子类 | 不可见 | 可见 | 可见 |
其他包的类或子类 | 不可见 | 不可见 | 可见 |
所谓可见不可见即为能否调用,接下来对上述表格解释说明之
下面给出一个Book实例,以介绍成员变量定义与用法
package java_learning;
public class Book {
private String name;
public Book getbook()
{
return this;
}
private void setname(String val)
{
this.name=val;
}
public String getname()
{
setname("Java");
return this.name;
}
}
通过这一个实例可以得到成员变量就是普通的变量,结构体、double、float之流,当然也可以是自定义数据类型也没毛病,当然成员变量也是由三个修饰符来限制其被调用范围的
权限修饰符 返回值类型 方法名(参数类型 参数名)
{
方法体
return 返回值类型;
}
很明显可以看到·这种成员方法的定义方式和普通的函数方法定义方式几乎一样,区别只在于成员方法定义时加上了一个权限修饰符
关于类中的局部变量定义域:如果一个方法中含有与成员变量同名的局部变量,则该局部变量在此方法内有效,并屏蔽了与其同名的成员变量
等等,似乎还有个小问题,既然类中的成员变量和类都有权限修饰符,那以谁为准呢?县官不如现管,当然是类的权限会约束类成员的权限了
局部变量在方法内部声明,并且只能在方法内部使用,在外层的方法被调用时被分配内存,请求在方法执行完毕后自动释放内存而消亡,在使用局部变量的时候必须先对其进行初初始化。它是在方法体中定义的变量以及方法的参数,只在定义它的方法内有效。成员变量如果没有人为初始化,系统将自动根据其所属类型进行初始化,基本数据类型变量量系统赋值0,引用型变量赋值NULL。局部变量在方法执行结束后就被销毁,与此不同,成员变量其实是一种全局变量
this关键字只能在方法内部使用,与c++中类的定义类似,只不过c++中this是一个对象指针
使用this调用成员变量发生在方法内部,当成员变量(类下声明的变量)的名字与局部变量(方法内声明的变量)的名字相同时,使用this.变量名来表示该变量代表的是成员变量。
//声明成员变量
private String name;
//参数中的变量是方法中的局部变量
public void setName(String name){
//this.name表示的就是成员变量,name表示局部变量
this.name = name;
}
使用this调用成员方法同样也发生在方法内部。通常情况下,我们在方法内部调用其他方法时,使用的方式是直接调用,即直接写方法名。其实,此时我们可以在要被调用的方法名前使用this关键字加“.”调用,这两种调用成员方法的方式是一样的,由于使用第二种方式没有多大的意义,所以一般情况下,我们选择直接调用的方式。
public class ThisTest{
public void method1(){
System.out.println("成员方法");
}
public void method2(){
//以下两种调用方法的方式效果一致
method1();
this.method1();
}
}
使用this关键字调用其他重载的构造器是this关键字非常重要的用法之一,采用this调用其他构造方法需要将this语句写在构造器内的第一行,否则会报错。这种调用方式的优点在于一个构造器可以不必重复编写其他构造器中已有的代码,而是通过调用其他构造器实现代码复用,从而提供良好的类代码结构。
其实我个人目前是用不太到~
public class ThisTest{
//定义两个成员变量
private String name;
private int height;
//无参构造器
public ThisTest(){
//使用this调用参数为String类型的构造器
this("Ben");
}
//参数为String类型的构造器
public ThisTest(String name){
//使用this调用参数为String和int类型的构造器
this(name,165);
}
//参数为String和int类型的构造器
public ThisTest(String name, int height){
//为两个属性赋值
this.name = name;
this.height = height;
}
}
public class Test(){
public static void main(String[] args){
//创建对象
new ThisTest();
}
}
上述程序解释
创建对象时,构造器就会被调用,我们来看一下构造器的调用顺序:
首先,创建对象时没有传入参数,所以先调用无参构造器,进入无参构造器后,执行this(“Ben”),然后进入参数为String类型的有参构造器,此时将”Ben”传给name,执行(name,165)。 最后进入参数为String和int类型的构造器,执行该构造器内的语句,即最终的name为”Ben”,最终的height为165。这种使用参数最多的构造器来初始化成员变量的方式在开发中很常用。
public class This2Test{
//定义一个属性
public String name;
//参数为String类型的构造器
public This2Test(String name){
this.name = name;
}
//定义一个参数为引用类型的方法
public void method3(This2Test tt){
//输出该对象的属性
System.out.println(tt.name);
}
public void method4(){
//调用方法并传入this
method3(this);
}
}
public class Test{
public static void main(String[] args){
//创建对象t
This2Test t = new This2Test("贝克");
//对象t调用方法
t.method4();
}
}
我们来分析一下运行程序是怎么运行的,传入的this代表的是什么呢?为什么输出的是贝克呢? 首先看程序的入口main方法,先创建对象t,创建对象时,进入Test2This类调用它的有参构造器,此时name为传入的”贝克”,也就是说当前创建的这个对象t的name为”贝克”。然后,用对象t去调用 method4()方法,该方法内部调用了method3()方法,并传入了this。因此,进入method3()方法,打印this的名字,这里的这个this代表的就是调用method4()方法的对象,即一开始的对象t。所以这里就体现了this的第四种用法(this表示当前对象)。在这里,可以简单理解为:this在method4()方法中被调用,因此this指的就是调用method4()这个方法的对象。