Java笔记(9)类型转换与包装类

Java笔记(9)类型转换与包装类

文章目录

  • Java笔记(9)类型转换与包装类
    • 对象类型转换(Casting)
      • 基本数据类型的Casting:
      • 对Java对象的强制类型转换称为造型
      • ==操作符与equals方法
        • ==:
        • equals():
    • String对象的创建
      • 代码练习题
    • 包装类(Wrapper)
      • 基本数据类型包装成包装类的实例--装箱
      • 获得包装类对象中包装的基本类型变量 ---拆箱
      • 字符串转换为基本数据类型
      • 基本数据类型转换为字符串
      • 包装类用法举例
        • 基本数据类的包装类
        • toString的使用代码:
    • 常见端口

对象类型转换(Casting)

基本数据类型的Casting:

自动类型转换:小的数据类型可以自动转换为大的数据类型

long g=20; 
   double d=12.0f

强制类型转换:可以把大的数据类型强制转换(Casting)成小的数据类型

float f=(float)12.0;
   int a=(int)1200L

对Java对象的强制类型转换称为造型

1.从子类到父类的类型转换可以自动进行

2.从父类到子类的类型转换必须通过造型(强制转换)实现

3.无继承关系的引用类型间的转换是非法的

//代码举例:
package day08;

public class Test {
   public static void main(String[] args) {
	   
	   //object是所有类的最高父类
	   
	   String s="hello";
	   Object obj=s;  //从子类到父类的类型转换可以自动进行
	   System.out.println(obj);
   
	   Object obj="hello";
	   String s=(String) obj;//从父类到子类的类型转换必须通过造型(强制转换)实现
	   System.out.println(s);
   }
}

Java笔记(9)类型转换与包装类_第1张图片

==操作符与equals方法

==:

基本类型比较值:只要两个变量的值都相等,即为true

int a=5if(a==6){...}

引用类型比较引用(是否指向头一个对象):只有指向同一个对象时,==才返回true

Person p1=new Person();
Person p2=new Person();
 if(p1==p2){...}

用“==”进行比较时,符号两边的数据类型必须兼容(可自动转换的基本数据类型除外),否者编译出错。

equals():

1.所有类都继承了Object,也就获得了equals()方法,还可以重写。

2.只能比较引用类型,其作用于“==”相同,比较是否指向同一个对象。

3.格式: obj1.equals(obj2)

特例:当用equals()方法进行比较是,对类file,String,Date及包装类(Wrapper Class)

来说,是比较类型及内容而不考虑引用的是否是同一个对象;

​ 原因:这些类中重写了Object类的equals()方法。

对于对象来说:

(1)特殊的类,如:file,String,Date及包装类(Wrapper Class),使用==比较的是对象(对象的地址),equals比较的内容。

(2)处理特殊的类之外的其他普通的类的对象,==和equals比较的都是对象(对象的内存地址)

(3)如果你想改变某一个类的equals,不想用equals来比较对象的内存地址,就需要重写equals方法

String对象的创建

字面量创建对象的时候,只在常量池创建一个对象,new的时候,常量池有对象,堆中也要有对象,字面量方法要比new省内存。
Java笔记(9)类型转换与包装类_第2张图片

//练习
Person p1=new Person();//字面量复制,实际上都是引用的字符串常量池里的同一个字符串
p1.name="atguigu";

person p2=new Person();
p2.name="atguigu";

System.out.println(p1.name.equals(p2.name));//ture,name属性是字符串
System.out.println(p1.name.==p2.name);//true
System.out.println(p1.name.=="atguigu");

String s1=new String("bde");

String s2=new String("bde");
System.out.println(s1==s2); //false
//==比较的内存地址,new的方法是堆中生成两个String对象

代码练习题

1.编写Order类,有int型的orderID,String型的orderName,相应的getter()和setter()方法,两个参数的构造器,重写父类的equals()方法:public boolean equals(Object obj),并判断测试类中创建的两个对象是否相等。

//代码示例
package day08;
//Order.java
public class Order {
   public Order(int orderID,String orderName) {
	   this.orderID=orderID;
       this.orderName=orderName;   
   }
	int orderID;
  String orderName;
  public int getOrderID() {
	return orderID;
  }

  public void setOrderID(int orderID) {
	this.orderID = orderID;
  }

  public String getOrderName() {
	return orderName;
  }

  public void setOrderName(String orderName) {
	this.orderName = orderName;
  }
  
  @Override
	public boolean equals(Object obj) {
		boolean flag=false;
	  if(obj instanceof Order) {
		  Order o=(Order) obj;
	      if(this.orderID == o.orderID && this.orderName.equals(o.orderName)) {
	    	  flag=true;
	      }
	  }
		return flag;
	}
}

package day08;
//Test.java
public class Test {
   public static void main(String[] args) {

	   Order o1=new Order(123,"A001");
	   
	   Order o2=new Order(123,"A002"); 
	   
	   System.out.println(o1.equals(o2));
     }
   }


2.请根据一下代码自定义能满足需要的MyDate类,在MyDate类中覆盖equals方法,使其判断当两个MyDate类型对象的年月日都相同时,结果为true,否则为false。

public boolean equals(Object o)
package day08;
//MyDate.java
public class MyDate {
    public MyDate(int year,int month,int day) {
    	this.year=year;
    	this.day=day;
    	this.month=month;
    }
	  
	int year;
	int month;
	int day;
	
	@Override
	public boolean equals(Object obj) {
		
		int flag=1;
		/**
		 * flag现在的值是0,如果要是有一组值不相等,就会+1;
		 * 如果全都不相等flag就是3,2个不相等就2
		 * 只有全都相等,flag才是0
		 */
		if(obj instanceof MyDate) {
			MyDate md=(MyDate) obj;
			flag=0;
			
			if(this.year!=md.year) {
				flag+=1;
				
			}
			
			if(this.month!=md.month) {
				flag+=1;
				
			}
		
		
			if(this.day!=md.day) {
				flag+=1;
				
			}
		}
		
		if(flag==0) {
			return true;
		}else {
			return false;
		}
		
	}
}


package day08;
//Test.java
public class Test {
   public static void main(String[] args) {

	   MyDate m1=new MyDate(2030,11,23);
	   MyDate m2=new MyDate(2030,11,13);
	   
	   System.out.println(m1.equals(m2));
     }
   }

包装类(Wrapper)

(1)针对八种基本定义相应的引用类型——包装类(封装类)

(2)有了类的特点,就可以调用类中的方法
Java笔记(9)类型转换与包装类_第3张图片

基本数据类型包装成包装类的实例–装箱

1.通过包装类的构造器实现:

int i=0;  Integer t=new Interger(i);

2.还可以通过字符串参数构造包装类对象:

Float f=new Float("4.56");
Long l=new Long("asdf");//NumberFormatException

获得包装类对象中包装的基本类型变量 —拆箱

1.调用包装类的.xxValue()方法:

boolean b=bObj.booleanValue();
  1. JDK1.5之后,支持自动装箱,自动拆箱。但类型必须匹配。
 Integer i1=112;//自动装箱
	   int i0=i.intValue();
	   int i2=i1;//自动拆箱

字符串转换为基本数据类型

1.通过包装类的构造器实现:

int i=new Integer("12");

2.通过包装类的parseXxx(String s)静态方法:

Float f=Float.parseFloat("12.1");

基本数据类型转换为字符串

1.调用字符串重载的valueOf()方法:

String fstr =String.valueOf(2.34f);

2.更直接的方式:

String intStr=5+""

包装类用法举例

int i=500;
Integer t =new Integer(i);

装箱:包装类使得一个基本数据类型的数据变成了类。

有了类的特点,可以调用类中的方法

String s=t.toString();//s="500",t是类,有toString方法
String s1=Inter.toString(314);//s1="314"将数字转换成字符串
String s2="4.56";
double ds=Double.parseDouble(s2);//将字符串转换成数字

基本数据类的包装类

主要应用:基本数据类型与字符串直接转化

toString的使用代码:

package day08;
//Test.java
public class Test {
   public static void main(String[] args) {
  
	   //父类Object的toString方法就输出当前对象的内存地址
	   //如果想要输出类的其他信息,重写toString方法即可
	   MyDate m=new MyDate(2030,12,31);
	   System.out.println(m.toString());
	   System.out.println(m);//打印M对象相当于打印m.toString()对于其他对象也是如此
     }
   }

package day08;
//MyDate.java
public class MyDate {
    public MyDate(int year,int month,int day) {
    	this.year=year;
    	this.day=day;
    	this.month=month;
    }
	  
	int year;
	int month;
	int day;
	
	@Override
	public boolean equals(Object obj) {
		
		int flag=1;
		/**
		 * flag现在的值是0,如果要是有一组值不相等,就会+1;
		 * 如果全都不相等flag就是3,2个不相等就2
		 * 只有全都相等,flag才是0
		 */
		if(obj instanceof MyDate) {
			MyDate md=(MyDate) obj;
			flag=0;
			
			if(this.year!=md.year) {
				flag+=1;
				
			}
			
			if(this.month!=md.month) {
				flag+=1;
				
			}
		
		
			if(this.day!=md.day) {
				flag+=1;
				
			}
		}
		
		if(flag==0) {
			return true;
		}else {
			return false;
		}
		
	}
	//重写toString方法
	@Override
	public String toString() {
		String str=this.year+"-"+this.month+"-"+this.day;
		return str;
	}
}

常见端口

HTTP协议代理服务器常用端口号:80/8080/3128/8081/9080

FTP(文件传输)协议代理服务器常用端口号:21

Telnet(远程登录)协议代理服务器常用端口:23

TFTP(Trivial File Transfer Protocol),默认端口号为:69/udp

SSH(安全登录),SCP(文件传输)、端口重定向,默认端口为22/tcp;

SMTP(Simple Mail Transfer Protocol) (E-mail),默认端口号为25/tcp(木马Antigen

Email Password Sender、Haebu Coceda、Shtrilitz Stealth、WinPC、WinSpy都开放这个端口);

POP3 (post office Protocol(Email)),默认端口号为110/tcp

TOMCAT,默认端口号为8080;

WIN2003远程登录,默认端口号为3389;

Oracle数据库,默认端口为1521;

MS SQL *SERVER数据库server,默认端口号为1433/tcp 1433/udp

QQ默认端口号为1080/udp

RDP服务:3389

serveru端口号:43958

你可能感兴趣的