今日学习(写完的时候已经是昨天了。。)
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看的时候才意识到这个问题,又花时间把文章补充完再改改。要没时间睡觉了难受。
真是烦的一笔。
网友评论