java基礎(chǔ)的詳細(xì)了解第六天
1、this關(guān)鍵字
首先需要提醒的是,在整個(gè)Java之中,this是最麻煩的一個(gè)關(guān)鍵字,只要是代碼開發(fā),幾乎都離不開this。在Java中this可以完成三件事情:表示本類屬性、表示本類方法、表示當(dāng)前對(duì)象(只介紹概念)。
1.1 “this.屬性”表示本類屬性
在講解著一操作之前首先觀察如下程序:
class Person{ private String name; private int age; public Person(String n,int a){ name = n; age = a; } public String getInfo(){ return "姓名:"+name+","+"年齡:"+age; } } public class ThisText{ public static void main(String args[]){ Person per = new Person("張三",20); System.out.println(per.getInfo()); } }
這個(gè)時(shí)候的構(gòu)造方法的兩額參數(shù)的目的是為了類中的name和age兩額屬性初始化,可是這個(gè)方法上的兩個(gè)參數(shù)一個(gè)是字母n一個(gè)是字母a,什么意思?那么最好的做法,既然構(gòu)造方法的兩個(gè)參數(shù)是為了類中name和age初始化使用,那么最好將其參數(shù)名稱也定義為name和age才最為直觀。
public Person(String name,int age){ name = name; age = age; }
此時(shí)構(gòu)造方法中參數(shù)的名稱變得有意義了,但是這樣一來就出現(xiàn)問題了,發(fā)現(xiàn)屬性沒有內(nèi)容了!因?yàn)樵诔绦蛑惺遣捎谩皗}”作為分界,采用就近的取用原則,所以現(xiàn)在為了明確指定要操作的是類中屬性的話,那么應(yīng)該采用“this.屬性”的形式完成,代碼應(yīng)該變?yōu)椋?/p>
public Person(String name,int age){ this.name = name; //this.name 表示類中的屬性name this.age = age; }
提示:在日后的所有開發(fā)過程之中,如果要調(diào)用類中屬性的話,都要使用“this.屬性”的方式來調(diào)用。
1.2“this”表示調(diào)用本類方法
對(duì)于一個(gè)類之中的方法分為兩種:
1、普通方法:之前強(qiáng)調(diào)過,如果現(xiàn)在要調(diào)用的是本類之中的方法,則可以使用“this.方法()”調(diào)用。
2、構(gòu)造方法:調(diào)用其他構(gòu)造使用“this ()”調(diào)用。
例如:現(xiàn)在一個(gè)類之中存在了三個(gè)構(gòu)造方法(無參、有一個(gè)參數(shù)、有兩個(gè)參數(shù)),但是不管使用何種構(gòu)造方法,都要求在實(shí)例化對(duì)象產(chǎn)生的時(shí)候輸出一行提示信息:“歡迎光臨”。
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 String getInfo(){ return "姓名:"+name+","+"年齡:"+age; } } public class ThisText1{ public static void main(String args[]){ Person per = new Person(); System.out.println(per.getInfo()); } }
不過,遺憾的是按照之前的知識(shí)來講,此時(shí)的程序之中會(huì)出現(xiàn)大量的重復(fù)代碼,而這樣的方法不是最優(yōu)的。
這種情況下就可以利用this()來完成
class Person{ private String name; private int age; public Person(){ System.out.println("-----歡迎光臨-----"); } public Person(String name){ this(); //調(diào)用無參構(gòu)造方法 this.name = name; } public Person(String name,int age){ this(name); //調(diào)用有一個(gè)參數(shù)的構(gòu)造方法 this.age = age; } public String getInfo(){ return "姓名:"+name+","+"年齡:"+age; } public class ThisText1{ public static void main(String args[]){ Person per = new Person(); System.out.println(per.getInfo()); } }
使用this()就完成了構(gòu)造方法之間的互相調(diào)用。
**注意:**在使用this()調(diào)用構(gòu)造方法的時(shí)候有以下問題:
1、所有的構(gòu)造方法實(shí)在對(duì)象實(shí)例化的時(shí)候被默認(rèn)調(diào)用,而且是在調(diào)用普通方法之前調(diào)用,所以使用“this()”調(diào)用構(gòu)造方法的操作,一定要放在構(gòu)造方法的首行;
2、如果一個(gè)類之中存在了多種構(gòu)造方法的話,并且這些構(gòu)造方法都使用this()相互調(diào)用,那么至少要保證一個(gè)構(gòu)造方法沒有調(diào)用其他構(gòu)造,以作程序的出口。
1.3“this”表示當(dāng)前對(duì)象
class Dx{ public void fun(){ System.out.println("當(dāng)前對(duì)象:" + this); } } public class Ob{ public static void main(String args[]){ Dx dx = new Dx(); System.out.println(dx); dx.fun(); Dx dx1 = new Dx(); System.out.println(dx1); dx1.fun(); } }
1.4引用傳遞進(jìn)階分析
程序一
class Message{ private String num; public void setNum(String num){ this.num = num; } public String getNum(){ return num; } } public class TestDemo1{ public static void main(String args[]){ Message message = new Message(); message.setNum("100"); fun(message); //30 System.out.println(message.getNum()); } public static void fun(Message temp){ //引用傳遞 temp.setNum("30"); } }
程序二
public class TestDemo2{ public static void main(String args[]){ String str = "hello"; fun(str); //hello System.out.println(str); } public static void fun(String temp){ temp = "world"; } }
本程序的關(guān)鍵是:String的內(nèi)容一旦聲明則不可改變,改變的是內(nèi)存的地址指向。
1.5對(duì)象比較
對(duì)象的比較實(shí)際就是對(duì)象屬性的比較。
class Person{ private String name; private int age; public Person(String name,int age){ this.name = name; this.age = age; } public void setName(String name){ this.name = name; } public void setAge(int age){ this.age = age; } public String getName(){ return this.name; } public int getAge(){ return this.age; } } public class TestDemo3{ public static void main(String args[]){ Person per1 = new Person("張三",20); Person per2 = new Person("張三",20); //false System.out.println(per1==per2); //比較兩個(gè)對(duì)象的地址 //是同一個(gè)對(duì)象 if(per1.getName().equals(per2.getName())&&per1.getAge() == per2.getAge()){ System.out.println("是同一個(gè)對(duì)象"); } else{ System.out.println("不是同一個(gè)對(duì)象"); } } }
對(duì)象比較的操作一定是一個(gè)類自己本身所具備的功能,而且對(duì)象比較的操作特點(diǎn):
- 本類接收自己的引用,而后與本類當(dāng)前對(duì)象(this)進(jìn)行比較;
- 為了避免NullPointerException的產(chǎn)生,應(yīng)該增加一個(gè)null的判斷;
- 為了防止浪費(fèi)性能的情況出現(xiàn),可以增加地址數(shù)值的判斷,相同的對(duì)象地址相同;
- 之后與屬性依次進(jìn)行比較,如果屬性全部相同,則返回true,否則返回false。
1.6引用傳遞實(shí)際應(yīng)用
//電腦 class Computer{ private View []; private Host; } //顯示器 class View{ } //主機(jī) class Host{ private Board; } //主板 class Board{ private Cpu []; private Memory[]; private Disk[]; } //CPU class Cpu{ } //內(nèi)存 class Memory{ } //硬盤 class Disk{ } public class TestDemo3{ public static void main(String args[]){ } }
重點(diǎn) 1.7數(shù)據(jù)表與簡單Java類(一對(duì)多)
利用此關(guān)系模型,表示出emp和dept的關(guān)系,使用字段:
**emp表:**empno、ename、job、sal、comm、mgr、deptno;
**dept表:**deptno、dname、loc。
第一步 編寫實(shí)體類
class Emp{ private int empno; private String ename; private String job; private double sal; private double comm; public Emp(int empno,String ename,String job,double sal,double comm){ this.empno = empno; this.ename = ename; this.job = job; this.sal = sal; this.comm = comm; } public String getEmpInfo(){ return "【Emp】 empno = " + this.empno + ",ename = " + this.ename + ",job; = " + this.job + ",sal = " + this.sal + ",comm = " + this.comm; } } class Dept{ private int deptno; private String dname; private String loc; public Dept(int deptno, String dname, String loc){ this.deptno = deptno; this.dname = dname; this.loc = loc; } public String getDept(){ return "deptno = " + this.deptno + ",dname = " + this.dname + ",loc = " + this.loc; } } public class Exam1_7{ public static void main(String args[]){ } }
第二步 進(jìn)行關(guān)系設(shè)計(jì)
一個(gè)雇員屬于一個(gè)部門,需要追加部門引用
一個(gè)雇員有一個(gè)領(lǐng)導(dǎo),領(lǐng)導(dǎo)一定是自身關(guān)聯(lián)
一個(gè)部門有一個(gè)雇員,需要一個(gè)對(duì)象數(shù)組來描述多個(gè)雇員信息
class Emp{ private int empno; private String ename; private String job; private double sal; private double comm; private Emp mgr; //描述雇員的領(lǐng)導(dǎo) private Dept dept; //描述雇員的部門 public Emp(int empno,String ename,String job,double sal,double comm){ this.empno = empno; this.ename = ename; this.job = job; this.sal = sal; this.comm = comm; } public void setMgr(Emp mgr){ this.mgr = mgr; } public Emp getMgr(){ return this.mgr; } public void setDept(Dept dept){ this.dept = dept; } public Dept getDept(){ return this.dept; } public String getEmpInfo(){ return "【Emp】 empno = " + this.empno + ",ename = " + this.ename + ",job; = " + this.job + ",sal = " + this.sal + ",comm = " + this.comm; } } class Dept{ private int deptno; private String dname; private String loc; private Emp [] emps; //一個(gè)部門有多個(gè)雇員 public Dept(int deptno, String dname, String loc){ this.deptno = deptno; this.dname = dname; this.loc = loc; } public void setEmps(Emp [] emps){ this.emps = emps; } public Emp [] getEmps(){ return this.emps; } public String getDept(){ return "deptno = " + this.deptno + ",dname = " + this.dname + ",loc = " + this.loc; } } public class Exam1_7{ public static void main(String args[]){ } }
此時(shí)基本類定義完成。
第三步 開發(fā)需求
主函數(shù)main
public class Exam1_7{ public static void main(String args[]){ //第一步、設(shè)置類對(duì)象的關(guān)系 //1.分別創(chuàng)建各自對(duì)象實(shí)例化 Dept dept = new Dept(10,"市場部","New York"); Emp ea = new Emp(7345,"Rock","CLERK",800.0,0); Emp eb = new Emp(7567,"Joker","MANAGER",3050.0,0); Emp ec = new Emp(7825,"Ben","PRESIDENT",10000.0,0); //2.設(shè)置雇員和領(lǐng)導(dǎo)的關(guān)系 ea.setMgr(eb); eb.setMgr(ec); //ec沒有領(lǐng)導(dǎo) 自己就是最大的領(lǐng)導(dǎo) //3.設(shè)置雇員和部門的關(guān)系 ea.setDept(dept); eb.setDept(dept); ec.setDept(dept); //4.設(shè)置部門的雇員 dept.setEmps(new Emp[]{ea, eb, ec}); //第二步、進(jìn)行數(shù)據(jù)的取得 //一個(gè)部門有多個(gè)雇員 /* 【Emp】 empno = 7345,ename = Rock,job = CLERK,sal = 800.0,comm = 0.0 【Emp】 empno = 7567,ename = Joker,job = MANAGER,sal = 3050.0,comm = 0.0 【Emp】 empno = 7825,ename = Ben,job = PRESIDENT,sal = 10000.0,comm = 0.0 */ for(int i = 0; i < dept.getEmps().length; i++){ System.out.println(dept.getEmps()[i].getEmpInfo()); } System.out.println(); //一個(gè)雇員有一個(gè)領(lǐng)導(dǎo) //【Emp】 empno = 7567,ename = Joker,job = MANAGER,sal = 3050.0,comm = 0.0 System.out.println(ea.getMgr().getEmpInfo()); //【Emp】 empno = 7825,ename = Ben,job = PRESIDENT,sal = 10000.0,comm = 0.0 System.out.println(eb.getMgr().getEmpInfo()); //Exception in thread "main" java.lang.NullPointerException //沒有設(shè)置關(guān)系 所以自己是老板 顯示空指針異常 //System.out.println(ec.getMgr().getEmpInfo()); System.out.println(); //一個(gè)雇員屬于同個(gè)部門 //deptno = 10,dname = 市場部,loc = New York System.out.println(ea.getDept().getDeptInfo()); //deptno = 10,dname = 市場部,loc = New York System.out.println(eb.getDept().getDeptInfo()); //deptno = 10,dname = 市場部,loc = New York System.out.println(ec.getDept().getDeptInfo()); } }
在上面的代碼基礎(chǔ)上進(jìn)行改進(jìn)
//一個(gè)部門有多個(gè)雇員,一個(gè)雇員有一個(gè)領(lǐng)導(dǎo),一個(gè)雇員屬于同個(gè)部門 /* 【Emp】 empno = 7345,ename = Rock,job = CLERK,sal = 800.0,comm = 0.0 該雇員所屬的領(lǐng)導(dǎo)【Emp】 empno = 7567,ename = Joker,job = MANAGER,sal = 3050.0,comm = 0.0 該雇員所屬的部門deptno = 10,dname = 市場部,loc = New York ------------------------------------------------------------------ 【Emp】 empno = 7567,ename = Joker,job = MANAGER,sal = 3050.0,comm = 0.0 該雇員所屬的領(lǐng)導(dǎo)【Emp】 empno = 7825,ename = Ben,job = PRESIDENT,sal = 10000.0,comm = 0.0 該雇員所屬的部門deptno = 10,dname = 市場部,loc = New York ------------------------------------------------------------------ 【Emp】 empno = 7825,ename = Ben,job = PRESIDENT,sal = 10000.0,comm = 0.0 自己就是領(lǐng)導(dǎo) ------------------------------------------------------------------ */ for(int i = 0; i < dept.getEmps().length; i++){ System.out.println(dept.getEmps()[i].getEmpInfo()); if(dept.getEmps()[i].getMgr() != null){ System.out.println("該雇員所屬的領(lǐng)導(dǎo)" + dept.getEmps()[i].getMgr().getEmpInfo()); System.out.println("該雇員所屬的部門" + dept.getEmps()[i].getDept().getDeptInfo()); System.out.println("------------------------------------------------------------------"); } else{ System.out.println("自己就是領(lǐng)導(dǎo)"); System.out.println("------------------------------------------------------------------"); } }
1.8數(shù)據(jù)表與簡單Java類(多對(duì)多)
利用此關(guān)系模型,表示出student和course的關(guān)系,使用字段:
**student表:**stuid、name、age。
**course表:**cid、name、credit。
關(guān)系表:學(xué)生編號(hào)、課程編號(hào)、成績
要求:
可以找到一門課程,參加此次課程的所有學(xué)生信息和成績
可以根據(jù)一個(gè)學(xué)生,找到所參加的所有課程和沒門課程的一個(gè)成績
第一步 編寫實(shí)體類
class Student{ private int stuid; private String name; private int age; public Student(int stuid, String name, int age){ this.stuid = stuid; this.name = name; this.age = age; } public String getStuInfo(){ return "【Student】stuid = " + this.stuid + ",name = " + this.name + ",age = " +this.age ; } } class Course{ private int cid; private String name; private double credit; public Course(int cid, String name, double credit){ this.cid = cid; this.name = name; this.credit = credit; } public String getCouInfo(){ return "【Course】cid = " + this.cid + ",name = " + this.name + ",credit = " + this.credit; } } class StudentCourse{//學(xué)生選課 private Student student; private Course course; private double score; public StudentCourse(Student student, Course course, double score){ this.student =student; this.course = course; this.score = score; } public Student getStudent(){ return this.student; } public Course getCrouse(){ return this.course; } public double getScore(){ return this.score; } }
第二步 進(jìn)行關(guān)系設(shè)計(jì)
class Student{ private int stuid; private String name; private int age; private StudentCourse studentCourses []; public Student(int stuid, String name, int age){ this.stuid = stuid; this.name = name; this.age = age; } public void setStudentCourses(StudentCourse []studentCourses){ this.studentCourses = studentCourses; } public StudentCourse[] getStudentCourses(){ return this.studentCourses; } public String getStuInfo(){ return "【Student】stuid = " + this.stuid + ",name = " + this.name + ",age = " +this.age ; } } class Course{ private int cid; private String name; private double credit; private StudentCourse studentCourses[]; public Course(int cid, String name, double credit){ this.cid = cid; this.name = name; this.credit = credit; } public void setStudentCourses(StudentCourse []studentCourses){ this.studentCourses = studentCourses; } public StudentCourse[] getstudentCourses(){ return this.studentCourses; } public String getCouInfo(){ return "【Course】cid = " + this.cid + ",name = " + this.name + ",credit = " + this.credit; } } class StudentCourse{//學(xué)生選課 private Student student; private Course course; private double score; public StudentCourse(Student student, Course course, double score){ this.student =student; this.course = course; this.score = score; } public Student getStudent(){ return this.student; } public Course getCrouse(){ return this.course; } public double getScore(){ return this.score; } }
第三步 開發(fā)需求
主函數(shù)main
public class Exam1_8{ public static void main(String args[]){ //第一步、設(shè)置類對(duì)象的關(guān)系 //1.分別創(chuàng)建各自對(duì)象實(shí)例化 Student stu1 = new Student(107,"Rock",13); Student stu2 = new Student(108,"Joker",18); Student stu3 = new Student(109,"Perke",22); Course ca = new Course(1,"數(shù)據(jù)結(jié)構(gòu)",4.0); Course cb = new Course(2,"計(jì)算機(jī)操作系統(tǒng)",2.0); Course cc = new Course(3,"SSM框架集合",3.0); //2.設(shè)置學(xué)生和課程的關(guān)系 stu1.setStudentCourses(new StudentCourse[]{ new StudentCourse(stu1,ca,78.0), }); stu2.setStudentCourses(new StudentCourse[]{ new StudentCourse(stu2,ca,87.0), new StudentCourse(stu2,cb,79.0) }); stu3.setStudentCourses(new StudentCourse[]{ new StudentCourse(stu3,ca,90.0), new StudentCourse(stu3,cb,95.0), new StudentCourse(stu3,cc,99.0) }); //3.設(shè)置課程和學(xué)生的關(guān)系 ca.setStudentCourses(new StudentCourse[]{ new StudentCourse(stu1,ca,78.0), new StudentCourse(stu2,ca,87.0), new StudentCourse(stu3,ca,90.0) }); cb.setStudentCourses(new StudentCourse[]{ new StudentCourse(stu2,cb,79.0), new StudentCourse(stu3,ca,90.0) }); cc.setStudentCourses(new StudentCourse[]{ new StudentCourse(stu3,cc,99.0) }); //第二步、進(jìn)行數(shù)據(jù)的取得 //可以找到一門課程,參加此次課程的所有學(xué)生信息和成績 /* 【Course】cid = 1,name = 數(shù)據(jù)結(jié)構(gòu),credit = 4.0 學(xué)生名單:【Student】stuid = 107,name = Rock,age = 13,成績:78.0 學(xué)生名單:【Student】stuid = 108,name = Joker,age = 18,成績:87.0 學(xué)生名單:【Student】stuid = 109,name = Perke,age = 22,成績:90.0 */ System.out.println(ca.getCouInfo()); for(int i = 0 ;i < ca.getStudentCourses().length ; i++){ System.out.print("學(xué)生名單:"+ ca.getStudentCourses()[i].getStudent().getStuInfo()); System.out.println(",score = "+ ca.getStudentCourses()[i].getScore()); } System.out.println("--------------------------------------------------------------------"); //可以根據(jù)一個(gè)學(xué)生,找到所參加的所有課程和沒門課程的一個(gè)成績 /* 【Student】stuid = 109,name = Perke,age = 22 選課列表:【Course】cid = 1,name = 數(shù)據(jù)結(jié)構(gòu),credit = 4.0,score = 90.0 選課列表:【Course】cid = 2,name = 計(jì)算機(jī)操作系統(tǒng),credit = 2.0,score = 95.0 選課列表:【Course】cid = 3,name = SSM框架集合,credit = 3.0,score = 99.0 */ System.out.println(stu3.getStuInfo()); for(int i = 0; i < stu3.getStudentCourses().length ; i++){ System.out.print("選課列表:" + stu3.getStudentCourses()[i].getCourse().getCouInfo()); System.out.println(",score = "+ stu3.getStudentCourses()[i].getScore()); } } }
總結(jié)
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
使用@Autowired注解引入server服務(wù)層方法時(shí)報(bào)錯(cuò)的解決
這篇文章主要介紹了使用@Autowired注解引入server服務(wù)層方法時(shí)報(bào)錯(cuò)的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11JAVA隨機(jī)數(shù)隨機(jī)字母的實(shí)現(xiàn)(微信搶紅包小練習(xí))
這篇文章主要介紹了JAVA隨機(jī)數(shù)隨機(jī)字母的實(shí)現(xiàn)(微信搶紅包小練習(xí)),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04java開發(fā)_圖片截取工具實(shí)現(xiàn)原理
本文將詳細(xì)介紹java開發(fā)_圖片截取工具實(shí)現(xiàn)原理,需要了解的朋友可以參考下2012-11-11Java編程中二維數(shù)組的初始化和基本操作實(shí)例
這篇文章主要介紹了Java編程中二維數(shù)組的初始化和基本操作實(shí)例,是Java入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-10-10SpringBoot集成Swagger2構(gòu)建在線API文檔的代碼詳解
這篇文章主要介紹了SpringBoot集成Swagger2構(gòu)建在線API文檔,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12基于JDK8-lambda表達(dá)式四種forEach性能對(duì)比
這篇文章主要介紹了基于JDK8-lambda表達(dá)式四種forEach性能對(duì)比,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07解決swagger主頁訪問,返回報(bào)錯(cuò)500問題
在使用Swagger時(shí)遇到500錯(cuò)誤,通過仔細(xì)的debug發(fā)現(xiàn)問題源于注解使用不當(dāng),具體表現(xiàn)為一個(gè)接口的入?yún)⒈诲e(cuò)誤地注解了三個(gè)參數(shù),而實(shí)際上只有兩個(gè),這導(dǎo)致了Swagger在解析時(shí)拋出了NullPointerException異常,解決方法是刪除錯(cuò)誤的第三個(gè)參數(shù)的注解2024-09-09