作业是ssd3上面的Implementing the Gourmet Coffee System
主要写一下遇到的问题
- String写成Stirng
哇这个是真的debug好久啊。。简直看不出来。。。。所以我是真的要试着去搞会UML转代码了? - int型+’ '
哇用JavaScript用多了真的最不习惯其他语言的引号啊!!!太麻烦鸟
这个不能用单引号啊。。。会把’ ‘中的空格转成32加上去
包括你用写一个char a=’ ';再加a也不可以
总结一下其他有意思的差别:
- 单引号里面的是char 数据类型而双引号里是String对象对象了耶,所以就可以直接调用方法了
- equals()方法的使用
我觉得equals方法是比较好的理解java对象的工具
首先先看一个代码:
String s3=new String("apple");
String s4=new String("apple");
System.out.println(s3==s4); //false
System.out.println(s3.equals(s4)); //true
- 用**==比较:
s3与s4里存储的是它们指向的对象在堆内存中的地址。
而用 == 比较的是指向对象的引用。因为它们分别指向**的是不用的对象,所以会打出false - 用equals()比较
equals方法是基于基类Object中的方法,所以基本上对象都有,而不少对象会对其进行重写。
Object类中equals方法是用来比较两个对象的引用是否相等
但是String类对equals方法进行了重写用来比较指向字符串对象所存的字符串是否相等。所以在这里输出了true
同时还要注意equals方法不能作用于基本数据类型的变量
- java里的子类的构造函数
看到这里我要是把super()注释掉,编译器自己就会给我报错:
Implicit super constructor Product() is undefined. Must explicitly invoke another constructor
(隐式父级构造函数Product()未定义。必须显式调用另一个构造函数)
而如果我在父级类里面添一个没有参数的构造函数就不会报错了。
我是这样理解的。
首先,你得在子类构造函数调用父类构造函数先把父类继承来的属性赋值了吧。所以你必须得调用super,你不调用它就会帮你调用,而你有没有定义,就崩了。。。但是我觉得还是与编译器版本有关系吧?
super在这里是相当必要的,因为你子类无法访问父类的私有属性,只能这样先调用父类的构造方法来为之赋值。 - private内容子类的继承问题
注意到刚刚我写的是无法访问而不是无法继承
在我的理解里:确实,子类继承了父类的所有属性和方法,而private限定符只是封装类中的属性和方法使之对外不可见
举一个例子
//定义父类
public class Father {
private String name;//私有属性
private char sex;
public void tell(){
System.out.println(name+sex);
}
private void speak(){
System.out.println(name+"is speaking!");
}
}
// 定义子类,子类中什么都不写。
public class Child extends Father {
}
//测试类
public class Test {
public static void main(String[] args) {
Child c=new Child();
c.tell();//tell方法是可以用的
//c.speak();//报错,父类的私有方法不可见
}
}
我们可以看到测试类中即使没有给Child类对象的属性进行赋值,tell方法依旧是可用的。如果Child类中没有继承父类的私有属性,那么tell方法应该会报错。由此得出的结论是,子类会继承父类的所有东西,而修饰符只是影响属性或者方法对外是否可见。
更常见的例子是用父类的set方法去改变值。
子类不能直接使用父类的私有属性,但是如果子类中公有的方法影响到了父类私有属性,那么私有属性是能够被子类使用的。
个人见解,如有不足,还望指出讨论