this关键字在Java中表示以下概念:
|·调用类中的属性:this.属性;
|·调用类中的方法:this.方法();
|·调用类中的构造:this();
|·表示当前对象
1:(调用类中的属性和方法)
class Person{
private String name;
private int age;
public Person(String name, int age){
this.setName(name); //调用类中的方法
this.setAge(age);
}
public void setName(String name){
this.name = name; //调用类中的属性
}
public void setAge(int age){
this.age = age;
}
public String getName(){
return this.name;
}
public int getAge(){
return this.age;
}
}
public class Test{
public static void main(String [] args){
Person per = new Person("张三",30);
System.out.println("姓名:" + per.getName() + "年龄:" + per.getAge());
}
}
//使用this关键字完美解决属性name与局部变量name的命名冲突。并且让程序更加通俗易懂。
2:(调用类中的构造:)
现要求无论调用哪一个构造方法,都必须打印 我被调用了!
class Person{
private String name;
private int age;
public Person(){ //无参构造
System.out.println("我被调用了!");
}
public Person(String name){
this(); //调用无参构造
this.setName(name);
}
public Person(String name, int age){
this(name); //调用有一个参数的构造
this.setName(name);
this.setAge(age);
}
public void setName(String name){
this.name = name;
}
public void setAge(int age){
this.age = age;
}
public String getName(){
return this.name;
}
public int getAge(){
return this.age;
}
}
public class Test{
public static void main(String [] args){
Person per = new Person("张三",30);
System.out.println("姓名:" + per.getName() + "年龄:" + per.getAge());
}
}
//以上代码无论是哪一个构造方法被调用,都会打印输出 我被调用了!而且提高了代码的重用性。
//调用类中的构造时,this()必须写在构造方法的第一行,并且在所有的构造中至少有一个不被调用。
//使用this()调用类中的构造方法,代码量减少了,代码的重用性提高了。
二)内部类与外部类及外围类的关系
1、内部类不仅可以访问而且可以操作外层类的private成员变量(比如赋值),而外围类不能直接直接访问内部类的成员变量,必须通过
内部类对象引用才能调用;外部类也不能访问其它类的private成员变量的,除非其它类提供了非private的方法来访问这些成员变量。
public void A{
priave int a;
private void B{
private int a;
public A get(){
return A.this;//对外层类引用
}
public void set(int a){
this.a = a;//内部类成员变量及方法参数变量
A.this.a = this.a;//外层及内部类成员变量
}
};//B为A的内部类
}2、内部类可以调用外层类的方法,如果内部类有同名方法必须使用"OuterClass.this.MethodName()"格式调用(其中OuterClass与
MethodName换成实际外部类名及其方法;this为关键字,表示对外部类的引用);若内部类无同名方法可以直接调用。而外围类无法直接
调用内部类的private方法,外部类同样无法直接调用其它类的private方法。注意:内部类直接使用外部类的方法与该方法的权限与是否
static无关,它取决于内部类是否有同名方法。
//内部类对外围类的成员方法调用的一般方法事例
public class OuterClass {
private static void outerMethod() {
System.out.println("It's Method of OuterClass");
}
class Innerclass {
public void innerMethod() {
OuterClass.this.outerMethod();//内部类成员方法与外部类成员方法同名时,使用this调用
outerMethod();//内部类没有同名方法时执行外部类的方法
}
}
public static void main(String[] args) {
OuterClass t = new OuterClass();
OuterClass.Innerclass in = t.new Innerclass();
in.innerMethod();
}
}
(三)内部类的实例化
内部类实例化不同于普通类,普通类可以在任意需要的时候实例化,而内部类必须在外层类实例化以后方可实例化,并与外层类建立关系
。
假设B是A的内部类,methodC是类A的一个方法,可以通过以下两种途径实现B的实例化:
一是在其它外部类或main()中实例化,声明和初始都要明确与外层类及引用对象的关系:
A a = new A();
A.B b = a.new B();
二是在A内部方法内实例化,实例化时java自动把它与外层类引用对象联系起来:
void method(){
B b = new B();
}
另外,内部类如果定义为静态类(static class),在实例化时不需要对外部类实例化:
public class StaticCls{
public static void main(String[] args){
OuterCls.InnerCls oi=new OuterCls.InnerCls(); //
}
}
class OuterCls{
public static class InnerCls{ //内定类定义为静态类
InnerCls(){
System.out.println("InnerCls");
}
}
}