封装的使用细节
对于类的属性一般使用private权限,给属性提供相应的get和set方法,然后再实例化对象时调用这些方法。(作用:可以把一些控制语句放在set方法中,即内部结构外部无法得知,只知道可以调用就可以了。
)比如说
public void setAge(int age){
if(age>=1&&age<=130){
this.age=age;
}else{
System.out.println("不正确");
}
}
多态
多态是方法的多态,不是属性的多态。
多态存在要有三个条件:继承,方法重写,父类引用指向子类引用。
对象的转型
父类引用指向子类对象,称为向上转型(自动
)如:Animal a = new Dog();
。
向上转型后的父类引用变量只能调用它编译类型的方法,不能调用它运行类型的方法。不然要进行强制转换,称为向下转型,如:Dog d = (Dog)a;
。
不同继承层次转换会ClassCastException
。
final关键字
修饰变量
:被修饰的变量不可改变,一旦赋值不可以再赋。
修饰方法
:该方法不可以被子类重写,但是可以被重载!
修饰类
:类不能被继承,如Math,String。
数组的使用
数组是相同类型数据的有序集合。
数组的三个基本特点:长度确定;其元素必须类型相同;数据类型可以包括基本类型和引用类型
。
构造一个数组,必须指定长度
。
数组元素有默认值
。
数组下标越界异常ArrayIndexOutOfBoundsException
。
二维数组可以看成以数组为元素的数组。
多维数组的声明和初始化应该按照高维到低维顺序进行。
多维数组的元素访问多用嵌套循环。
使用二分法查找元素必须先对数组排序。
System类中arraycopy(Object src,int srcpos,Object dest,int destpos,int length)
方法,该方法可以将src数组里的元素值赋给dest数组的元素,其中srcpos指定从src数组的第几个元素开始赋值,length参数指定将src数组的多少个元素赋给dest数组的元素。
Arrays.toString(array)
:打印数组。
Arrays.sort()
:排序。
Arrays.binarySearch(array,ele)
:返回数组中ele元素的索引。
Arrays.fill(a,2,4,100)
:将a数组2到4索引的值填充为100。
数组中的初始化方式
静态初始化:int [] a = {1,2,3};
。
默认初始化:int[] a = new int[3];
此时默认值为0。
动态初始化:通过下标挨个赋值。
数组的遍历
for循环;
for each循环(增强for循环
):用于读取数组或集合中的元素,不能修改元素的值。
多态分析
构造器的第一句是隐式的super();
它会调用父类的构造器。
this
指本身创建的对象。
父类中的方法中调用的方法被子类重写,会引用子类对象的方法。
抽象类
抽象类为所有子类提供了一个通用模版,子类在模版基础上扩展,可以避免子类设计的随意性,使子类之间更加通用。
有抽象方法的类只能定义为抽象类。
抽象类不能实例化。
抽象类可以定义属性,方法,构造方法,但是构造方法不能用来new实例,只能用来被子类调用。
抽象类只能用来继承。
抽象方法必须被子类实现。
通过抽象类可以达到设计与实现分离
。
接口
接口里只有常量和抽象方法。
接口中常量默认修饰public static final
(相当于类变量的使用)。
"接口是最抽象的
”,“单继承,多接口
”。
方法默认修饰public abstract
。
接口中不能创建实例,但是可用于声明引用变量类型。
MyInterface m = new MyClass();
此时m不能调用MyClass中的变量,如有必要,须强制转换,同时m只能调用MyInterface中的方法。
回调的实现
方法接收接口类型参数,再实现接口(可以实现不同的接口进行回调)。
内部类
作用:提供了更好的封装,只能让外部类直接访问,不允许同一个包中的其他类访问。
内部类看作是外部类的成员,内部类可访问外部类私有属性,而外部类不能访问内部类的局部属性。
通常在只为所在外部类提供服务的情况下优先使用。
分为成员内部类
(静态内部类和非静态内部类),匿名内部类
,局部内部类
(定义在方法内,用得少)。
匿名内部类:new 父类构造器(实参列表) 实现接口 {类体;}
适合那种只需要使用一次的类,如键盘监听操作。
非静态内部类对象单独属于外部类的某个对象。
Outer.Inner o = new Outer().new Inner();
当一个静态内部类对象存在,并不一定存在对应的外部类对象。
Outer.StaticInner os = new Outer.StaticInner();
String类
不可变字符序列!
一些常用的方法:
int length()
:返回字符串的长度。
boolean isEmpty()
:当length为0返回true。
char charAt(int index)
:返回字符串指定索引处的char值(从0开始)。
boolean equals(Object o)
:比较字符串与指定对象。
boolean equalsIgnoreCase(String s)
:忽略大小写比较。
int compareTo(String s)
:返回0,大于0的值,小于0的值。比较基于字符串中各个字符的Unicode值。
boolean startWith(String prefix)
:字符串是否以指定前缀开始。
boolean endWith(String suffix)
:字符串是否以指定后缀结束。
int hashCode()
:返回字符串的哈希值。
int indexOf(int i)
:指定字符在字符串中第一次出现的索引。
String substring(int beginIndex)
:返回一个子字符串从指定索引处的字符开始,直到此字符串末尾。
String concat(String s)
:将指定字符串连接到此字符串的结尾:"she".concat("is").concat("a girl.");
<-方法链.
String replace(char old,char new)
:返回一个新的字符串,其中new替换掉出现的所有old。
boolean matcher(String regex)
:字符串是否匹配给定的正则。
String[] split(String regex)
:根据给定正则拆分字符串。
String toLowerCase()
:都转换为小写。
String toUpperCase()
:都转换为大写。
String trim()
:返回字符串的副本,忽略前后空白。
String toString()
:返回字符串本身。
char [] toCharArray()
:转换为一个新的字符数组。
String valueOf(Object o)
:返回Object参数的字符串表示形式(static)。
StringBuffer和StringBuilder的使用
可变字符序列!
二者区别在于StringBuilder线程不安全,但效率相对较高
。
char charAt(int index);
StringBuilder delete(int start,int end);
StringBuilder insert(int offset,String str);
int indexOf(String str);
int length();
StringBuilder replace(int start,int end,String str);
StringBuilder reverse();
String substring(int start,int end);
String toString();
包装类Wrapper
将基本类型数据转换成对象。
char->Character int->Integer
byte short long boolean float double.
String->Integer:parseInt(String s);
Integer->int:intValue();
int->String:String str = 123+"";
基本数据类型和包装类之间会自动转换,称之为自动装箱和自动拆箱
。
[-128,127]之间的数值,会按照基本数据类型处理(提高效率)。
Date类
时间也是数字:从标准纪元1970-1-1 00:00:00
开始到某个时刻的毫秒数(long)。
System.currentTimeMills()
:当前时刻的毫秒数(long)。
getTime()
:得到对象表示的时间。
完成字符串和时间对象的转化:
时间->字符串
:
DateFormat df = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");
Date d = new Date(51111116222222222L);
String str = df.format(d);
字符串->时间
:
String s = "2018-8-22";
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");<--格式一致!
Date d = df.parse(s);
Calendar和GregorianCalendar
提供了大多数国家/地区使用的标准日历系统。
其中一月是0,十二月是11,周日是1,周六是7.
Calendar c = new GregorianCalendar();c.set(2018,7,22,9,38,33); <--7指八月!Date d = c.getTime();
Calendar还可用于计算...
file类
File类:文件和目录路径名的抽象表现形式。
通过file对象可以访问文件的属性:boolean canRead();boolean canWrite();boolean exists();boolean isDirectory();boolean isFile();boolean ishidden();long lastModified();long length();String getName();String getPath();
通过file对象可以创建空文件或目录(该对象所指不存在的情况下):boolean createNewFile() throws IOException;boolean delete();boolean mkdir();boolean mkdirs();
<--前者上级目录不存在则创建失败,后者没有上级目录时自动创建目录。
异常
Java是采用面向对象的方法来处理异常的。
处理过程:<抛出异常>
:执行方法时发生异常,则将这个方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给JRE。<捕获异常>
:JRE得到该异常后,寻找相应的代码来处理该异常,JRE在方法的调用栈中查找,从生成异常的方法开始回溯,直到找到相应的异常处理代码为止。
所有异常对象都是派生于Throwable
类的一个实例。
Error
类层次描述了Java运行时系统内部错误和资源耗尽错误(不需要管理)。
Runtime Exception(unchecked Exception)
:异常产生比较频繁,由系统自动检测并交给缺省的异常处理程序。也可以用判断条件避免一些错误。
checked Exception
:必须捕获进行处理。
try-catch-finally
:
不管是否出现异常都要执行的语句块放在finally中。
异常类之间有继承关系,越底层的类,越放下面。
不要在finally中使用return,它会覆盖其他返回值。
执行顺序:执行try,catch,给返回值赋值;执行finally;return返回值。
throws
:
抛出异常,由调用者处理异常。
子类声明的异常范围不能超过父类声明范围。
throw
:手动创建并抛出
避免使用异常处理代替错误处理;只在异常情况下使用异常机制;异常往往在高层处理;整个任务为一个try语句块。
网友评论