您的位置:首页 > 编程语言 > Java开发

Java基础突击第三天0007(构造方法,匿名对象,this的使用)

2018-07-03 17:05 525 查看

构造方法需要注意:

1.构造方法的名称必须与类名一致。

2.构造方法的声明处不能有任何返回值类型声明。

3.构造方法中不应出现return返回一个值。

只要创建对象,就会调用构造方法。没有显式声明的构造方法则调用默认构造方法。

如果有显式的构造方法,则不会自动生成默认构造方法。

构造方法可以为创建的对象进行初始化。与普通方法一样,构造方法可以重载。

只要每个构造方法的参数类型或个数或排列顺序不同,即可实现重载。

public class TestJava{
}
class Person{
String name = null;
int age = 0;
public Person(String name,int age){
this.name = name;//name = name -> name == null;
this.age = age;  //age = age -> age ==0
}
public int getAge(){
return this.age;
}
public void tellInfo(){
System.out.println("Name:"+this.name+" ,Age:"+this.getAge());
}
}
class Demo{
  public static void main(String[] args){
Person per = new Person("FangXy",12);
per.tellInfo();
}//main
}//Demo
输出:

Name:null ,Age:0
Name:FangXy ,Age:0
Name:FangXy ,Age:12
Name:FangXy ,Age:12


匿名对象就是没有明确给出名字的对象。一般匿名对象只使用一次,而且匿名对象只在堆内存开辟空间,不存在栈内存中的引用。(一次性战士)比如new String("Hello")     new Person("FangXy",13)

匿名对象在实际开发中基本都是作为其他类实例化对象的参数传递的。


this用法有三种:

使用this调用本类属性和方法/用this调用本类的构造方法/表示当前对象

public class TestJava{
}
class Person{
String name = null;
int age = 0;
public Person(String name,int age){
this.name = name;//name = name -> name == null;
this.age = age;  //age = age -> age ==0
}
public int getAge(){
return this.age;
}
public void tellInfo(){
System.out.println("Name:"+this.name+" ,Age:"+this.getAge());
}
}
class Demo{
  public static void main(String[] args){
Person per = new Person("FangXy",12);
per.tellInfo();
}//main
}//Demo
如果用name替换this.name -> name值为null。 编译器分不清哪个name是参数,哪个name是成员属性。

事实上不加this的情况,因为就近原则,两个name和age都属于参数,而不是成员属性。

this.可以调用本类属性,使编译器识别this.name调用的是Person类中的name属性而不是括号中的name形参。

this.getAge()调用本类方法,获得数值。


this还可以调用构造方法,目的是为了提升代码复用性,不过由于在创建对象时调用构造方法。

因此在类的所有方法中,构造方法是被优先调用的。所以使用this调用构造方法必须放在构造方法的第一行。

另外,this()调用构造方法一定要留一个出口,出口构造方法不能用this(),所以一般都是将无参构造方法作为出口。

public class TestJava{
}
class Person{
String name = null;
int age = 0;
public Person(){
System.out.println("Create a new object!");
}
public Person(String name){
this();
this.name = name;
}
public Person(String name,int age){
this(name);
this.age = age;
}
public int getAge(){
return this.age;
}
public void tellInfo(){
System.out.println("Name:"+this.name+" ,Age:"+this.getAge());
}
}
class Demo{
public static void main(String[] args){
Person per = new Person();
per.tellInfo();
Person per1 = new Person("FangXy");
per1.tellInfo();
Person per2 = new Person("FangXy",12);
per2.tellInfo();
}//main
}//Demo
输出:

Create a new object!
Name:null ,Age:0
Create a new object!
Name:FangXy ,Age:0
Create a new object!

Name:FangXy ,Age:12


this表示当前对象的情况:

如果有name和age两个属性,要求产生两个Person对象,比较判断是否相等。有两个问题:

问题1怎么进行对象比较?2在哪进行对象比较?

问题1:从String的比较可以看出,对象比较需要先看看两个对象引用地址是否相同,不同则再比较其内容,及所有属性的值。

问题2:既然是对象之间的比较,全部压在main方法中总归是不合适的吧。

如果A想要判断B是否和自己相等,则肯定是由A发出的请求,所以比较的方法应该存在于A,B所属的类中,而不是在main中。

回忆String对象的比较,str1.equasl(str2)  可以设想出用 per1.compares(per2)来比较两个对象是否相等。

public class TestJava{
}
class Person{
String name = null;
int age = 0;
public Person(String name,int age){
this.name = name;
this.age = age;
}
public int getAge(){
return this.age;
}
public String getName(){
return this.name;
}
public boolean compare(Person perT){
Person per1 = this;  //who invokes the compre function
Person per2 = perT;   //who is just dragged to the circumstance
if(per1 == per2){
return true;
}else if(per1.name.equals(per2.name)&&per1.age==per2.age){
return true;
}else{
return false;
}
}
}
class Demo{
public static void compareFunc(Person perA,Person perB){
Person per1 = perA;
Person per2 = perB;
if(per1.compare(per2)){
System.out.println("Two objects are equal!");
}else{
System.out.println("Two objects are not equal!");
}
}
        public static void main(String[] args){
Person per1 = new Person("FangXy",12);
Person per2 = new Person("FangXy",12);
Person per3 = new Person("FuXs",13);
Person per4 = per3;
compareFunc(per1,per2);
compareFunc(per1,per3);
compareFunc(per3,per4);
}//main
}//Demo












阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐