📄 day05.txt
字号:
CoreJava(day05) 2007-11-7 --- 李艳
复习:static,final的区别(课堂代码:Sin1.java)
抽象类:(课堂代码:Sin1.java)(课堂代码:Temple.java , DAcount.java)
比如银行帐户:有定期,活期,外汇,但有共同的特征就是有这两个属性(本金,id),这种情况就可以采取继承的方式
但定期,活期,外汇又都有各自的不同之处,可以用多态来实现。
abstract:抽象的关键字,abstract可以修饰类,修饰方法。抽象类只定义框架,不予实现
抽象类不能用构造器创建获得一个对象,也就是自身不能直接被实例化,由了类来传递参数。抽象类可以声明引用。
抽象类可以有构造方法(要被子类调用),可以有静态方法,也可以有主方法
抽象方法:只有定义没有实现
例:public abstract class Account{ //抽象类
public abstract String getName(); //抽象方法
}
注意:如果一个类中有抽象方法,这个类必须是抽象类,为了避免new对象后没有实例。
如果某个类没有任何抽象方法,这个类也可以定义为抽象类,即抽象类中不一定有抽象方法,可以有非抽象方法。
抽象方法是留给子类实现的,子类必须实现抽象方法,否则也不能new对象,并且也要声明为抽象方法,所在的类要声明为抽象类
abstract 与 final 不能同时出现
abstract 与 static 也不能同时出现
abstract 与 private 也不能同时出现
接口:
为解决多继承的问题引入接口,面向接口编程
定义接口---interface关键字
接口可以理解为是一个特殊的抽象类,但在语法上和类有区别。
属性:接口中的所有属性都是公开静态常量(public static final)
方法:接口中所有方法都是公开抽象方法(public abstract)
构造方法:接口没有构造方法
implements 实现的关键字,变相的继承
接口与接口之间可以有继承关系,允许多继承。
一个类在继承另一个类的同时可以实现接口,并且可实现多个接口
类和接口之间可以定义实现关系,逻辑上相当于接口是实现类的父类型,
当我们用类去实现接口时,如果不希望实现类是抽象类的话,那么就要实现接口中定义的所有的方法
接口和多态配合使用,接口不能构造对象,可以作为引用类型(编译时类型),只能调用接口中定义的方法,运行时找接口实现类中实现的方法
如果对接口类型的引用调用方法,调用的一定是接口实现中的方法
所谓接口对象指的是接口实现类的对象
子 父
继承
类 -----------类(单个)
extends
实现
类------------接口(多个) (课堂代码:Interface1.java)
implements
多继承
接口----------接口(多个) (课堂代码:Interface1.java)
extends
若是类与类多继承就会形成网状结构,而java里只允许单继承,使类与类形成树状结构。接口解决了多继承的问题,属性都是常量,方法没有实现,故不会形成网状结构。
接口的使用:1、功能模块 2、标准,一个接口就是一个标准,把制定标准、使用标准、和实现标准分开,标准的使用者和标准的实现者通过标准间接发生联系。
封装类:
引用类型更强大
基本类型的包装类,为了提高效率
JAVA为每一个简单数据类型提供了一个封装类,使每个简单数据类型可以被Object来装载。
除了int(Integer)和char(Character),其余类型首字母大写即成封装类类型名。参考API的java.lang包下的类
1.4通过构造器转化,5.0可以自动转化
Integer i2=127;//5.0的新特性,自动封箱
Integer i5=127; //byte大小的数字自动装箱只有一次
System.out.println(i5==i2); 这条语句的结果为true,若i2和i5是128或更大时,这条语句的结果就是false了
转换字符的方式:
int I=10;
String s=I+” ”;
String s1=String.valueOf(i);
Int I=10;
Interger I_class=new integer(I);
封装类.字符串.基本类型
三种类型六种转换
new Integer() 或Integer.valueOf()
int--------------------------------------->Integer
i.intValue()
Integer----------------------------------->int
Integer.toString(...) 或 String s=100+" "
int--------------------------------------------------->String
Integer.parseInt("...")
String---------------------------------->int
i.toString()
Integer-------------------------------->String
Integer.valueOf("...") 或new Integer("...")
String------------------------------------------------>Integer
Object类中的clone()方法、equals()方法、hashCode()方法和toString()方法:
protected Object clone() throws CloneNotSupportedException:实现Cloneable接口(课堂代码:TestClone.java)
类可以被clone,浅clone不需要重写,深clone需要重写
public boolean equals(Object obj): (课堂代码:Student.java)
public int hashCode(): equals为true,hashCode相同,但hashCode相同,内存地址不一定相同
public String toString(): 返回一个字符串,直接输出一个对象时,会自动调用对象的toString()方法,输出toString()的返回值
当没有覆盖toString()方法时,会输出 :对象名@对象哈希码的无符号十六进制表示组成
String类:
1、String是一个不变模式:不变模式:一个对象一旦产生就不可能再修改(string就是典型的不变模式);通过不变模式可以做到对象共享;
2、如果用Stirng str = “abc”来创建一个对象时,则系统会先在串池中寻找有没有“abc”这个字符串。
如果有则直接将对象指向串池中对应的地址,如果没有则在串池中创建一个“abc”字符串。
所以:String str1 = “abc”;
String str2 = “abc”;
Str1 = = str2 返回值是ture;他们的地址是一样的。
也就是说str1和str2都指向了代码空间中相同的一个地址,而这个地址空间保存就是是字符串”abc”;
如果用String str = new String(“abc”)则直接在堆空间开辟一块存储空间用来存放”abc”这个字符串。
所以:String str1 = new String(“abc”);
String str2 = new String(“abc”);
Str1 = = str2 返回值是false;他们的地址是不一样的。
也就是说str1和str2分别指向了堆空间中不同的两个地址,而这两个地址空间保存的都是字符串”abc”;
3、java.lang下的StringBuffer类。
对于字符串连接
String str=”1”+”2”+”3”+”4”;
产生:
12
123
1234
会在串池中产生多余对象,而真正我们需要的只有最后一个对象,用这种方式进行字符串连接时,不管在时间上还是在空间上都会造成相当大的浪费。
所以我们应该使用 StringBuffer(线程安全的) 或者 StringBuilder(线程不安全的)
解决方案:
String s;
StringBuffer sb = new StringBuffer(“1”);
ss.append(“2”);
ss.append(“3”);
ss.append(“4”);
S = ss.toString();
解决后的方案比解决前在运行的时间上相差2个数量级。
注意:8大包装类及String类不用再去重写equals()和hashCode()方法,因为已经重写过了。
String类常用方法:(课堂代码:TestString.java)
indexOf():查找字符符,返回类型int,参数有很多种,>=0代表有,==-1代表无
split():分拆字符串,按照正则表达式,用传递的参数来分,返回String数组
length():返回int类型,代有字符串长度。
getBytes():能够转码,解决中文的乱码问题
subString():求子串
public String substring(int beginIndex)
public String substring(int beginIndex,int endIndex)
有以上两种方式,其中beginIndex - 开始处的索引(包括)。endIndex - 结束处的索引(不包括)。
replace:是字符的替换,replace All是字符串的替换。
matches():匹配正则,输入验证
调用任何String的方法,不会改变自身,除非重新赋值
作业:
班级CLASSROOM,学生(88/其他数字)个、老师1个、机器管理员1个
学生人数要在构造CLASSROOM的时候强制限定,不可以再改变管理员每天都只有一个,但是可能不同(所有CLASSROOM共享)
老师、学生、管理员共性怎么处理
(面向对象的思想、封装、继承、多态、静态、final、抽象)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -