本章总结了this和static关键字以及代码块的内容及定义
一.this关键字
this有以下作用:
- 强调本类中的方法
- 表示本类的属性
- 使用this调用本类的构造方法
- 表示当前对象
也就是说在赋值时属性并没有明确的被指出,此时就可以使用this关键字,实例如下:
public class This {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Person per = new Person("李四",30);
System.out.println(per.get());
}
}
class Person{
private String name;
private int age;
public String get(){
return "姓名为"+name + "年龄为" + age;
}
public Person(String name,int age){
this.age = age; //明确表示为类中的age属性赋值
this.name = name; //明确表示为类中的name属性赋值
}
}
public class This {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Person per = new Person("李四",30);
System.out.println(per.get());
}
}
class Person{
private String name;
private int age;
public String get(){
return "姓名为"+name + "年龄为" + age;
}
public Person(String name,int age){
this(); //调用Person类的无参构造方法
this.age = age; //明确表示为类中的age属性赋值
this.name = name; //明确表示为类中的name属性赋值
}
public Person(){
System.out.println("创建一个新对象");
}
}
使用this调用构造方法时,this()只能放在构造方法的首行。一定要留一个构造方法作为出口,即程序中至少存在一个构造方法不使用this调用其他构造方法。
this表示当前对象,实例如下:
public class This {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Person per = new Person("李四",60);
Person per1 = new Person("李四",30);
if(per.compare(per1)){
System.out.println("二个对象相等");
}else{
System.out.println("二个对象不相等");
}
}
}
class Person{
private String name;
private int age;
public boolean compare(Person per){
Person per1 = this;
Person per2 = per;
if(per1 == per2){
return true;
}
if(per1.age == per2.age && per1.name.equals(per2.name)){
return true;
}else{
return false;
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person(String name,int age){
//this(); //调用Person类的无参构造方法
this.setAge(age); //明确表示为类中的age属性赋值
this.setName(name); //明确表示为类中的name属性赋值
}
}
二.static关键字
static关键字是静态,全局的意思,它所修饰的属性可以被所有对象共享,它所修饰的方法可以被类调用。
1.使用static修饰属性
访问static修饰的属性时可以用类名访问
public class This {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Person per = new Person("李四",60);
Person per1 = new Person("张三",30);
Person per2 = new Person("王五",70);
per.get();
per1.get();
per2.get();
Person.country = "B城"; //使用类名访问static属性
per.get();
per1.get();
per2.get();
}
}
class Person{
private String name;
private int age;
static String country = "A城";
public Person(String name,int age){
//this(); //调用Person类的无参构造方法
this.age = age; //明确表示为类中的age属性赋值
this.name = name; //明确表示为类中的name属性赋值
}
public void get(){
System.out.println("姓名为"+this.name+"年龄为"+this.age+"城市为"+country);
}
}
Java中主要有四块内存区域,如下图:
2.使用static修饰方法
public class This {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Person per = new Person("李四",60);
Person per1 = new Person("张三",30);
Person per2 = new Person("王五",70);
per.get();
per1.get();
per2.get();
Person.setCountry("B城"); //使用类名调用static方法
per.get();
per1.get();
per2.get();
}
}
class Person{
private String name;
private int age;
static String country = "A城";
public Person(String name,int age){
//this(); //调用Person类的无参构造方法
this.age = age; //明确表示为类中的age属性赋值
this.name = name; //明确表示为类中的name属性赋值
}
public void get(){
System.out.println("姓名为"+this.name+"年龄为"+this.age+"城市为"+country);
}
public static String getCountry() {
return country;
}
public static void setCountry(String country) {
Person.country = country;
}
}
非static声明的方法可以调用static声明的属性和方法,但static声明的方法不能调用非static声明的属性和方法。
static可以统计一个类产生了多少实例对象,可以自动给对象编名。
三.代码块
代码块其实就是用"{}"括起来的一段代码,根据所在位置不同分四种。
- 普通代码块
- 构造代码块
- 静态代码块
- 同步代码块
普通代码块是指直接在方法或语句中定义的代码块
构造代码块是指直接写在类中的代码块
静态代码块使用static关键字声明的代码块
实例如以下:
public class Code {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
{
int x = 10;
System.out.println("普通代码块中x="+x);
}
int x = 100;
System.out.println("普通代码块外x="+x);
}
}
public class Code {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new Dome();
new Dome();
new Dome();
}
}
class Dome{
public Dome(){
System.out.println("构造方法");
}
{
System.out.println("构造代码块");
}
}
public class Code {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new Dome();
new Dome();
new Dome();
}
static{
System.out.println("在主程序所在类中定义的代码块");
}
}
class Dome{
public Dome(){
System.out.println("构造代码块");
}
{
System.out.println("普通代码块");
}
static{
System.out.println("静态代码块");
}
}