Java基础语法(详细基础原理)
文章目录
第五章 继承、接口和抽象类
1、继承
将共同点提取出来,即形成了父类/基类/超类。
其他类自动成为子类/派生类
子类继承父类的所有属性和方法,但不能直接访问private成员。(可以通过父类的方法去访问private成员)
如果不写extends,java中默认继承java.lang.Object类
单根继承原则:每个类只能继承一个类。
注意:每个子类的构造函数的第一句话,都会默认调用父类的无参数构造函数super()
相同点继承,不同点保留形成子类:
子类调用父类方法去访问父类的private成员:
2、抽象类
完整的类:所有的方法都有实现(方法体)
抽象类也是类
注:只有一个完整的类才能被实例化,被new出来
若一个类中有方法未被实现,则被定义为抽象类。
抽象类关键字abstract声明,抽象类中的未被实现的函数也同样需要通过abstract来声明。
子类如果继承于抽象类,那么一定要实现父类所有的abstract的方法,否则子类也应该声明为抽象类。
3、接口
如果一个类中所有的方法都没有实现,那么这个类就可以称作为一个接口(interface)。
interface 不算类,或者说也是一种特殊的类。
类只能继承(extends)一个类,但是可以实现(implements)多个接口,继承和实现可以同时进行。
一个接口可以继承多个接口,没有实现的方法将会叠加。
一个类如果要实现接口,那么就要实现所有未被实现的方法。如果没有全部实现,那么只能成为一个抽象类。
接口interface的定义过程中,class 是多余的。接口的定义是
public interface CatFamily extends Animal,ClimbTree public interface Cat
接口的实现(implements):
一个类继承一个抽象类(LandAnimal)和实现一个接口(interface):
一个类实现一个接口(CatFamily),该接口是继承了两个接口(Animal,ClimbTree):
4、总结
抽象类和接口的比较:
----相同点:
两者都不能被实例化,不能new操作;
----不同点:
抽象类可以有部分方法实现,接口所有方法都没有实现。
一个类只能继承(extends)一个(抽象)类,但一个类可以实现(implements)多个接口。
一个接口也可以继承(extends)多个接口。
抽象类有构造函数,接口没有构造函数。
抽象类可以有main,也能运行,接口没有main函数。
5、类转型
子类可以转换成父类(向上转型可以),而父类不能转换为子类(除非该父类对象本身就是一个子类对象)
Human obj1 = new Man(); (正确)
Man obj2 = new Human(); (错误)
6、多态
类型转换带来的作用就是多态。
子类继承父类的所有方法,但子类可以对父类的方法进行重写,即一个方法可以替换父类的一个方法。(注:子类方法的优先级是高于父类的)
作用:
以统一的接口操作某一个类中不同对象的动态行为。
对象之间的解耦
7、契约设计
契约:规定规范了对象应该包含的行为方法。
接口定义了方法的名称、参数和返回值,规范了派生类的行为。
基于接口,利用转型和多态,不影响真正方法的调用,成功将调用类和被调用类解耦。
第六章、static、final和常量设计
1、static
静态变量,类共有成员,所有的对象实例只有一个静态变量的拷贝。
static可以依赖于类存在,是类中的一个独立的存在。
可以通过类直接访问,如下的Potato.price
静态方法可以调用静态变量。
静态方法不能调用非静态变量。
静态方法不能调用非静态方法。
非静态方法可以调用静态方法。
非静态方法可以调用静态变量。
非静态方法可以调用非静态变量。
static块/静态代码块
只在类第一次被加载时调用,即这段代码只执行一次。
优先级顺序:static块>匿名块>构造函数
2、单例模式
又称为单态模式Singleton,即内存空间中一个类只有一个对象存在。
----采用static来共享对象实例
----使用private构造函数,防止外界new操作
3、final
final类:没有子类继承。
final字段:不能被子类改写。
final字段:基本类型不能修改值,对象类型不能修改指针。
final的类,不能被继承
子类中不能修改父类final的方法。
final的变量不能被再次赋值如果是基本类型,则不能修改其值。如果是指针类型,则地址不能修改,内容可以修改。
4、常量设计
----不能修改:final(相当于是const)
----不会修改/只读/只要一份:static
----方便访问:public
接口中定义的变量默认为常量(public static final)
建议常量名字全部大写,中间用连字符连接
常量池:相同的值只存储一份,共享访问。
常见的常量池:
----BYTE:-128~127
----Character:0~127
----Boolean:true,false
----Short,Int,Long:-128~127
Java为常量字符串都建立常量池缓存机制。
5、不可变对象和字符串
一旦创建,这个对象不能被更改了
其内在的成员变量的值就不能修改了。
如何创建不可变对象(Immutable Object):
----所有的属性都是final和private的----不提供set方法,不能去修改
----类是final的,或者所有的方法都是final的
Java字符串:
String定义:
-----String a=“abc”; //常量赋值,栈分配内存
-----String b=new String(“abc”); //new赋值,堆分配内存
字符串内容比较:equals方法
是否指向同一个对象:指针比较==
字符串加法操作:SrinagBuffer,StringBuilder
第七章、package、import、classpath
1、package和import
—包名:package name尽量唯一
—域名是唯一的,因此常用域名作为包名
—package必须是第一行
—多个import的顺序无关
—可以用*来引用一个目录下的所有类
2、jar文件导出和导入
.java文件最终会被编译为.class文件(二进制),并发送到机器上使用
jar文件实际上是一组class文件的压缩包,用于可执行文件的传播。(本质上类似于C++中的DLL文件)
jar文件只包括class,而不包括java文件,可以有效保护源文件。
第八章、java常用类
1、java的String类
a.charAt(0)//返回第0个元素。
a.indexOf(“;”)//返回第一个;的位置。
a.concat(“;000”) //连接一个新字符串并返回。而本身值不变。
a.contains(“000”) //判断a是否包含000
a.endsWith(“000”) //判断a是否以000结尾
a.equals(“000”) //判断a是否等于000
a.equalsIngoreCase(“000”) //在忽略大小写的情况下比较是否相同
a.length() //返回a的长度
a.trim() //返回a去除前后空格的字符串,a不变
String[] b=a.split(“;”) //将a字符串按照;分割成数组
a.substring(2,5) //截取第二个到第五个的字符,a本身不变
a.replace(“1”.”a”) //把所有的1都变成a
2、StringBuffer和StringBuilder
两个类都是可变对象,变量是原地就修改了
public class StringBUfferReferenceTest{
public static void main(String[] args){
StringBuffer sb1=new StringBuffer("123");
StringBuffer sb2=sb1;
sb1.append("1234567890");
System.out.println(sb2); //sb1和sb2指向的内存是一样的,因此改变sb1的值,sb2的值也相应发生变换
}
}
2、时间类
–getTime(),返回来自1970.1.1以来的毫秒数
java.sql.Date(和数据库对应的时间类)
Calendar是目前最常用的,但是是抽象类(不可以new出这个对象)
一般采用 Calendar gc=Calendar.getInstance();—实质上是简单工厂模式 ,获取到Calendar的一个对象
与Calendar gc=new GregorianCalendar();是等价的
Calendarl类中主要的函数:
getField()函数,可以用来获取时间中每一个属性的值。注意:月份是0-11
eg: calendar.get(Calendar.YEAR)
calendar.get(Calendar.MONTH)+1
calendar.get(Calendar.DAY_OF_MONTH);
calendar.get(Calendar.HOUR)
calendar.get(Calendar.HOUR_OF_DAY);//24小时表示
getTime(),是返回相应的date对象
getTimeInMills(),返回自1970.1.1以来的毫秒数
setField(),设置时间的字段
eg:
calendar.set(2018,7,8)
add(field,amount)根据指定字段增加减少时间
eg:
calendar.add(Calendar.YEAR,1); //年份加1年
java.time包
第九章、异常处理
1、try-catch-finally
一种保护代码正常运行的机制
异常结构:
-try…catch(catch可以有多个)
-try…catch…finally
-try…finally
try必须有,catch和finally必须有一个
catch: 当try发生异常,将执行catch代码。若无异常,则绕过。(自上向下排列)
finally:当try,catch执行结束后,必须要执行finally
catch块可以有多个,每个有不同的入口形参,当已发生的异常和某个catch块中的形参类型一致,那么将执行该catch块中的代码。如果没有一个匹配,那么catch块也不会被触发。最后都进入finally块。
进入一个catch块就不会进入第二个catch块。
因此,小异常写在前面。
throw:方法存在异常的语句,但是不处理,那么可以使用throws来声明。
class Test{
public int divide(int x,int y)throws ArithmeticException{
int result=x/y; //因为我不去处理,因此这个地方可会有异常,那就直接向外抛出异常
return x/y;
}
}
2、自定义异常
需要继承Exception类或者其子类
—继承自Exception,就变成了Checked Exception
第十章、java文件读写
1、文件概述
·文件系统是由OS管理的。
·文件系统和java进程是平行的,是两套系统。
·文件系统是由文件夹和文件递归组合而成。
·文件目录分隔符
–linux/Unix 用/隔开
–Windows用\隔开,涉及到转义,在程序中需用/或\代替
·文件包括文件里面的内容和文件基本属性
·文件基本属性:名称、大小、扩展名、修改时间等