知识回顾课总结

今天晚上到蓝杰上了一节课,胡哥给我们讲了一些关于java编程中比较容易又经常犯的错误。借此也回顾了前面学过的一些知识。
今天晚上讲的内容大概如下:
1.死递归
比如有这样一个类A{
A a=new A();
}
类中用该类实例化了一个对象,就像c语言中在一个函数中调用自己,我们知道这个是一种递归。很容已看出,当new A()语句运行时内部有得实例化对象,这种过程会一直持续下去。即会陷入死递归。
这种情况编译并不出错,但运行时就出错了。运行时会出现这样的语句Exception in thread "main" java.lang.StackOverflowError,当应用程序递归太深而发生堆栈溢出时,抛出该错误。

2.栈溢出
其实上面那种情况我觉得也是栈溢出的一种类型,栈溢出还包括下面这种情况
比如我们创建一个数组,我们知道创建一个数组,也就向内存申请的一段空间,所以创建数组也称作申请内存或申请缓冲区,内存都是有限的所以当数组所占空间超过内存时便发生栈溢出。
8bit(位)=1Byte(字节)
1024Byte(字节)=1KB
1024KB=1MB
1024MB=1GB
1024GB=1TB
所以我们可以根据数据类型所占字节数算出其所占内存空间的大小。看其是否超出内存空间的大小。

3.数据类型和一些关于内存空间的问题:
数据类型(1)基本数据类型(2)引用类型
其中要注意的是String它是一个类,但是它属于值传递(一般类的都是属于引用传递),而数组虽然不是一个类但也属于引用传递(址传递)
如:
String s1="abc";
String s2="bed";
s1=s2;
s2="opq"
运行出来s1是"bed",这便是值传递。
再者假设A{}是我们自己创建的一个类
A a1=new A();
A a2=new A();
A a3=new A();
当执行a1=a2时a1便指向了原来a2所值的对象,a1原来所指向的内存空间被释放掉。
当我们创建一个整形数组如 int a[]=new a[10];我们知道a数组里面所指的元素都是0,同样内存也给他分配了相应的空间。
但如A[]=new A[10];(A{}是一个类),又是怎样分配内存空间的呢?
是这样的,默认该数组内所指的对象都是一个空指针,指针是四个字节的。
当执行A a=A();a[1]=a;时a[1]便指向了一个具体的对象,其所占内存就和对象a有关系了。
再看如下代码
A{
private B b;
A(B b){
b=this.b;
}
}

在主函数中运行下面语句
B b=new B();
A a=new A(b);
很明显我们知道在A{}中构造方法中b对象永远指向没有实例化的属性b,所以这个程序运行便出现了空指针的错误。虽然按照我们的习惯犯这种错误的几乎是不可能的,但这个例子很好的让我们理解了引用传递(值传递)。


4.请看如下代码:
A a=new B();
一看这句代码我们马上可以看出要是这句代码是正确的,那么A和B肯定有继承关系,并且Aw为B的父类。
但老师让我们说什么情况下这句代码是错的,当你听到这句话时或许你会觉得很简单,错误的情况多得是,但要你一一列举还真不是一件简单的事。
根据同学们的讨论有一下一些情况这句代码是错误的。
(1)类没有创建。
(2)B是A的父类。
(3)两个类没有关系。
(4)B是接口或者抽象类(我们知道接口和抽象类是不能实例化对象的)
(5)B类中参数的问题(比如B中的构造方法中有参数,那么默认无参的构造方法调用就 会出现问题)
。。。。。。。其他具体我一时也想不出来了,大家要是看到这篇文章刚好想出一些不同的情况的可以补充一下。。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值