知识回顾课总结

   今天晚上到蓝杰上了一节课,胡哥给我们讲了一些关于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中的构造方法中有参数,那么默认无参的构造方法调用就 会出现问题)
    。。。。。。。其他具体我一时也想不出来了,大家要是看到这篇文章刚好想出一些不同的情况的可以补充一下。。

猜你喜欢

转载自lixiongzhi-m.iteye.com/blog/1571372