1. Java知识
本章节介绍Java的一般语法知识,以及面向对象的继承,封装,多态的基本实现方法。
1.1. 构造函数
构造函数没有返回值;并且可以重载;不会被重载。
class Person{
Person(){
}
Person(sting name, int age){
}
}
1.2. this
指的是对象的那个成员变量。一般new了一个对象后,通过在class中使用this可以访问到new出来的对象的那些成员变量。
通过this可以为不同的对象做当前对象的成员访问进行控制。
1.3. static
a. 静态成员变量:static string name;
所有new出来的对象都使用同一个成员变量,一改全改。
b. 静态函数static void funcA();
静态函数只能访问静态成员变量,不能访问非静态变量。
c. 静态代码块
Static{
}
静态代码块没有名字,如何调用?作用是什么呢?
静态代码块无需调用,装载该类的时候执行,主要作用是为静态变量赋初始值。
1.4. 继承
class Student extends Person{
}
Java只支持单继承。一个子类只能继承一个父类,一个父类可以被多个子类继承。
目的是将没有区别的代码定义在父类中,将区别的内容新定义一个类,实现分别的功能。
减少重复代码。
1.5. 子类的实例化过程
a. 生成子类的过程
在子类的构造函数中,必须先调用父类的构造函数。自己不写,编译器会自动加入无参数的构造函数。
自己写代码,则通过super()来实现。至于怎么调用,则有super()的参数决定。
子类为什么必须调用父类的构造函数呢?构造函数为对象分配空间,子类不调用父类的构造函数,如何分配空间,没有空间也就没有办法进行访问。
b. 使用super调用父类的方法
使用super()调用可以访问父类的构造函数,以消除重复代码。
super(name, age); 子类调用父类的构造函数。
必须要是调用函数的第一条语句。
原因:为了解决子类无法继承父类的构造函数,通过super实现子类访问父类的构造函数的功能。
1.6. 函数的复写
overwrite。在具有父子关系的两个类当中,子类定义一个与父类完全相同的函数(函数名,返回值,参数列表),覆盖父类对应的函数。这样在new对象时,将调用子类的方法。
与overload的比较:重载是在同一个类当中,定义一些类函数名称相同其他不同的函数,这样就是重载。
应用:对继承到的父类的方法,有不满意的话,可以通过复写来实现自己的方法。
通过super实现子类调用父类的成员函数。super.eat()。
应用:当复写时,如果发现自己只是在父类基础上增加一些功能,可以先调用super.eat()实现部分功能,然后再实现自己的功能。
1.7. 对象的转型
对象的多态性的体现。
a. 概念:向上转型:将子类的对象赋值给父类的引用。一定成功。
Student student = new Student();
Person person = stu;
使用方法:
一个引用能够调用哪些成员(函数&方法)取决于这个引用的类型。
比如,stu转成了per以后,per不能调用stu下的方法。
转型后调用重载的函数:
一个引用调用的是哪一个方法取决于这个引用的指向。
比如,per调用introduce方法,父子类都有的方法,就执行子类的方法。
b. 概念:向下转型:将父类的对象赋值给子类的引用。不一定成功。
先把一个对象向上转型,在强制进行向下转型。
Student student 1 = new Student();
Person person = student;
Student student 2 =( Student) person;
使用方法
一个引用能够调用哪些成员(函数&方法)取决于这个引用的类型。
1.8. 抽象类和抽象方法
a. 抽象类
abstract Person{
string name;
abstract void eat();
}
注意:
· 一个类当中,拥有一个或多个抽象函数必须被定义为抽象类。基于本限制,子类可以复写父类的抽象函数。
· 抽象类不能生成对象,抽象类天生就是当爹的,用来被继承。
· 如果有一个类,不想让别人生成对象,可以将其定义为抽象类。
· 抽象类为基类,最基础的类。
· 抽象类可以有构造函数。因为存在super访问的问题,没有构造函数,如何实现访问super的成员变量,抽象类提供构造函数为子类访问。
b. 抽象函数:只有函数的定义,没有函数体的函数。
abstract int eat();
问题:抽象函数没有函数体,调用时候执行什么呢?
解答:由于抽象类不能生成对象,只能用来被继承,子类通过复写父类的抽象函数,让自己没有抽象函数,从而实现可以进行生成对象。
基于此说法,父类定义抽象函数,可以实现规定子类必须实现某些方法。
c. 抽象类的作用。
定义一些必须实现的方法,保证在编译的语义上防止子类漏实现必须的功能。
1.9. 软件包的权限问题
a. package关键字
将class放置到一个包中,使用package关键字实现;实际在编译时使用-d来实现指定编译。访问有package的需要具体指定该class的路径执行。
这样,其实一个类的实际的名字就是helloworld.test。
包名的命名:包名的字母必须小写;一般情况下为域名倒过来写(如org.honeuwell.person定义了类)。
一个类的全名:包名+类名。
b. 权限问题
如果两个类,不在一个包当中,必须写类的全路径。Default
· Public:解决两个类在不同包中的问题。
如果两个类不在统一个包中,没有定位仪public,则两外一个包中无法访问该类。
在一个包的外部调用一个类的方法或成员变量,必须把一个类的方法或成员变量定义为public。
· Private:只能在当前的class中使用,不能外部使用。
一般情况只能修饰变量和方法。
· Default
为同一个包中的访问,不同包是不行的。继承后,子类是不能访问
· Protected
该字段主要与继承相关。
如果子类与父类不在同一个包中,子类无法继承到父类的default成员变量和方法?实际应该是可以继承到,不能访问是因为权限不够。
只能修饰成员变量与方法,可以实现跨包访问。
与public相比,public为包外部所有的class都可以访问,而protected在包外部只有子类能够使用该成员变量和方法。
c. Import
可以使用import关键字导入一个类,如:import org.android.mypackage.*
1.10. 接口
a. 定义&语法
· 使用interface定义。
Interface USB{
Public void plugin();
}
· 接口中的方法全部为抽象方法,访问权限为public。
· 使用implement关键字实现类似类继承的操作。在class中在实现对接口中的抽象方法进行实现。
· 一个类可以实现多个接口,一个类只能继承一个父类。
Class Phone implement USB, WiFi{
}
· 一个接口可以继承多个接口。
Interface A extend B, C{
}
b. 应用
结合着接口的特性,接口的应用场景也就很好理解。
对比静态工厂模式的实现。
到这里,可以部分地理解设计模式的定义与产生的原因。