this关键字初步探索

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44161038/article/details/96422332

this关键字

在Java中this关键字是一个比较麻烦的关键字,但是它经常会用到,所以说是一个挺重要的内容。this关键字的本质是指明确进行本类结构的标记,它有三个主要的功能。


  • 调用本类属性
  • 调用本类方法
  • 调用本类对象

1.调用本类属性

在定义的一个类中,方法可以直接访问属性,但是如果出现方法的参数名和属性名重复的情况,程序结果就会出问题。这时就需要this关键字,this.属性表示要明确调用类中的属性而不是调用方法的参数。

class Book{
  private String title;
  private double price;
 
  public Book(String title,double price){
      this.title=title;
      this.price=price;
  }

  public String getInfo(){
      return "书名:"+title+",价格:"+price;
 }
}
public class TestDemo{
  public static void main(String args[]){
     Book book=new Book("Java从入门到精通",85.9);
     System.out.println(book.getInfo());
  }
}

程序执行结果:书名:Java从入门到精通,价格:85.9

如果有参构造方法中的属性没有this关键字,程序的执行结果会出现问题(书名:null,价格:0.0),方法调用的会是方法的参数,所以结果就是属性的默认值。建议在以后编写代码的过程中不管是否出现重名的情况,一定都要加上“this”。

2.调用本类方法

  • 调用本类普通方法:如果要调用本类方法,则可以使用“this.方法()”调用;
  • 调用本类构造方法:在一个构造中要调用其他构造,可以使用“this()”调用。
示例:
class Book{
	private String title;
	private double price;
	
	public Book(){
		this("未知",0.0);
		
	}
	public Book(String title){
		this(title,10.2);
	}
	public Book(String title,double price){
		this.title=title;
		this.price=price;
	}
	public void setTitle(String title){
		this.title=title;
	}
	public void setPrice(double price){
		this.price=price;
	}
	public String getTitle(){
		return title;
	}
	public double getPrice(){
		return price;
	}
	
	public String getInfo(){
		return "书名:"+title+" 价格:"+price;
	}
}

public class ThisDemo{
	public static void main(String srgs[]){
		Book book1=new Book();
		Book book2=new Book("phython开发");
		Book book3=new Book("JAVA开发",89.9);
		System.out.println(book1.getInfo());
		System.out.println(book2.getInfo());
		System.out.println(book3.getInfo());
		
	}
}

注意事项:
  • 使用“this()”调用构造方法的代码只能放在构造方法的首行。
  • 进行构造方法互相调用时,一定要保留调用的出口。
    在使用this()互相调用构造方法时,要至少保留一个构造方法没有使用this()。这么做是为什么呢?是因为如果没有预留出口的话就会出现循环调用。

3.表示当前对象

当前对象就是当前正在调用类中的方法的实例化对象。下面通过一个另类的“Hello World!”程序来说明。

程序示例:
class A{
    private B b;
    private A(){  //2.执行A类的构造
       this.b=new B(this);  //3.为B类对象b实例化(this就是temp)
       this.b.get();        //6.调用B类的get方法
    }
    public void print(){    //9.调用此方法输出
       System.out.println("Hello World!");
    }
}
class B{
   private  A a;
   public BA,a){   //4.参数a就是temp
     this.a=a;        //5.保存a
   }
   public void get(){  //7.调用此方法
      this.a.print();  //8.this.a=temp
   }
}
public class TestDemo{
   public static void main(String args[]){
     A temp =new A();   //1.实例化A类对象,要调用A类的无参构造
   }
}

程序执行结果:Hello World!
展开阅读全文

编程乱码问题初步探索(分享)

08-14

作者:马顺仁 来源:《PHPer》杂志rn相信很多朋友在写程序的过程中都受到过乱码的骚扰,那么今天我就这个问题来同大家探讨一下。rn乱码的问题分为很多种,很多人一见到有乱码就开始骂mysql,其实很多情况下并不是mysql造成的。rn从乱码产生的原因来分析,乱码的产生一般有以下几种情况。rn1、网页编码与程序编码不一致的问题rn所谓的网页编码问题就是指你的html代码中定义的“charset”,例如以下这段代码:rnrn Chat Tutorial Applicationrn rn rn rn rn rn rn rnrn他设置了浏览器端采用gb2312的字符集,此时如果程序使用的是utf8的编码(就是指以什么样的编码来编写的程序,一般在编辑器中设置),那么就会产生乱码。rn此时的解决方法就是把charset的值改为utf8rn2、代码本身就存在乱码问题rn这种情况是指你的代码本身就存在乱码问题。照成这种情况的原因一般是你以另一种编码格式修改了你的代码后并做了保存,这样你的程序中就有几种编码形式的代码,那么输出的时候自然就会有乱码。这类问题相对来说比较容易解决,只要人工找到那段有乱码的代码,然后修改就行了(很多编辑器可以完成这个工作)。rn3、mysql的问题(此次讨论仅围绕mysql5.0之后的版本展开)rn现在再来看最容易照成乱码,也是最容易让人迷糊的mysql乱码问题。rn要说mysql乱码,得先从mysql的几个参数说起,从mysql5开始,多了几个设置字符集的系统变量:rncharacter_set_client 客户端字符集rncharacter_set_connection 客户端与服务器端连接采用的字符集rncharacter_set_results SELECT查询返回数据的字符集rncharacter_set_database 数据库采用的字符集rn乱码问题一般是由于以上几个变量设置错误照成的,很多人在请教乱码问题的时候,一般都会得到一个这样的答案:“你先set names一下”。rn那么set names是什么呢? set names实际上就是同时设置了character_set_client, character_set_connection, character_set_results这三个系统变量。rn例如set names 'gbk'等同于:rnset @@character_set_client = 'gbk'rnset @@character_set_connection = 'gbk'rnset @@character_set_results = 'gbk'rn很多情况下,这样设置了之后就能把乱码问题解决了。但是还是不能完全避免出现乱码的可能,为什么呢?rn因为character_set_client,character_set_connection这两个变量仅用与保证与character_set_database编码的一致,而character_set_results则用与保证SELECT返回的结果与程序的编码一致。rn例如,你的数据库(character_set_database)用的是utf8的字符集,那么你就要保证character_set_client,character_set_connection也是utf8的字符集。而你的程序也许采用的并不是utf8,比如你的程序用的是gbk,那么你若把character_set_results也设置为utf8的话就会出现乱码问题。此时你应该把character_set_results设置为gbk。这样就能保证数据库返回的结果与你的程序的编码一致。rn下面我给出一段用于设置字符集的代码(其中用到了一个我自己写的db库,相信应该不影响阅读):rnfetch_one('SELECT VERSION()'));rnif (substr($version, 0, 1) > 4) rnrn//取出当前数据库的字符集rn$sql = 'SELECT @@character_set_database';rn$char = current($db->fetch_one($sql));rn//将客户端字符集(character_set_client)和连接字符集(character_set_connection)设置为与数据库字符集(character_set_database)一致rn$db->query('SET @@character_set_client = "' . $char . '"');rn$db->query('SET @@character_set_connection = "' . $char . '"');rn//将SELECT查询返回数据的字符集设置为与当前程序的字符集一致rn$db->query('SET @@character_set_results = "' . $program_char . '"');rnrn?>rn到此应该就可以解决绝大多数我们遇到的乱码问题了,另外还必须强调的是,有时候乱码的出现有可能是以上几种原因混合造成的。rn对于这样的问题处理起来就比较的麻烦。因为首先要保证你在数据库中保存的数据的字符集与数据库的字符集是一致的。如果你在一个utf8的数据库中保存了GBK字符数据(如果你页面的编码与数据库的编码不一致,那么产生这个问题的可能性就很大),那么假设以上的设置都正确,结果还是会出现乱码的问题。不过这类问题一旦确定了产生的原因,那么就还是有办法解决的,比如刚才我举的这个例子。rn我们如果能确保其他环节的设置都是正确的,并且能够确认是由于把gbk的数据存到了utf8的rn数据库中而造成的乱码,那么我就可以把这些数据从数据库中取出来之后再用iconv()转换编码也是可以的。rn总而言之,我们应当尽量的保证数据库中的数据是正确的,那么问题处理起来就相对简单了。rn说了一大堆可能把你给弄迷糊了,我将其总结为以下四点,便于大家记忆。rnrn1、要保证数据库中存的数据与数据库编码一致,即数据编码与character_set_database一致;rn2、要保证通讯的字符集与数据库的字符集一致,即character_set_client, character_set_connection与character_set_database一致;rn3、要保证SELECT的返回与程序的编码一致,即character_set_results与程序编码一致;rn4、要保证程序编码与浏览器编码一致,即程序编码与 一致。rnrn关于作者 马顺仁: rn联系方式:msr182@163.comrn个人博客:http://www.phpchina.com/5853rn个人网站:http://blog.machineMa.cnrnrn浏览更多精彩文章请点击下载《PHPer》http://www.phpchina.com/phper/rn rn 论坛

没有更多推荐了,返回首页