# Day06-Java基础_此时构造方法中参数的名称变得有意义了,但是这样一来就出现问题了,发现属性没有内

}

}


这个时候的构造方法的两额参数的目的是为了类中的name和age两额属性初始化,可是这个方法上的两个参数一个是字母n一个是字母a,什么意思?那么最好的做法,既然构造方法的两个参数是为了类中name和age初始化使用,那么最好将其参数名称也定义为name和age才最为直观。



public Person(String name,int age){
name = name;
age = age;
}


此时构造方法中参数的名称变得有意义了,但是这样一来就出现问题了,发现属性没有内容了!因为在程序之中是采用“{}”作为分界,采用就近的取用原则,所以现在为了明确指定要操作的是类中属性的话,那么应该采用“this.属性”的形式完成,代码应该变为:



public Person(String name,int age){
this.name = name; //this.name 表示类中的属性name
this.age = age;
}


提示:在日后的所有开发过程之中,如果要调用类中属性的话,都要使用“this.属性”的方式来调用。


###### 1.2“this”表示调用本类方法


对于一个类之中的方法分为两种:


1、普通方法:之前强调过,如果现在要调用的是本类之中的方法,则可以使用“this.方法()”调用。


2、构造方法:调用其他构造使用“this ()”调用。


例如:现在一个类之中存在了三个构造方法(无参、有一个参数、有两个参数),但是不管使用何种构造方法,都要求在实例化对象产生的时候输出一行提示信息:“欢迎光临”。



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());
}
}


不过,遗憾的是按照之前的知识来讲,此时的程序之中会出现大量的重复代码,而这样的方法不是最优的。


这种情况下就可以利用this()来完成



class Person{
private String name;
private int age;
public Person(){
System.out.println(“-----欢迎光临-----”);
}
public Person(String name){
this(); //调用无参构造方法
this.name = name;
}
public Person(String name,int age){
this(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());
}
}


使用this()就完成了构造方法之间的互相调用。


\*\*注意:\*\*在使用this()调用构造方法的时候有以下问题:


1、所有的构造方法实在对象实例化的时候被默认调用,而且是在调用普通方法之前调用,所以使用“this()”调用构造方法的操作,一定要放在构造方法的首行;


2、如果一个类之中存在了多种构造方法的话,并且这些构造方法都使用this()相互调用,那么至少要保证一个构造方法没有调用其他构造,以作程序的出口。


###### 1.3“this”表示当前对象



class Dx{
public void fun(){
System.out.println(“当前对象:” + 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();
}
}


![image-20210731192229637](https://img-blog.csdnimg.cn/img_convert/ce593b5155c8b79eec00b1edaaa85ccd.png)


###### 1.4引用传递进阶分析



> 
> 程序一
> 
> 
> 



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”);
}
}


![image-20210731193715762](https://img-blog.csdnimg.cn/img_convert/710f1c544af00ef52f4bd723d874c647.png)



> 
> 程序二
> 
> 
> 



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”;
}
}


本程序的关键是:String的内容一旦声明则不可改变,改变的是内存的地址指向。


![image-20210731200941440](https://img-blog.csdnimg.cn/img_convert/89992484d9d1d1d28fcb4cd34ed24159.png)


###### 1.5对象比较


对象的比较实际就是对象属性的比较。



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); //比较两个对象的地址

	//是同一个对象
	if(per1.getName().equals(per2.getName())&&per1.getAge() == per2.getAge()){
		System.out.println("是同一个对象");
	}
	else{
		System.out.println("不是同一个对象");
	}
}

}


对象比较的操作一定是一个类自己本身所具备的功能,而且对象比较的操作特点:


1 本类接收自己的引用,而后与本类当前对象(this)进行比较;


2 为了避免NullPointerException的产生,应该增加一个null的判断;


3 为了防止浪费性能的情况出现,可以增加地址数值的判断,相同的对象地址相同;


4之后与属性依次进行比较,如果属性全部相同,则返回true,否则返回false。


###### 1.6引用传递实际应用



//电脑
class Computer{
private View [];
private Host;

}
//显示器
class View{

}
//主机
class Host{
private Board;

}
//主板
class Board{
private Cpu [];
private Memory[];
private Disk[];
}
//CPU
class Cpu{

}
//内存
class Memory{

}
//硬盘
class Disk{

}
public class TestDemo3{
public static void main(String args[]){

}

}


##### 重点


###### 1.7数据表与简单Java类(一对多)


利用此关系模型,表示出emp和dept的关系,使用字段:


​ \*\*emp表:\*\*empno、ename、job、sal、comm、mgr、deptno;


​ \*\*dept表:\*\*deptno、dname、loc。


###### 第一步 编写实体类



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[]){

}

}


###### 第二步 进行关系设计


一个雇员属于一个部门,需要追加部门引用


一个雇员有一个领导,领导一定是自身关联


一个部门有一个雇员,需要一个对象数组来描述多个雇员信息



class Emp{
private int empno;
private String ename;
private String job;
private double sal;
private double comm;
private Emp mgr; //描述雇员的领导
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; //一个部门有多个雇员
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[]){

}

}


此时基本类定义完成。


###### 第三步 开发需求


主函数main



public class Exam1_7{
public static void main(String args[]){
//第一步、设置类对象的关系
//1.分别创建各自对象实例化
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.设置雇员和领导的关系
ea.setMgr(eb);
eb.setMgr(ec); //ec没有领导 自己就是最大的领导
//3.设置雇员和部门的关系
ea.setDept(dept);
eb.setDept(dept);
ec.setDept(dept);
//4.设置部门的雇员
dept.setEmps(new Emp[]{ea, eb, ec});
//第二步、进行数据的取得
//一个部门有多个雇员
/*
【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();

	//一个雇员有一个领导 
	//【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 
	//没有设置关系 所以自己是老板 显示空指针异常
	//System.out.println(ec.getMgr().getEmpInfo());
	System.out.println();
	
	//一个雇员属于同个部门
	//deptno = 10,dname = 市场部,loc = New York

总结

我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。实际上,作为程序员,丰富自己的知识储备,提升自己的知识深度和广度是很有必要的。

Mybatis源码解析

加入社区:https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0
getEmpInfo());
//Exception in thread “main” java.lang.NullPointerException
//没有设置关系 所以自己是老板 显示空指针异常
//System.out.println(ec.getMgr().getEmpInfo());
System.out.println();

	//一个雇员属于同个部门
	//deptno = 10,dname = 市场部,loc = New York

总结

我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。实际上,作为程序员,丰富自己的知识储备,提升自己的知识深度和广度是很有必要的。

Mybatis源码解析

[外链图片转存中…(img-clS1SsYO-1725600785443)]

[外链图片转存中…(img-vlQKwLfd-1725600785444)]

加入社区:https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值