API(应用程序编程接口)
* public final Class getClass();//返回Object的运行类(java的反射机制学)
* Class类中有一个类
*public String getName();//以String类型返回它所表示的实体(获取当前正在运行的类 的全路径)
* Integer类中有一个方法
public static String toHexString(int i);//将一个int类型的数据转换成一个人十六进制的 字符串表示形式
* Object类:
类层次的根类。所有的对象(包括数组,都实现这个类的方法)
* public int hashCode();
返回该对象的哈希码值
hashCode------->通过哈希算法(哈希表:hashtable)------>地址值(不是实际意义 上的地址)
* toString();
返回对象的一个字符串表示(返回以文本方式表式表示的一个次对象的字符串)
建议所有的子类都重些这个方法:
toString();源码:
public String toString(){
return getClass().getName()+"@"+Integer.toHexString(hashCode());
}//隐藏this
toString()<==>对象名。 getClass().getName()+"@"+Integer.toHexString(hashCode())
如果直接对象名称想要显示成员变量的值,必须重些Object类中的toString方 法//Alt+Shift+b----->s(自动生成)
package object; public class Student extends Object { private String name; private int age ; public Student() { super(); } public Student(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Student [name=" + name + ", age=" + age + "]"; } } //测试类 public class ObjectDemo { public static void main(String[]args){ Student st=new Student(); System.out.println(st.hashCode());//每次运行结果不相同 System.out.println("hello".hashCode());//字符串的hashCode值每次运行结果不变 System.out.println(st.getClass());//返回Object的运行类 System.out.println(st.getClass().getName());//获取全路径名称 Student st1=new Student("弋痕夕",24); //System.out.println(st1.toString());如果不重写toString() //这个方法就相当于st.getClass().getName()+"@"+Integer.toHexString(hashCode()) //结果是[email protected] System.out.println(st1.toString());//重写过后运行结果如下 } }
//运行结果
* x.equals(y)//返回值为boolean类型
“==”和equals()方法的区别?
“==”默认比较地址
equals()方法底层是通过“==”来实现的;默认比较的是两个对象的地址值,如 重写equals方法则比较的是两个对象的内容是否相同
源码:
public boolean equals(Object obj){
return(this==obj);
}
package object; public class Student1 { private String name; private int age ; public Student1() { super(); } public Student1(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } //Shift+Alt+s——>h快捷键重写equals()方法 @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Student1 other = (Student1) obj; if (age != other.age) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } } public class EqualsDemo { public static void main(String[] args){ //创建两个对象 Student1 st=new Student1("天净沙",45); Student1 st1=new Student1("天净沙",45); System.out.println(st==st1);//“==”默认比较的是两个对象的地址:false Student1 st2=st;//将st指向的地址值赋给st2;所以st与st2指向同一个地址 System.out.println(st==st2); //System.out.println(st.equals(st1));底层是由"=="实现,不重写则等价于“==”:false System.out.println(st.equals(st1));//重写后默认this.变量:表示当下传入的值所以返回true } }
//运行结果
* protected void finalize()throws Throwable:当垃圾回收器确定不存在对该对象的 更多引用时,由对象的垃圾回收器调用此方法,但是,什么时候调用垃圾回收器
不确定;
* protected Object clone()创建并返回此对象的一个副本
throws CloneNotSupportedException
注意事项:
Object 类的 clone 方法执行特定的复制操作。首先,如果此对象的类不能实现接 口 Cloneable,则会抛出 CloneNotSupportedException。
* Scanner类:
创建文本扫描器(键盘录入)
Scanner sc=new Scanner(System.in);(创建录入对象)
* 开发步骤:
创建录入对象
录入数据
输出
* nextInt();录入int类型
nextLine();录入一个字符串类型
有时候录入时会出现异常:java.util.InputMismatchException.(输入和想得到的 数据类型不匹配)
* public static final InputStream in;(标准输入流)
* public static final OutputStream out;(标准输出流)
* hasNeatXX();在录入之前,加上判断功能,判断是否有下一个可以录入的XX类型的数 据
*Scanner类的注意事项:
先录入int;类型数据在录入String类型数据,第二次录入没有接收到,直接输出了结果
这是因为再输入一次后回车才能输入第二次,由于第二次输入的是字符串,回车会导致第
二次输入失败。
解决方案:
在第二次输入前重新创建键盘录入对象
package scanner; import java.util.Scanner; public class ScannerDemo { public static void main(String[] args){ Scanner sc=new Scanner(System.in); System.out.println("请输入字符串:"); String str=sc.nextLine();//先录入String后录入int类型,没有问题 System.out.println("请输入整形数:"); int num=sc.nextInt(); System.out.println(str+"---"+num); System.out.println("----------------"); System.out.println("请输入整形数:"); int num1=sc.nextInt(); System.out.println("请输入第二个整形数:"); int num2=sc.nextInt(); System.out.println(num1+"---"+num2); System.out.println("----------------"); System.out.println("请输入整形数:"); int num3=sc.nextInt();//先录入int后录入String,由于回车才能接收数据的原因直接输出int类型的值 System.out.println("请输入字符串:"); String str1=sc.nextLine(); System.out.println(num3+"---"+str1); System.out.println("----------------"); System.out.println("请输入字符串:"); String str2=sc.nextLine();//正常输入 System.out.println("请输入第二个字符串:"); String str3=sc.nextLine();//正常输入 System.out.println(str2+"---"+str3); System.out.println("----------------"); //上述问题的解决方法 System.out.println("请输入整形数:"); int num4=sc.nextInt(); System.out.println("请输入字符串:"); Scanner sc1=new Scanner(System.in); String str4=sc1.nextLine(); System.out.println(num4+"---"+str4); System.out.println("----------------"); } }
*String类型:
字符串类:所有的字符串字面值(如“abc”“[”……)都作为此类的实例实现
字符串为常量,创建后其值不可以改变。
package string; public class StringDemo { public static void main(String[] args) { //定义一个字符串常量(在字符串常量池中如果有这个字符串则给出它的地址 //如果没有,就重新定义一个字符串,并给出它的地址) String s = "hello" ; change(s) ; //输出字符串变量 System.out.println("s:"+s); s += "world" ; //s=“helloword”;并没有改变常量池中的“hello”,是在常量池中重新开辟 //了空间存新的放字符串“helloword”,并将他的地址赋给s; System.out.println("s:"+s);//输出s为helloword } public static void change(String s) { //String类型作为形式参数和基本数据类型的效果一样,无论对形参进行什 //么样的操作都不会对实参产生影响 s += "javase" ; } }
*String类常用的构造方法:
public String():表示一个空字符序列。
public String(byte[] bytes,Charset ch):默认字符集(编码格式):GBK,如果是GBK 格式,可以不写第二个参数
public String(byte[] bytes,int index,int length):将部分字节数组构造成一个 字符串
public String(char[] value):将字符数组构造成一个字符串
public String(char[] value,int index,int length):将部分的字符数组构造成一 个字符串
public String(String original):通过字符串常量构造一个字符串对象
获取字符串的长度功能: public int length()
*面试题:
*数组中有没有length()有length属性,(字符串缓冲区:StringBuffer)中没有 length(),字符串中有length()
*String s="hello";和String s=new String("hello");两个有什么区别?分别创建了几 个对象?
第一个创建了一个对象
第二个创建了两个对象(堆内存中有new String(),然后字符串常量池中会有一个字符 串常量"hello")
* String类的转换功能(重点)
*byte[] getBytes():将字符串转换字节数组
* 编码和解码:一定要保证编码格式一致
编码:
把能看懂的东西转换成一个看不懂的东西:
String----->byte[]:public byte[] getBytes(String charsetName)
解码:
把当前的byte[]转成能看懂的东西(String):
byte[]----->String:public String(byte[] bytes,CharsetName ch)
package string; import java.io.UnsupportedEncodingException; import java.util.Arrays; public class StringDemo3 { public static void main(String[] args) throws UnsupportedEncodingException{ //创建String对象空参 String str=new String(); //获得Str的长度并输出 System.out.println("str.length():"+str.length()); System.out.println("str:"+str); System.out.println("----------------"); //创建对象并初始化 String str1=new String("hello"); System.out.println("str1.length():"+str1.length()); System.out.println("str1:"+str1); //定义数组 byte[] bt={65,66,67,68,69,70,}; String str2=new String(bt); System.out.println("str2:"+str2); System.out.println("str2.length()"+str2.length()); System.out.println("-------------------"); String str3="明天有雨"; byte[] bt2=str3.getBytes("utf-8"); byte[] bt3=str3.getBytes(); //编码 System.out.println(bt2);//输出一个地址值,原因是没有重toString方法 //Arrays.toString();将变量转化成字符串形式;源代码重写了toString();输出bt2的内容 System.out.println(Arrays.toString(bt2)); System.out.println(Arrays.toString(bt3)); System.out.println("-------------------"); //解码 String str4= new String(bt2) ;//编码格式不匹配;输出乱码 System.out.println("str4:"+str4); String str5=new String(bt2,"utf-8");//使用“utf-8”格式编码后面解码也必须用“utf-8”格式 System.out.println("str5:"+str5); String str6=new String(bt3);//如果使用“GBK”格式编码,则不需要写明第二个参数,它是默认的 System.out.println("str6:"+str6); } }
*char[] toCharArray():将字符串转换成 字符数组 (开发中经常使用)
*static String valueOf(char[] chs):将字符数组转换成字符串
*static String valueOf(int i):将一个int类型的数据转换成字符串
注意:
String类中的valueOf()可以将任何数据类型转换成字符串
*String toLowerCase():将字符串全部转成小写
*String toUpperCase():将字符串全部转换成大写
*String concat(String str):字符串拼接方法
package string; public class StringDemo4 { public static void main(String[] args){ //定义一个字符串 String str="Helloword"; System.out.println(str); //将字符串转换成 字符数组 char []ch=str.toCharArray(); //遍历数组 for(int i=0;i<ch.length;i++){ System.out.print(ch[i]+" "); } System.out.println(""); System.out.println("---------------"); //将字符数字转换成字符串 String str1=String.valueOf(ch); System.out.println(str1+" "); //将int类型数据转换成字符串 String str2=String.valueOf(50); System.out.println(str2); //将字符串全部转换成大写 System.out.println("toUpperCase:"+str.toUpperCase()); //将字符串全部转换成小写 System.out.println("toLowerCase:"+str.toLowerCase()); //字符串的拼接 String str3="---javase"; System.out.println(str.concat(str3)); } }
方法递归:方法调用本身的一种现象
三个条件:
1)需要定义个方法
2)方法必须有出口条件
3)必须有某一种规律
package homework; public class FactorialDemo { public static void main(String[] args){ int num=10; System.out.println("10!="+getSum(num)); } public static int getSum(int num){ // 1!=1 2!=1*2 3!=2!*3 4!=3!*4 5!=4!*5 //基数从一开始 int factorial=1; //求阶乘的和 for(int i=1;i<=num;i++) { //求阶乘 factorial*=i; } return factorial; } }