目录
一、 this关键字
我觉得this在Java和C++、C#的作用都是差不多的,this比较重要,还是拉出来讲讲。
1、 概念
打印一个对象的时候,输出的是这个对象的地址(JDK提供的一个地址,真正的地址是十六进制的)。
this 只能在类的对象方法中使用。
this 代表当前调用这个this所在方法的对象的自身。
this 可以在方法内区分同名的类的属性和参数名(有this的一定是属性,没有this的一定是方法的参数名)。
2、 实例
public class Demo {
public void work(){
System.out.println("Demo--------"+this);
}
}
class TestDemo{
public static void main(String[] args) {
Demo demo = new Demo();
System.out.println("TestDemo--------"+demo);
demo.work();
}
}
运行结果
通过上面这个例子,不难看出this和demo的地址(每次new的时候都是唯一的)是相同的,说明它们两个用的是同一个对象,谁调用的这个方法,这个打印出来的地址就是谁的。
3、 常见用法
还是举个栗子吧~
public class PersonInfo{
private String name;
/**
*大家都知道下面的测试类要获取
*这里的私有数据,需要set和get。
*下面这种情况就需要区分一下谁是谁的name。
*/
public void setName(String name){
//this后面的name是属性
//这个方法的name是参数
this.name=name;
}
public void getName(String name){
return name;
}
}
class TestPersonInfo{
PersonInfo person = new PersonInfo ();
person.setName("王大锤");
String personName=person.getName();
System.out.println(personName);
}
类内部 | package内 | 子类 | 其他 | |
public | 允许 | 允许 | 允许 | 允许 |
protected | 允许 | 允许 | 允许 | 不允许 |
default | 允许 | 允许 | 不允许 | 不允许 |
private | 允许 | 不允许 | 不允许 | 不允许 |
4、 原理
假设是一个汽车类(Car),这个车有color、name、carNo(车牌号)的属性,有 run() 和 introduce() 的方法。另外有一个测试类(TestCar)来调用汽车类的方法。代码很简单,这里主要详解一下原理。关于堆和栈以及进栈出栈的方式,自行补脑。
运行流程
第一步:java运行到TestCar的时候,把TestCar.class载入到JVM(各就各位,),把main放入方法区压栈。
第二步:加载Car.class到JVM,然后把run() 和 introduce() 加载到方法区,在堆中创建一片空间创建了一个Car对象,在栈中产生一个变量car 指向堆中的对象。然后给 car 对象的三个属性赋值。
第三步:car 的run() 方法进栈,把 car 变量所指向的地址赋值给this关键字,执行方法体。
第四步:run() 方法出栈,run() 中的 this 消失。
第五步:car 变量消失,main 出栈后消失。
第六步:由于Car堆中的对象失去了变量的引用变成了匿名对象,所以也被系统回收。
二、 public关键字
使用对象:类、接口、成员
介绍:无论它所处在的包定义在哪,该类(接口、成员)都是可访问的
三、static关键字
使用对象:类、方法、字段、初始化函数
介绍:成名为static的内部类是一个顶级类,它和包含类的成员是不相关的。
1、修饰在属性上
class User{
//一般的变量命名
String username;
String password;
//加上static的命名
static String realName;
}
加上static关键字之后,表示realName这个变量名不再是User的属性,而是这个类的属性。
2、修饰在方法上
语法:public static 返回值类型 方法名(数据类型 参数名);
方法名上不带static的方法都是对象的方法。
public class Demo {
String name;
int age;
String lesson;
/**
* 对象的方法,每一个老师的实例可以使用
*/
public void teach(){
System.out.println("老师在上课.....");
}
/**
* 类方法
*/
public static void sleep(){
System.out.println("老师在睡觉.....");
}
}
class TestDemo{
public static void main(String[] args) {
// 使用类名来调用类方法,推荐使用
Demo.sleep();
//不推荐使用下面的方法来调用
Demo demo = new Demo();
demo.sleep();
}
}
总结:上面这个实例说明,有static关键字的方法是类的属性,则可通过 “类名.方法名” 来调用。
四、 protected关键字
推荐一个教程链接:http://www.runoob.com/w3cnote/java-protected-keyword-detailed-explanation.html
下一章节:有C++基础的Java入门(五)