this关键字的使用
1.表示类中的属性
public class Person()
{
private String name;
private int age;
public Person(String name,int age)//明确参数的含义 与类中的属性不沾边
{
this.name = name; //this表示指定的是类中的属性
this.age = age;
}
}
在大部分操作的时候,用this.属性名称表示类中的属性.
2.可以使用this调用类中的构造方法
如果在一个类中存在多个构造方法,可以使用this关键字在构造方法间互相调用
public class Person()
{
private String name;
private int age;
public Person() //无参数的构造方法
{
System.out.println("对象实例化");
}
public Person(String name)
{
System.out.println("对象实例化");
this.name = name; //有一个参数的构造方法
}
public Person(String name,int age)//两个参数的构造方法
{
System.out.println("对象实例化");
this.name = name;
this.age = age;
}
}
代码重复
public Person() //无参数的构造方法
{
System.out.println("对象实例化");
}
public Person(String name)
{
this.Person(); //this调用无参数的构造方法
this.name = name; //有一个参数的构造方法
}
public Person(String name,int age)//两个参数的构造方法
{
this.Person(name); //this调用有一个参数的构造方法
this.name = name;
this.age = age;
}
注意: this调用构造方法的语句只能放在构造方法的首行.
this调用构造方法的时候,至少有一个构造方法是不用this调用的
3.表示当前对象
可以使用this和引用传递进行两个对象是否相等的判断.
若两个对象的属性完全一样 则两个对象相同,或者两个对象的地址一样,则两个对象
相等.
在类中加入比较的方法
public boolean compare(Person per)
{
//调用此方法时 里面存在两个对象:当前对象和传入的对象
Person p1 = this;//当前的对象
Person p2 = per;//表示传进来的对象
if(p1 == p2) //判断是不是同一个对象
{
return true;
}
if(p1.name.equals(p2.name)&&p1.age == p2.age)
{
return true; //两个对象相等
}
else
{
return false;
}
}
static关键字
在java中可以使用static声明属性和方法,用static声明的方法称为类方法
1.用static声明全局属性,为所有对象所共享的.一个对象修改了static声明的
属性时,则所有对象的属性将修改.
每一个对象都拥有各自的堆栈空间,堆内存空间中保存每一个对象的各自的属性
但是所有的static属性是保存在了全局数据区之中,所有的对象指向全局数据中的
一个内容,所以当一个对象修改之后,所有对象的内容将全部变化.
java中内存区域:
栈内存:可以保存对象的名称(保存访问的堆内存的地址)
堆内存:保存每个对象的具体属性
全局数据区:保存static类型的属性
全局代码区:保存所有方法的定义
2.用static声明方法时
直接用类名称.方法名调用
注意:使用static方法时,在此方法中不能调用非静态的属性和非静态的方法
因为static属性或方法可以在对象没有实例化的时候就直接调用了
而非静态的属性和方法在实例化对象后才能被使用
3.static的其他应用:
使用static属性统计一个类到底产生了多少个实例化对象
使用static为对象进行自动的编名操作
eg:
public class Demo
{
static int count;
public Demo()
{
count++;
}
}
main方法的说明
public static void main(String args[])
public:表示方法可以被外部调用
static:表示方法可以由类名称直接调用
void:主方法是程序的起点,做一不需要任何的返回值
main:系统规定好默认调用的方法名称,执行的时候,默认找到main方法名称
String args[]: 表示的是运行时的参数 当编译好文件时,
参数传递的方式是:java 类名称 参数1 参数2...
用空格分开,若参数中有空格 则用""括起来
eg:
public static void main (String args[])
{
if(args.leng!=3) //判断参数的个数
{
System.exit(1); //退出系统,参数非0就退出
}
for(int i=0;i<args.length;i++)
{
System.out.print(args[i]);
}
}
代码块:
所谓代码块是指使用"{}"括起来的一段代码,根据位置的不同,代码块可以分为
四种:普通代码块,构造块,静态代码块,同步代码块(多线程)
直接定义在方法中的代码块称为普通代码块:
public static void main(String args[])
{
{
int x = 30;//就属于一个局部变量
System.out.print(x);
}
int x = 100; //与局部变量相同
}
构造块:将代码直接定义在类中
若没有实例化对象,则构造块是不执行的
class Demo
{
{
System.out.println("构造块")
}
public Demo()
{
System.out.print("构造方法")
}
}
构造块优先于构造方法执行,且执行多次,只要一有实例化对象的产生,就执行
构造块中的内容
静态代码块:直接使用static关键字声明的代码块就称为静态代码块
class Demo
{
{
System.out.println("构造块");
}
static
{
System.out.println("静态代码块");
}
public Demo()
{
System.out.println("构造方法");
}
}
public class Demo1
{
static
{
System.out.println("在主方法所在的类中定义的静态代码块");
}
public static void main(String args[])
{
new Demo();
}
}
静态代码块优先于主方法执行,如果在普通类中定义的静态块,优先于构造块执行
不管有多少个实例化对象产生,静态代码块只执行一次,静态代码块的主要功能
就是为静态属性初始化.
执行顺序:
静态代码块(主方法所在的类)>主方法>构造块>构造方法
用静态代码块可以代替main方法输出hello world!!
public class Print
{
static
{
System.out.print("hello world!!!");
System.exit(1); //如果不退出会有找不到main方法的提示
}
}