组合(模式)
组合(模式)的概念:组合多个对象形成树形结构以表示有整体-部分关系层次结构,组合模式可以让客户端统一对待单个对象和组合对象。
组合和继承能实现相同的效果,但是使用方法有所区别。
- 下面看组合的程序实例:
package oop.OopDemo.Polymorphic;
public class Test {
public static void main(String[] args) {
Student student = new Student();
student.run();
student.speak();
student.person.print();
student.teacher.teach();
System.out.println(student.person.name);
}
}
package oop.OopDemo.Polymorphic;
public class Student {
Person person = new Person();
Teacher teacher = new Teacher();
public String name;
public int age;
public Computer computer;
public void speak() {
person.speak();
System.out.println("Student is speaking");
person.name = "I was initialization here.";
}
public void run() {
person.run();
System.out.println("Student is running");
}
}
package oop.OopDemo.Polymorphic;
public class Person {
public String name;
public Person() {//无参构造器
}
public void print() {
System.out.println("I'm Person class!");
}
public void speak() {
System.out.println("Person is speaking!");
}
public void run() {
System.out.println("Person is running");
}
}
package oop.OopDemo.Polymorphic;
public class Teacher{
public void teach() {
System.out.println("I'm teaching");
}
}
注意:这里的四个类在同一个package下!
运行结果:
上述代码并未使用继承,但是仍然实现了不同类之间方法的使用
由以上的执行结果可见,Student类并未继承Person类和Teacher类,但是仍能够读写Person类和Teacher类的属性和变量,这里使用了组合。而且可以看到,相比继承来说,使用组合能够更加灵活方便的实现不同类的属性和方法的调用。
- 那么问题来了,组合和继承可以实现相同的功能,那究竟使用哪个?
下面说一个比较popular的规则:
如果是 “is-a” 关系,就是用继承。
比如:哺乳动物是动物,学生是人,等等
如果是 “has-a” 关系,使用组合。
比如:电子计算机有CPU,汽车有发动机,等等。
注意:经测试:对于上述程序,如果主类和这些组合类不在同一个包中,是无法调用组合的类的。但是被组合的类如果不在同一个包下,是可以import,然后再组合实现的。
这里说teacher不是public,实际上Teacher是public,目前还不太清楚报错的原因,以及如何解决。
- 上面的报错有了新进展,根据报错的提示,我把new teacher 对象的语句加了一个修饰符public,虽然我之前从来没见过这种用法,没想到尝试了一下竟然神奇般的不报错了,还能正常输出,程序如下:
public Person person = new Person();
public Teacher teacher = new Teacher();
public Point point = new Point();
- 另外附上修饰符的作用范围:
IDEA踩坑合集1
01问题描述:所有的.java文件图表左下角有个红色时钟,全部报错
解决办法
1.
2.
3.如果还不行,就重导入项目
出现大面积的程序的包路径不对,也可以尝试重新导入项目解决。
还有可能是下图这个地方不对
选择相应的configuration即可
02问题描述:打开IDEA显示之前的project路径不能用了,但是我没动过java project的文件路径
解决办法
按照提示导入原来的project即可,需要注意的是,其中有一步是选择override现有的Module,还是reuse,选择reuse。
03问题描述:代码不报错但是下面一直有波浪线
代码下面有波浪线,报错:Duplicated code fragment,意思是这部分的代码跟其他地方的有重复,不影响运行,如果点击show就会变成下图这样,真智能,就是这个绿色的区域不好消除,我试了几次只有关闭这个class 然后再打开就消失了。