美文网首页
2018-12-05 今日小结

2018-12-05 今日小结

作者: EDTA2Na | 来源:发表于2018-12-06 00:24 被阅读0次

    今日学习(写完的时候已经是昨天了。。)

    Java类和对象,内部类,静态变量/方法,静态初始化块,封装;
    C++复习复习;
    高数不定积分;


    这是问题

    问题一:Java类中变量声明赋值

    C++中,类的数据成员变量声明时是无法直接赋值的,类的成员在定义时并没有被分配内存空间
    例如这段最简单的代码:

    #include<iostream>
    using namespace std;
    class a {
    public :
        int a = 1;
    };
    int main()
    {
        a b;
        cout << b.a;
    }
    
    这种写法编译时会报错

    但在Java中这种写法是可行的。例如:

    public class test1 {
            int b=1;
            public static void main(String[] args){
            test1 c=new test1();
            System.out.println(c.b);
        }
    }
    
    这种做法在java中可行

    这种写法对于初学C++然后学java的我来讲就有点不能接受了,因为类成员在定义时的内存空间两种语言应该是一样的,但是为什么会这样呢。
    在稍微找了找资料之后,这个问题有了答案。

    1、Java类的成员变量在被修饰为public、protected和包访问权限时,可以在不同层次上直接给成员变量赋值。
    但是,赋值的前提是:必须存在持有成员变量的对象。而对象的初始化必须调用构造函数,所以构造函数是必不可缺的。
    至于使用构造函数还是直接声明时给成员变量赋值,那就要看情况而定。
    如果创建的这个对象是不可变的,那么就必须使用构造函数成员变量,反之,就无所谓。
    另外,直接给成员变量赋值,Java是不推荐的,因为这样会破坏它的封装性。所以,建议在构造函数或提供setters方法对变量赋值。
    2、成员变量的赋值一般通过构造函数;直接赋值一般的话都是一些常成员变量,final关键字开头的。
    3、其他的时候基本上都是用构造函数构造函数试用于动态创建对象。基于对象编程的思想,是不赞成直接给类里面的变量直接赋值的。
    作者:小开
    链接:http://www.zhihu.com/question/20616186/answer/15646132
    来源:知乎

    看来是Java编译器在编写时允许了这种写法,这与C++很不一样。理论上类在没有创建对象的时候成员是没有内存空间的,但是却能赋值。我只能理解为是我这样赋值的时候会改变Java提供的类的默认构造函数完成初始化,但是在已经有构造函数的时候呢?我并没有做过这样的尝试,等有时间的时候再做测试。
    Java允许这种赋值方式做看起来能避免一些在不经意时写下的(在C++中)错误的写法,虽然我并不喜欢直接在类对象声明时直接赋值这样做。(初学者的课程中遇到这种写法让人很摸不着头脑,在学习没有指针这个概念的Java时初学者可能更容易陷入误区)

    问题二:在未写明访问修饰符的情况下的成员访问情况

    在封装时随手打出了这样的代码:
    在包1中

    package quiz2d8;
    import quiz2d5.test1;                          //在此处导入另一个包的类
    public class HelloWorld {
        public void show(){
            int score;
            class MInner{
                int score=83;
                public int getscore(){
                    return score+10;
                }
            }
        MInner a=new MInner();
            score=a.getscore();
            System.out.println(score);
        }                                                              
    public static void main(String[] args){
            HelloWorld a=new HelloWorld();
            a.show();                                                    //中间这些都是在做题的时候留下来的
    
            test1 b=new test1();                                  //在此处创建一个test1类的对象b
            test1.Inner c= b.new Inner();                    //再创建一个test1中的内部类Inner的对象c
            c.show();                                                  //在此处访问Inner类的方法show
        }
    }
    

    导入的类

    package quiz2d5;
    
    public class test1 {
        public  class Inner{                                        //定义一个内部类Inner
             void show(){                                             //为内部类Inner定义一个方法show
                System.out.println("welcome!");
            }
        }
    }
    

    在思路上好像没有问题,但是在实际编译时出现了错误


    Cannot be accessed from outside package

    出现了在包外无法访问的错误。说实话这个问题还是困扰了我好一会儿的,晚自习下课的时候也没有想到好的解决办法。
    回宿舍的时候灵机一动,在void show前面加上了public,这样被导入的代码变成了

    package quiz2d5;
    
    public class test1 {
        public  class Inner{                                        //定义一个内部类Inner
            public void show(){                                             //为内部类Inner定义一个方法show
                System.out.println("welcome!");
            }
        }
    }
    

    问题就解决了


    不再报错

    然后想起了今天看到的访问修饰符的限制范围表


    Java访问修饰符
    看起来只有public才能在包外访问了。
    看来要好好记住这个表。

    今天遇到的问题看起来都是小问题。初学的时候也没有能力去探究那些深奥的问题。一天时间看了三四个小时Java,看起来用了很多时间,实际上并没有学多少东西。而英语四级考试迫在眉睫,高数也进入了比较难的章节,何况高数又是我的软肋。可能接下来的学习重心要向高数和英语转移一些才是。只要也要等到四级结束之后再来猛肝Java了。

    吾生也有涯,而知也无涯


    明日计划

    (写完的时候应该已经是今日计划了。。。。)
    1.四级卷子>=1;
    2.高数题组+复习;
    3.Java继承、多态(可能弄完上面两个给Java的时间就很少了)
    4.(如果有时间的话还想)自学C++的运算符重载
    ↑这些计划全完成可能是在做梦
    Fighting


    本来这篇文章到上面就应该结束了,结果坑爹的简书把我文章后半部分给吞了。00:25写完45看的时候才意识到这个问题,又花时间把文章补充完再改改。要没时间睡觉了难受。
    真是烦的一笔。

    相关文章

      网友评论

          本文标题:2018-12-05 今日小结

          本文链接:https://www.haomeiwen.com/subject/dadgcqtx.html