DAY10

DAY 10

内容回顾

1 返回值和形式参数的问题

主要研究就是引用类型作为返回值或者形式参数

形式参数:

(具体类):需要该类的具体对象

抽象类:需要该抽象类的子类对象

接口:需要的是该接口的子实现类对象   实际开发中(该方式比较多)

返回值:

(具体类):返回该类对象

抽象类:返回该抽象类的子类对象 (匿名对象的方式)

接口:返回的是该接口的子实现类对象  (接口的匿名内部类的方式)

2 内部类

成员内部类(非静态的):

在一个类的成员位置定义这样一个类

成员内部类访问它自己类中的成员方法:

外部类名.内部类名 对象名 = 外部类对象.内部类对象;

静态的成员内部类要访问它自己的类中的成员方法

静态的成员内部类要访问外部类的成员,该成员需要静态修饰

外部类名.内部类名  对象名 = new 外部类名.内部类名() ;

局部内部类

在一个类的局部位置定义这样一个类

局部内部类要访问局部变量,这个局部变量应该被final修饰(jdk7.0的特点)

共同点:内部类是直接可以访问外部类的成员,包括私有

Object

1Object 是类层次结构的根类。每个类都使用 Object 作为超类(父类)。所有对象(包括数组)都实现这个类的方法。

public int hashCode()返回该对象的哈希码值

hashCode()----->通过哈希算法(哈希表:hashtable)---->地址值(不是实际意义上的地址值)

public final Class getClass()返回此 Object 的运行时类

Class类中有一个方法:

public String getName()String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称

public class ObjectDemo {

public static void main(String[] args) {

Student S1 = new Student ();

System.out.println(S1.hashCode());//114935352

 System.out.println("hello".hashCode());//99162322

public final Class getClass()返回此 Object 的运行时类

Class c1 = s1.getClass() ;

System.out.println("c1:"+c1);

//public String getName():获取当前正在运行的这类的全路径名称

System.out.println("name:"+name);

2 Object的另一个方法:C

public String toString();返回该对象的字符串表示(建议所有子类都重写此方法)

Integer类中有一个方法:

public static String toHexString(int i):将一个int类型的数据转换成一个十六进制的字符串表现形式

如果直接输出对象名称,想要显示当前对象的成员变量的值,那么必须重写Object类中的toString()方法

 

public class ObjectDemo1 {

public static void main(String[] args) {

Student s1 =new  Student ("哈哈");

System.out.println("s1:"+s1);}

public String toString(){

return this.getClass().getName() + "@" + Integer.toHexString(this.hashCode());

}

}

 3 Object中的另一个方法:

 public boolean equals(Object obj)指示其他某个对象是否与此对象“相等”。

==equal()方法的区别

==:比较的是两个对象的地址值是否相同,

equals()方法默认比较的是两个对象的地址值是否相同,如果重写了Object类中的equals()方法,那么默认比较就是两个对象的内容是否相同

 使用工具自动生产equals()方法

 public class ObjectDemo2 {

public static void main(String[] args) {

Student s1 = new Student("高圆圆", 27) ;

Student s2 = new Student("高圆圆",27) ;

System.out.println(s1==s2);//false

Student s3 = s1 ;

System.out.println(s1==s3);//true

System.out.println(s1.equals(s2));//false

}

 public boolean equals(Object obj) {

         return (this == obj);

}

} 由于Object类中的equals()方法底层是通过"=="来实现的,所以默认比较的是地址值,如果想比较内容是否相同,需要重写equals()方法

public class Student {

//成员变量

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;

}

 

//toString()

public String toString() {

return "Student [name=" + name + ", age=" + age + "]";

}

//重写了Object类中的equals()方法

public boolean equals(Object obj) { //Studnet s2 = new Student() ;

if (this == obj)

return true;

if (obj == null)  //当前传入过来的对象是否为空

return false;

if (getClass() != obj.getClass()) //this.getClass() != s2.getClass()

return false;

Student other = (Student) 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;

}

4 object类中的其他两个方法:

 protected void finalize()throws Throwable:当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法,但是,什么时候调用垃圾回收器 不确定;

System类中的一个方法:

 public void gc():运行垃圾回收器,这个垃圾回收器最终调用的就是finalize()方法

protected Object clone()创建并返回此对象的一个副本

                throws CloneNotSupportedException

注意事项:要去使用clone()方法,当前对象所在的类一定要实现cloneable接口,

         Object 类的 clone 方法执行特定的复制操作。首先,如果此对象的类不能实现接口 Cloneable,则会抛出 CloneNotSupportedException

Scanner

 1Scanner:用来创建一个文本扫描器(键盘录入)

 2 java高级特性:IO

 BufferReder:字符缓冲流来键盘录入

 java.util.Scanner;s

 Scanner sc = new Scanenr(System.in);

 System类中的静态字段:

 public static final InputStream in:  标准输入流

 InputStream :字节流 InputStream is = System.in ;  实质:抽象类多态

 public static final OutputStream out:  标准输出流

 开发步骤:

1创建键盘录入对象

2录入数据

3输出

public class ScannerDemo {

public static void main(String[] args) {

//创建键盘录入对象

Scanner sc = new Scanner(System.in) ;

//录入数据

int a = sc.nextInt() ;

System.out.println("a:"+a);

}

}

2  Scanner类中常用的方法:

判断的功能:细节:可以添加逻辑判断

hasNextXXX(); 在录入数据之前,加上判断功能,判断是否由下一个可以录入的XXX类型的数据

nextXXX();//通过录入获取这个int类型的数据

举例:

 public boolean hasNextInt()

 nextInt();

 nextInt():录入int类型的数据

 nextLine():录入一个字符串类型

 java.util.InputMismatchException:输入和想到的数据不匹配

3 Scanner类中的注意事项:

 先录入int类型的数据,在录入String类型数据,第二次录入的数据没有接收到,直接输出结果了,由于"回车"才能接收数据

回车换行符导致

解决方案:

在第二次录入String类型数据之前,需要重新创建键盘录入对象录入String类型

String

1 String

 代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现;字符串一旦被赋值,其值不能再改变

String类常用的构造方法:

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属性

 字符串中有length()

 集合中没有length(),获取集合中元素数量:size()

  编码和解码:一定要保证编码格式一致

 编码:把能看懂的东西转换成一个看不懂的东西:String----->byte[]:public byte[] getBytes(String charsetName)

解码:把当前的byte[]转成能看懂的东西(String):byte[]----->String  :public Stri1ng(byte[] bytes,CharsetName ch)

举例:今天老地方见:

编码:""----->字节数组:byte[]---->字节类型:形成一种二进制数据

解码:二进制数据---->十进制进制数据----->String:""

字符串的一个特点:一旦被赋值,其值不能被改变(不可变的字符序列)

 面试题:

 String s = "hello"

 String s = new String("hello") 两个有什么区别?分别创建了几个对象

 第一个创建了一个对象

 第二个s创建两个对象(堆内存中有new String(),然后字符串常量池中也有这样一个字符串常量(开辟空间的地址))

public class StringDemo {

public static void main(String[] args) {

String s = "hello" ; // String s = "abc" ;

s += "world" ;

System.out.println("s:"+s);*/

change(s) ;

//输出字符串变量

System.out.println("s:"+s);

}

public static void change(String s) {//String类型作为形式参数和基本数据类型的效果一样

s += "javaweb" ;

}

}

3  String类的中常用的判断功能:

boolean equals(Object obj):当前该对象是否obj这个对象是否相等;

boolean equalsIgnoreCase(String str):比较字符串是否相等,忽略大小写

boolean contains(String str):判断str这个字符串是否包含在当前字符串中

boolean startsWith(String str):是否以str子字符串开头

boolean endsWith(String str):判断是否以str子字符串结尾

boolean isEmpty():判断字符串是否为空

String s = ""  ;空字符

String s = " " ;字符串"空格"

String s = null ;当前字符串对象为空

练习:

public class StringDemo {

public static void main(String[] args) {

//定义一个字符串

String s1 = "helloworld" ;

String s2 = "HelloWorld" ;

// boolean equals(Object obj):当前该对象是否obj这个对象是否相等;String重写equals(),比较的是两个字符串的内容是否相同

System.out.println("equals:"+s1.equals(s2));

//boolean equalsIgnoreCase(String str):比较字符串是否相等,忽略大小写

System.out.println("equalsIgnoreCase:"+s1.equalsIgnoreCase(s2));

//boolean contains(String str):判断str这个字符串是否包含在当前字符串中

System.out.println("contains:"+s1.contains("hEllo"));

System.out.println("contains:"+s1.contains("awm"));

//boolean startsWith(String str):是否以str子字符串开头

System.out.println("starsWith:"+s1.startsWith("hel"));

//boolean endsWith(String str):判断是否以str子字符串结尾  自己测试

//boolean isEmpty():判断字符串是否为空

System.out.println("isEmpty:"+s1.isEmpty());

}

}

 4 字符串变量相加,先开辟空间,在相加

  字符串常量相加:首先在字符串常量池找,有没有当前这个常量值,,就直接返回,没有,需要创建

String s1 = "hello";  

String s2 = "world";

String s3 = "helloworld";

System.out.println(s3 == s1 + s2);// false

//System.out.println(s3==(newStringBuilder(String.valueOf(s1))).append(s2).toString());

//s1+s2 ====>new String("helloworld")

System.out.println(s3.equals((s1 + s2)));//true ,

System.out.println(s3 == "hello" + "world");//true

System.out.println(s3.equals("hello" + "world"));//true

课堂练习1:

import java.util.Scanner;

public class ScannerDemo {

public static void main(String[] args) {

//生成一个随机数:Math.random() ;

int number = (int) (Math.random()*100 +1) ;

//定义一个统计变量

int count = 0 ;

//由于多次录入

while(true){

//创建键盘录入对象

Scanner sc = new Scanner(System.in);

System.out.println("请您输入一个数据:");

int guessNumber = sc.nextInt() ;

//统计变量++

count ++ ;

//判断

if(guessNumber > number){

System.out.println("您猜的数据"+guessNumber+"大了");

}else if(guessNumber < number){

System.out.println("您猜的数据"+guessNumber+"小了");

}else {

System.out.println("恭喜您"+count+"次猜中了...");

break ;

}

}

}

}

练习2

需求:模拟用户登陆,3次机会,并给提示

分析:假设:定义一个用户和密码

String name = "admin" ;

String password = "admin" ;

2)创建键盘录入对象,录入用户名和密码

3)3次机会,使用for循环进行操作for(int x = 0 ; x <3 ; x ++){}

录入:录入的用户和密码来和已经存在的用户名和密码进行比较,

判断:如果一致:

登陆成功

不一致:

有一个不符合,就登陆不成功

if((2-x)==0){

}else{

//输出还有(2-x)次机会

}

public class StringTest {

public static void main(String[] args) {

//定义用户名和密码

String name = "admin" ;

String password = "admin" ;

//3次机会

for(int x = 0 ; x <3 ; x ++){

//创建键盘录入对象

Scanner sc = new Scanner(System.in) ;

System.out.println("请输入用户名: ");

String newUserName = sc.nextLine() ;

System.out.println("请输入密码:");

String newPassword = sc.nextLine() ;

//判断

if(name.equals(newUserName) && password.equals(newPassword)){

//一致了

System.out.println("登陆成功,开始玩游戏....");

//加入猜数字游戏

GuessNumberGame.start() ;

break ;

}else{

//登陆不成功

//2,1,0

//如果是0次机会了,换一种提示

if((2-x)==0){

System.out.println("速与管理员联系...");

}else{

//不是0

System.out.println("你还有:"+(2-x)+"次机会");

}

}

}

}

}

5 String类的获取功能:

 int length():获取字符串长度功能

char charAt(int index):返回的是索引处对应的字符

int indexOf(int ch):返回指定字符在此字符串中第一次出现处的索引

int indexOf(String str):返回指定子字符串在此字符串中第一次出现的索引

int indexOf(int ch,int fromIndex):返回在此字符串中第一次出现指定字符处的索引,从指定的索引开始搜索。

int indexOf(String str,int fromIndex):返回在此字符串中第一次出现指定字符串处的索引,从指定的索引开始搜索

String substring(int start):从指定位置开始截取字符串,默认截取到末尾

String substring(int start,int end):从指定位置开始截取到指定位置结束,包前(start索引)不包后(end索引)

6

字符串的遍历

public class StringTest {

public static void main(String[] args) {

String s = "helloworld" ;

for(int x = 0 ; x < s.length() ; x ++){

System.out.print(s.charAt(x)+" ");

}

}

}

课堂练习:

 把数组中的数据按照指定个格式拼接成一个字符串举例:

 int[] arr = {1,2,3}; 输出结果:[1, 2, 3]

  分析:

1定义数组:int[] arr = {1, 2, 3}

2定义空字符串:String s = "" ;

3用空串拼接一个"["

4遍历int类型的数组,获取到每一个数组中的元素

判断当前某一个索引是否是最大索引

如果是:用空串+= arr[x] ;

用空串 +="]";

不是:

用空串+= arr[x]

用空串+= ", "

public class StringTest2 {

public static void main(String[] args) {

//1)定义一个数组,静态初始化

int[] arr = {1, 2, 3} ;

//将这个数组转换成字符串最终来封装成功能

String result = arrayToString(arr);

//直接输出

System.out.println("result:"+result);

}

/**

 * 两个明确

 * 明确返回值类型:String类型

 * 明确参数类型:int   int[] arr

 * */

public static String arrayToString(int[] arr){

//定义一个空字符串

String result = "" ;

//拼接左中括号

result += "[" ;

//遍历数组

for(int x = 0 ; x < arr.length ; x ++){

//判断

if(x==arr.length-1){

result += arr[x] ;

result += "]" ;

}else{

result += arr[x] ;

result += ", " ;

}

}

return result ;

}

 

}

8  String类的转换功能(重点)

 Byte[] getBytes():将字符串转换字节数组

char[] toCharArray():将字符串转换成 字符数组 (开发中经常使用)

static String valueOf(char[] chs):将字符数组转换成字符串

static String valueOf(int i):将一个int类型的数据转换成字符串

注意:String类中的valueOf()可以将任何数据类型转换成字符串

String toLowerCase():将字符串全部转成小写

String toUpperCase():将字符串全部转换成大写

String concat(String str):字符串拼接方法

9 方法嵌套

 Math.max(Math.max(a,b),c);

方法递归:方法调用本身的一种现象

三个条件:

1)需要定义个方法

2)方法必须有出口条件

3)必须有某一种规律

 public void show(int n){

if(n<0){

System.exit(0) ; //jvm退出,程序结束

System.out.println(n) ;

show(--n) ;

}

 */

System.out.println("--------------------");

//需求:5的阶乘

//5! = 5 * 4 * 3 * 2 * 1 ;

//5! = 5 * 4! ;

int jc = 1 ;

//循环思想

for(int x = 2 ; x <=5 ; x ++){

jc *= x;

}

System.out.println("5的阶乘是:"+jc);

System.out.println("-------------------------");

//使用递归的思想:

//需要定义个方法

System.out.println("5的阶乘是:"+jieCheng(5));

}

/**

 明确返回值类型:

 int类型

 参数类型:int类型的值

 

2)出口条件:

  if(n==1){

  return 1 ;

 }

 

  3)要有规律

  if(n!=1){

  return n* 方法名(n-1);

 }

 * */

public static int jieCheng(int n){

if(n==1){

return 1 ;

}else{

return n* jieCheng(n-1) ; //5 * 4 * 3 * 1 *1 

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值