corejava09
来源:互联网 发布:耿光刚 大数据 编辑:程序博客网 时间:2024/06/07 23:58
CoreJava第9天
一、 public/private/protected/default四种修饰符的应用范围
1、访问控制符存在的意义和作用:
Java语言采用访问控制符来控制类及类的方法和变量的访问权限,从而只向使用者暴露接口(这个接口不是interface,而是日常生活中所说的接口,在程序中比如我们写的set/get方法就是对外提供的给私有属性赋值和获取其值的接口),但隐藏实现细节。
2、四种访问控制符的说明及其能修饰的范围
public代表公开的权限(公开应该不用我多说啥级别的权限了吧)
private代表私有的权限(有且只能在本类本身可以访问,不对外公开)
protected代表受保护的权限(只对子类及同一个包中类可访问)
默任级别:即没有访问控制修饰符,只能在同一个包中的类公开。
3.哪些修饰符可以修饰类、属性、方法、构造方法?
(1)可修饰类的修饰符:public、final、abstract、(即不加修饰)
(2)可修饰属性的修饰符:public、private、static、final、默认(即不加修饰)
(3)可修饰方法的修饰符: public、private、static、final、默认(即不加修饰)
(4)可修饰构造方法的修饰符:public、protected(一般修饰为public)
二、 接口是一个特殊的抽象类
1、接口所有的方法都是抽象方法
2、接口没有构造方法
3、接口中的属性都是静态常量,必须声明的时候赋值
4、接口可以继承多个接口
Object类
重要说明:
(1)Object类是所有类的祖先。
(2)如果一个类在声明时没有包含extends关键字,那么该类直接继承Object
(3)Object类中的方法大多需要我们子类重写后才有意义。
一、 Object类的主要成员方法(要求大家必须掌握,我会随时抽查)
(1) equals(Object obj)比较两个对象是否相等。
(2)toString():返回该对象的字符串表示
(3)clone()返回该对象的克隆对象
以上列举的主要是与大家现阶段学习相关的方法,对于线程相关的方法我们在学习线程的内容的时候在关注。
二、关于equals方法的重要归纳,大家务必掌握。
1.当别人问你equals方法是比较什么时候,请按如下回答:
分两种情况解答:
(1)没有重写equal方法前比较的是2个对象的地址是否相同,此时它与==比较运算符没有任何区别。
如何证明情况一的说法:如下面是API中Object类中equals的源码
public boolean equals(Object obj) {
return (this == obj);//此处比较的是地址啊
}
2.如果一个类按比较内容的方式重写了该方法,则该方法比较是两个对象的内容是否相同,不在比较地址。
三、如何重写equal方法比较两个对象的内容是否相等。
代码案例摘抄:
/*
* 重写equals
* @see java.lang.Object#equals(java.lang.Object)
* return true代表内容相同 false代表
*/
@Override(这个标识代表下面是重写方法的,能保证正确性)
public boolean equals(Object obj){
if(obj == null){//首先判读该对象是否为空
return false;
}else if(obj instanceof TestEquals){ //判读是否同类
TestEquals te = (TestEquals)obj;//强制比较的对象
return te.id==this.id;//依次比较属性是否相等。
}
return false;
}
三、 对象克隆clone
1. 理解并记忆深浅克隆的区别:
(1) 浅克隆是指:克隆对象的所有变量值都与原版对象相同,但是所用克隆版对象的引用依然指向原来的对象。
(2) 深克隆是指: 克隆对象的所有变量值都与原版对象相同,但是所有克隆版对象的引用不在指向原来的对象,而是执行自己的引用。
2. 如何实现深浅克隆
编程步骤:
(1)实现Cloneable接口
(2)重写clone()方法,注意要把他的控制符改为public (API中是protected)
*该方法要抛出CloneNotSupportedException异常。
*浅克隆最简单:在重写的方法体中直接return super.clone();
*深克隆这样重写:首先创建一个克隆对象
其次为克隆对象赋值并重新开辟空间
***如何让克隆对象的引用不在指向原版对象的引用:
(1)对于基本数据类型直接赋值
(2)对于引用类型对象,采用new+构造重新开辟空间
3.toString的重写
返回对象的字符串表示形式:
public String toString(){
String temp="工号:"+number+" 姓名:"+name;
return temp;
}
String类
重要性说明:
String类是JavaAPI中非常非常重要类之一,也是大家日后程序员生涯中要经常使用和解决商业软件开发很多实际问题的必备利器之一,我相信大家玩游戏的时候都有有这样的想法—拥有最威力的武器和经验值。同理,如果你想以后编程开发工作中能够打胜仗、赚更多的Money,请认认真真阅读、理解、记忆我总结的如下知识点,并能够熟练应用。
一、 著名的“池化思想”
“池”这个概念,大家应该不会很陌生,想想我们现实生活中是不是有很多这样的例子,例如过年了,家里买了很多的鱼,为了能够正月吃到新鲜的鱼,那么我们一般会把很多的鱼养在一个池子里面,正月家里来了客人要吃鱼,我们往往是直接到池子里面去取鱼,如果池子没有鱼了,那么我们只能上菜市场去买。
那么Java中,大家知道内存资源是非常宝贵的,因此为了节约资源,提高字符串的使用效率,Sun工程师们会设计一个字符串池,当第一次创建一个字符串的时候,用完后我们将其放在字符串池中,下次使用某个字符串的时候,我们会先到字符串池中去找有没有已经存在的字符串,如果有就直接拿来用,没有则创建一个新的字符串,用完之后再放入字符串池,依次循环。
二、 String s = “hello”;原理解释
1.首先在字符串池中找是否有一个值为hello的字符串存在。
2.如果存在,就直接从池中取出并赋值给引用s,然后就可以直接使用了
3.若没有,就创建一个值为hello的对象,并将该对象的引用赋值个引用s,使用完毕后放入字符串池中,供下次使用。
总结:只要是在从常量池中取得的字符串,都是相同的字符串。
论证总结的程序:
String s1 = “hello”;
String s2=”hello”;
System.out.println(s1==s2);
//结果为true,因为hello都是池中的同一个字符串
String str = new String(“abc”);原理解释
如果使用new+String()创建的字符串,则即时其值相同,但是他们也是2个不同的对象,因为我们要牢牢记住,只要使用new关键字就会从堆内存中开辟一个地址不同的新空间去存放对象。
面试题: String str = new String(“abc”)创建了几个对象?
三、 String与StringBuffer
String类和StringBuffer类主要用来处理字符串,但是从实际运用角度来讲:String用的更多,StringBuffer用的较少,但是下面这个定律是大家必须记住的:
1、String类的作用与常用方法必须熟记于心,StringBuffer后期用到了自己查API。
2、String创建的字符串是不可修改的而StringBuffer的字符串可以修改。
四、 String对象的创建方式
(1) String str1 = “abcdef”;//基于字符串池的创建方式
(2) String str2= new String(“abcdef”);//基于new+构造的创建方式
五、 String类的重要方法,也是考试和开发中常需要使用的方法
(1) public char charAt(int index);
作用:获取位于指定索引处的字符,一定要记住String的索引从零开始
实例:String str = “alpha”;
System.out.println(str.charAt(2));//结果为p
(2) public String concat(String s);
作用:该方法返回一个字符串,其值为把通过参数传递给该方法的字符串s追加到调用该方法的String对象值的尾部。
实例:String x = “Zhang”;
System.out.println(x.concat(“San”));//打印结果为ZhangSan
(3) public int length();
作用:该方法返回调用该方法的字符串长度。
实例:String str =”alpha”;
System.out.println(str.length());//打印结果为5
(4) public String replace(char oldstr,char newstr);
作用:该方法返回一个新的字符串,将旧字符串全部替换为新指定的字符串。
实例:String str =”alpha”;
System.out.println(str.replace(‘a’,’A’));//打印结果为AlphaA
(5) public String substring(int begin);
作用:获取从指定位置开始一直到该字符串结束的字符串。
实例:String str =”
System.out.println(str.substring(5));//打印结果为5678
(6) public String substring(int begin,int end);
作用:获取从指定位置开始到指定结束位置的字符串。
实例:String str =”
System.out.println(str.substring(5,7));//打印结果为567
(7) public String toLowerCase()
作用:返回该字符串的小写形式。
实例:String str =”ABC”;
System.out.println(str.toLowerCase());//打印结果为abc
(8) public String toUpperCase()
作用:返回该字符串的大写形式。
实例:String str =”ABC”;
System.out.println(str.toLowerCase());//打印结果为abc
(9)public String trim()
作用:返回该字符串去除前导和尾随空格后的新字符串
实例:String str =” Say hi tareana ”;
System.out.println(str.trim());//打印结果为Say hi tarena
练习题:请问如下程序代码执行完毕后str2的值是多少。
String str1 = “abc”;
String str2 = str1.concat(“def”).toUpperCase().replace(‘C’,’x’);
System.out.println(str2);