黑马程序员技术交流社区
标题: 装饰类编译通不过 [打印本页]
作者: _Water 时间: 2014-4-22 01:46
标题: 装饰类编译通不过
本帖最后由 _Water 于 2014-4-22 14:42 编辑
- class Person{
- private int age;
- private String name;
- Person(String name,int age)
- {
- this.age =age;
- this.name=name;
- }
- public String getName()
- {
- return name;
- }
- public int getAge()
- {
- return age;
- }
- public void say()
- {
- System.out.println(this.getName());
- }
- }
- class Person2
- {
- public String getName()
- {
- return "anme";
- }
- public int getAge()
- {
- return 10;
- }
- }
- class SuperPerson extends Person //初步原因:继承Person,无法将类 Person中的构造器 Person应用到给定类型。。求解释。。extends Person2没问题
- {
- private Person p;
- SuperPerson(Person p)
- {
- this.p=p;
- }
- }
复制代码
作者: 王松松 时间: 2014-4-22 02:09
代码贴全一点嘛
作者: WO.瘾姓埋銘 时间: 2014-4-22 04:24
继承类的构造方法错了 ,如果父类没有无参的构造方法,在子类构造方法中就得先调用父类的构造方法
SuperPerson(Person p)
{
super( "dfd" , 12 );
this.p=p;
}
还可以在父类中添加一个无参的构造方法
作者: 官珺伟 时间: 2014-4-22 04:47
这个不是装饰类。下面的才是装饰类,装饰类是对简单类功能的加强。
- /*
- 装饰设计模式:
- 当想要对已有的对象进行功能增强时,
- 可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。
- 那么自定义的该类称为装饰类。
- 装饰类通常会通过构造方法接收被装饰的对象。
- 并基于被装饰的对象的功能,提供更强的功能。
- */
- class Person
- {
- public void chifan()
- {
- System.out.println("吃饭");
- }
- }
- class SuperPerson
- {
- private Person p ;
- SuperPerson(Person p)
- {
- this.p = p;
- }
- public void superChifan()
- {
- System.out.println("开胃酒");
- p.chifan();
- System.out.println("甜点");
- System.out.println("来一根");
- }
- }
- class PersonDemo
- {
- public static void main(String[] args)
- {
- Person p = new Person();
- //p.chifan();
- SuperPerson sp = new SuperPerson(p);
- sp.superChifan();
- }
- }
复制代码
作者: 创造命运 时间: 2014-4-22 09:29
本帖最后由 创造命运 于 2014-4-22 09:44 编辑
下面两句话可以解释为什么你编译不同过。
1.如果一个类你不写构造函数,那么会隐式帮你加个空参数的构造函数;如果你显示写了构造函数,那么这
个类的构造函数就是你写的那个或那些,即使这些构造函数中没有空参数构造函数也不会再帮你隐式加了。
2.子类的构造函数第一行会隐式加个super()调用父类的空参数构造函数;如果父类没有空参数的构造函数,
子类的构造函数第一行要显示的使用 super(参数)来指定调用父类哪个构造函数,不然会编译报错。
SuperPerson(Person p)
{
super( "abc", 10 ); //在代码里加上这句话就OK了。
this.p=p;
}
另外,关于装饰者模式:
1.装饰者模式中要求:装饰者中含有被装饰者的引用.
2.装饰者模式中要求:装饰者和被装饰者应该实现同一个类型.
看如下代码
abstract class Person //定义一个抽象类
{
String nam;
int ag;
pubic abstract void sop(){}; //抽象方法
}
class Student extends Person //定义Student类继承Person
{
private String name;
private int age;
public Student(String name, int age)
{
this.name = name;
this.age = age;
}
public void sop()
{
System.out.println(name+"......"+age);
}
public String getName()
{return this.name;}
public int getAge()
{return this.age;}
}
class Student1 extends Person //定义Student1类继承Person
{
Person person;
public Student1(Person person)
{
this.person = person;
}
public void sop()
{
person.sop();
System.out.println("My name is tang jian"); //扩展
}
}
public class Test
{
public static void main(String[] args)
{
Student stu = new Student("tang", 24);
Student1 stu1 = new Student1(stu);
stu1.sop();
}
}
运行结果:
tangjian......24
My name is tang jian
作者: 四川男人 时间: 2014-4-22 09:49
person自定义了带参构造函数,系统不提供无参构造函数,子类继承person,就必须显式调用person类的构造方法,方式就是super(name,age);而superperson类中,没有显式调用super(name,age);报错;
person2中没有重载构造函数,系统默认提供无参构造,子类构造函数第一行默认提供super()语句,所以继承person2能够通过;
作者: kuroro自走核炮 时间: 2014-4-22 09:54
问题应该是出在继承上了吧?
继承具有无参构造方法的类时,系统会自动生成一个隐形的super()帮你在子类中复写构造函数。
但如果继承的是带有参数的构造函数的类时,你需要自己重写一个super调用到父类的构造方法。
class SuperPerson extends Person //初步原因:继承Person,无法将类 Person中的构造器 Person应用到给定类型。。求解释。。extends Person2没问题
{
private Person p;
SuperPerson(Person p)
{
super(name,age);
this.p=p;
}
继承person2可以是因为person没有有参数的构造方法。
}
作者: _Water 时间: 2014-4-22 14:42
明白了,感谢大家的回复。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |