20java的组合&IDEA踩坑合集1

组合(模式)

组合(模式)的概念:组合多个对象形成树形结构以表示有整体-部分关系层次结构,组合模式可以让客户端统一对待单个对象和组合对象。

组合继承能实现相同的效果,但是使用方法有所区别。

  • 下面看组合的程序实例:
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 然后再打开就消失了。

posted @ 2020-10-12 17:17  发达的范  阅读(206)  评论(0编辑  收藏  举报