一:

Fish fh=new Fish();
Animal an;
an=fh;
an.fun();
首先java中对象之间的是引用赋值,所以应用那个就调用哪个的方法,它没有就调用上一层的方法
二:
子类对象是父类的一个实例;比如,汽车,奔驰汽车,奔驰汽车是汽车。子类创建实例时调用了父类的构造方法。
 
三:包,在命令提示符中运行java文件时必须保证文件路径是完整的,不能有重叠交错。
四:final方法不能被覆盖
五: 在java中if或while中如果要写死循环,不能写成if(1)或while(1),而应该写成if(true),判断值应该是boolean类型。
六: java中数组在定义时不能直接指定数组的大小,形如int a[3],正确的写法是int a[]=new int[3];或者写成int a[]; a=new int[3];java中数组推荐定义方式int[] num;对数组
七. java中类的成员方法在内存中只有一份拷贝,即是所有的对象公用,而成员变量则是每个对象对应一分拷贝

 
八. 为什么java中的main方法要设置成static
     首先因为static函数属于类本身,不属于对象,可以直接以类名调用;其次java是完全面向对象的,所以要在类中找到                  
             main函数,成员函数是要在类的对象初始化后才能使用,main函数是java编译器进入程序的入口,如果不是static   
             就找不到main,程序就无法执行。
九. java中的final常量:当它为非静态时,可以再声明时初始化或者在类的构造函数中初始化;当这个常量是static时候,它       
    只能在声明时初始化,若在构造函数中初始化,则类的对象没有生成时,这个静态常量没有值,它属于类
十.java中存在类的继承时,生成子类对象时,首先调用父类的构造函数,接着调用子类的构造函数。当父类没有提供默认    
   构造函数时,而是提供了有参数的构造函数,但在子类构造函数中没有显示调用,编译器就会报错,正确的做法是显示调   
    用父类构造函数。构造方法不能被继承,在子类中调用父类构造函数时只能用super(),若直接用父类的名称调用构造
    函数,说明这个函数从父类继承了下来,其实不然;
十一.在命令行窗口下编译java程序时,若是在java源程序中指定了包的层次结构,指定classpath时应该指定的是源程序中    
      顶层文件的上级目录,
十二.java数组中,字符数组末尾不存在'\0'结尾
十三.java中的垃圾回收机制:当内存中的空间不够时,垃圾回收器才会运行进行垃圾回收。由函数finalize()处理。
十四.java中子类中继承的函数的访问权限不能低于父类中函数的访问权限,同样的规律也适用于实现接口中的函数。而且接口中函数的默认为public abstract。。。接口类是抽象的,当某个类实现接口时必须实现接口中的
所有抽象函数。
十五.java中不允许类的多继承,但是类可以实现多个接口或者在继承的时候实现多个接口。要先继承类在实现接口

 
十六.内部类即使声明为public在外部类之外不能直接初始化对象,既不能在外部Inner inner=new Inner();,因为内部类在外部类之外不可见。类还可以定义在一个函数内部,它的作用域在函数内等。不管一个类嵌套的层次有多深都可以访问外部类的成员
 
通过类名加this指针来访问多个外部类的成员变量。
十七. 怎样在外部类之外生成内部类的对象?
        Outer outer=new Outer();
        Outer.Inner inner= outer.new  Inner();这里需要一个指向外部类的引用,因为内部类能够随意的访问外部类的成员,所以必须先生成了外部类的对象,为其成员分配了内存,内部类才可能访问到外部类的数据成员,但是当Inner类声明为static类型时,可以不用先生成外部类的对象,直接使用 Outer.Inner inner=new Outer.Inner();内部类可以被声明为final static private protected,abstract这写类型。

 
十八.关于内部类定义为static的一些相关知识:当内部类定义为static时,它就不能访问外部类的非静态成员变量和非静态成员方法;放内部类不是静态时,它的成员就不能被声明静态的,只有顶层类中才可以声明static成员而不管该类是不是静态的。

 

 
十九.当java程序出现异常时,就会产生一个异常类的对象,这个对象就会被传递给java运行时系统,当系统找不到处理的代码时,java程序就会被终止。异常之后的代码都不会被执行。
二十.try -- catch 语句
       try
      {
      }
     catch(Exception e)
     {
     }
    当try语句块中的语句出现异常时,异常语句后面的语句就不会执行,他会直接跳转到catch语句中执行相应的代码
当语句后面被声明为throws Exception 时 ,出现异常时,会将异常抛给该语句的调用者,比如
异常就抛给了excep这个类来处理。如果main函数也声明为throws Exception则最后抛给了java运行时系统来处理。
二十一.子类中函数抛出的异常不能超出父类中的异常,或是新的异常。因为有些函数的参数是父类的对象,有时传递的实参是子类的对象,如果出现新的异常就会没有捕获到是编译不能通过。但是构造函数中可以抛出新的异常。
二十二.java中字符串所有字面值(例如"abc")都看成此类的 实例实现。所以如下代码判定的结果是真
String str1="abc";(string类型间赋值是引用赋值)
String str2="abc";
if(str1==str2)
System.out.println("str1==str2");
else
System.out.print("str1!=str2");
但是当采用构造方法来给对象赋值时,上述结果就是假。(String str1=new String("abc"); String str2=new String("abc");此时str1!=str2;因为采用new 时,是在堆内存中分配一块内存区域给对象,如下:
则str1和str2中就保存的是两个对象的首地址。如图。)
二十三.在java中只是对String类重载了“+”“+=”这两个操作符,其他的任何数据类型都不适用这两个。java不支持操作符重载。

 
二十四.当语句System.out.println(pt);中调用的是类的对象时,参数里面会调用对象的toString();方法,返回对象实例所属的类名加上一个@符号还有就是十六进制的哈希描述码,因为java中所有的类都是从Object继承而来。一般建议在各个子类中重写toString方法;
二十五.java中根类中提供了一中克隆的方法,支持对象之间的复制,即clone()方法,在子类中必须覆盖object类中的clone方法,因为在object类中它是protected   Object   clone( ) throws   CloneNotSupportedException覆盖之后它会抛出一个异常,要么用try catch语句捕获,要么在子类中实现接口cloneable,那样克隆方法才可以使用。在子类中覆盖时一定要调用super.clone();因为object类的clone方法调用时能够识别要复制的对象,并为对象分配存储空间,然后将对象里面的内容一一复制到新的存储空间。基本数据类型复制和String类型进行复制时只是拷贝了这些数据的一个副本,改变复制之后对象里面的值不会影响原先对象的值,但是如果子类中存在像类,数组这种引用类型数据时,复制的就是这些对象的地址空间,两个对象指向同一块内存区域。Sting类型虽然也是引用但是这里比较特殊,因为String类型的一个对象是个常量比如“aa”在进行String str="aaa";赋值是首先在堆内存中给“aaa”分配一块内存,再把这个对象的地址赋给str,当再次给str赋值时,也是先生成常量对象在复制地址。

 
二十六.对于对象数采用java.util.Arrays;类库中的函数Arrays.sort(数组);对对象数组进行排序时要求该类必须实现接口Comparable而且在该类中要重写public   int  compareTo(object o);函数,并且该类中存在可以比较的类型的数据,负责会抛出异常ClassCastException;
二十七.java中提供一个类Class,它表示的是正在运行的java应用程序和接口。基本的 Java 类型 ( booleanbytecharshortintlongfloat    double)和关键字   void  也表示为   Class  对象。
二十八.java中每个类都有一个函数public final   Class<?>   getClass();此函数用于获取该类型的一个对象,返回该类类名。

 
二十九.下面几种方式用来获取Class类的实例:
       1.Point pt=new Point();
           Class cl1=pt.getClass();
           System.out.println(cl1.getName());
       2. Class cl2=int.class;
            System.out.println(cl1.getName());

      3.使用forName()

        try
        {
              Class cl3=Class.forName("Point");   //forName执行时会抛出一个ClassNotFoundException异常就要捕获或抛出
                System.out.println(cl1.getName());


 

         }
        catch(Exception e)
       {
            e.printStackTrace();
      }
4.Class cl4=Integer.TYPE;      //只有这中封装类才可以使用TYPE这个关键字
                System.out.println(cl1.getName());
 
三十.对于集合类中的List , Set类,在使用迭代器时正确的使用方法是,List i=new List();  Interator it=l.iterator();
        List Sort中都提供了iterator();方法的实现,返回的是迭代器类型的对象。对于迭代器中的remove()方法,必须首先调用next();方法,否则会抛出异常IllegalStateException,
 三十一.java中使用迭代器Iterator的好处是:提供了一种通用的方式访问实现了集合框架中各种借口的类。
    
实线表示继承接口,虚线表示实现接口的类
三十二.只有真正实现了remove()方法,即在函数体中具有语句,调用它的时候不会抛出异常,在list set 这些接口中没有真正实现接口,所以像List l=Arrays.asList(); Iterator it=l.iterator();it.next();it.remove();这些语句会抛出异常UnsurpportedOperationException;
三十三.java中的散列表,散列思想:
           以结点的关键字为自变量,通过散列函数计算对应的函数值,再以这个值为该结点在散列表中的地址存储该节点。这是利用散列思想存储元素的过程,而查找散列表中元素时,也是先通过函数计算地址,在访问地址中的元素。
三十四.java中不允许类的多继承,但是可以通过实现接口的多继承来间接实现。接口不允许创建实例如:32 public class B implements A{}   A a=new A();这是错误的,但是可以定义接口类型的引用变量,它引用了实现该接口的类的实例,比如:A a=new B();
三十五.
       
  管道输入流与输出流是用于进程间通信的通道,第一个进程通过PipedOutputStream输出流将要发给第二个进程的信息输出,接着它连接到PipedInputStream类,进而送给第二个进程,从而完成进程间的通讯。

 
三十六.java中的java.io.Serializable序列化接口是标记接口,其中没有方法。对象序列化只是把一个对象转化成字节流。只有声明实现java.io.Serializable序列化的接口类,其对象才能通过字节流进行读写操作。

 
 三十七.java中面板类Panel中的组件默认布局管理器是FlowLayout布局管理器。
  三十八.在一个类的内部重写toString()方法,如果在它里面调用this就会陷入死循环知道栈溢出。

 

 
三十九.在实际开发过程中,最好不要去直接继承一个已经实现好了的类,而应该去继承一个抽象类或者实现一个接口,如果可以同时继承与实现,则优先选用接口,这样可以避免单继承的局限性。

 

 
四十.接口与抽象类之间的异与同:
          (1).接口和抽象类都不能直接实例化对象,必须给他们传递子类对象才可实例化;
          (2).抽象类中能够拥有的属性是:抽象方法,普通方法,变量,常量,构造方法,一个抽象类可以没有抽象方法
                接口中能够拥有的属性是:常量和抽象方法
          (3).抽象类具有单继承的局限性,接口可以实现多个接口
          (4).抽象类中可以定义接口,接口中可以定义抽象类
          (5).抽象类通常作为一种模式,而接口则作为一种标准或规则