自动类型转换:小的数据类型可以自动转换为大的数据类型
如 long g=20;
double d=12.0f
强制类型转换:可以把大的数据类型强制转换(Casting)成小的数据类型
如 float f=(float)12.0;
int a=(int)1200L
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);
}
}
基本类型比较值:只要两个变量的值都相等,即为true
int a=5;if(a==6){...}
引用类型比较引用(是否指向头一个对象):只有指向同一个对象时,==才返回true
Person p1=new Person();
Person p2=new Person();
if(p1==p2){...}
用“==”进行比较时,符号两边的数据类型必须兼容(可自动转换的基本数据类型除外),否者编译出错。
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方法
字面量创建对象的时候,只在常量池创建一个对象,new的时候,常量池有对象,堆中也要有对象,字面量方法要比new省内存。
//练习
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));
}
}
(1)针对八种基本定义相应的引用类型——包装类(封装类)
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();
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);//将字符串转换成数字
主要应用:基本数据类型与字符串直接转化
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