学了一年的JAVA,最近搞android也发现稳固的JAVA基础很重要~基础没牢靠的话想要继续研究android的话很吃力;
从概念开始引出知识体系是我比较喜欢的一种方式。
今天复习的是复用类这个概念。
类的复用是是JAVA引人注目的功能之一;区分一点就是我们的复用限定在类的复用,而不是通常说的更广意义的软件代码复用,
软件代码复用不是简单的复制别的代码,而是对
类的复用按照thinking in java这本书上分为:
1、组合语法
has-a的作用
class Engine{
public void start(){}
public void stop(){}
}
class Door{
public void open(){}
public void close(){}
}
class Window{
public void rollup(){}
public void rolldown(){}
}
public class Car {
private Engine engine=new Engine();
private Door door=new Door();
private Window window=new Window();
public static void main(String[] args) {
Car car=new Car();
car.engine.start();
car.door.close();
car.window.rolldown();
}
}
组合的作用强大,以面向对象看,假如你在造一个Car类,那么你可以用组合轻易的将Glass,Light,Engine等等的Car这些部件组合起来。
2、继承语法
class Art{
Art(){
System.out.print("Art ~~~``");
}
}
class Drawing extends Art{
Drawing(){
System.out.print("Drawing ~~~``");
}
}
public class Cartoon extends Drawing{
public Cartoon(){
System.out.print("Cartoon ~~~``");
}
public static void main(String[] args) {
Cartoon c=new Cartoon();
}
}
可以看到 组合方式是显式性地在新类中放置子对象,而继承则是隐式地做......
这个里面还涉及到了权限的问题: 访问权限(包访问权限等..)
private部分是不能继承,属于父类私有,而public的部分,将继承,需要修改的方法,可以进行重写。要添加的属性可以单独添加。
而且继承的方法,如果原本的father的public方法重写之后没将public加上,会有Cannot reduce the visibility of the inherited method from Father,也就是不能减少父类中继承方法的可见性。super指的是父类,即Father。
看到这里,还需要附加理解2个重要的概念:重载(overload);覆盖(override);
init(Human human){
}
init(Car car){
}
这种现象就是重载;使用的时候我们可以输入不同的参数类型:a.init(Human human)或者a.init(Car car);
重载(overload):对于类的方法(包括从父类中继承的方法),方法名相同,参数列表不同的方法之间就构成了重载关系。这里有两个问题需要注意:
(1) 什么叫参数列表?参数列表又叫参数签名,指三样东西:参数的类型,参数的个数,参数的顺序。这三者只要有一个不同就叫做参数列表不同。
(2) 重载关系只能发生在同一个类中吗?非也。这时候你要深刻理解继承,要知道一个子类所拥有的成员除了自己显式写出来的以外,还有父类遗传下来的。所以子类中的某个方法和父类中继承下来的方法也可以发生重载的关系。
大家在使用的时候要紧扣定义,看方法之间是否是重载关系,不用管方法的修饰符和返回类型以及抛出的异常,只看方法名和参数列表。而且要记住,构造器也可以重载。
很多时候我们需要重写(override),比如android里面,activity里面就是重载 protected void onCreate(Bundle savedInstanceState)方法;
public class Test {
public static void main (String[] args) {
Animal h = new Horse();
h.eat();
}
}
class Animal {
public void eat(){
System.out.println ("Animal is eating.");
}
}
class Horse extends Animal{
public void eat(){
System.out.println ("Horse is eating.");
}
}
重写注意的地方参考:
http://blog.chinaunix.net/uid-26425155-id-3051250.html
再说下子类重写(override)父类
我们经常要自定义一个Adapter,继承于BaseAdapter,重写里面的方法(getCounts(),...),Eclipse很智能啊 ,往往重写BaseAdapter的时候自动把所以的重写方法列出来了,开始学的时候还以为是个什么特别厉害的技术,才发现就是重写;
重载和覆盖都是多态的表现,他们在某些地方很相似,很容易引起初学者的疑惑,这里将它们之间的区别总结如下:
1 、重载和覆盖的方法名称都相同,但重载要求参数列表不同,而覆盖要求参数列表完全相同。
2 、重载对于方法前面的修饰符没有限制,而覆盖则对这些修饰符的使用有限制
3 、重载时编译器在编译期间就可以确定调用那一个方法,而覆盖则有可能在运行期间才能确定。
代理类
所谓代理,就是一个人或者机构代表另一个人或者机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
首先参考代理模式:http://www.cnblogs.com/java-my-life/archive/2012/04/23/2466712.html
自己也写了个例子:没有继承一个抽象类而已
老师要把作业本交到教务处,不想见到副校长,就让学生去送,这样老师就不用见到校长了~
public class TeacherClass {
public String getSysInfo(){
return "代表老师要把这个作业本交到教务处";
}
}
<pre name="code" class="java">public class StudentClass extends TeacherClass{
@Override
public String getSysInfo() {
return super.getSysInfo();
}
}
</pre><p><pre name="code" class="java">//test class
public class Test {
private String data;
public static void main(String[] args) {
StudentClass stu=new StudentClass();
System.out.println(stu.getSysInfo());
}
}