Java学习摘记

一、关于javastringstring...的意思:

1. 首先String不属于8种基本数据类型,String是一个对象。  因为对象的默认值是null,所以String的默认值也是null;但它又是一种特殊的对象,有其它对象没有的一些特性。

  2.new String()和new String(“”)都是申明一个新的空字符串,是空串不是null;

  3.String str=”kvill”;  String str=new String (“kvill”);的区别:  在这里,我们不谈堆,也不谈栈,只先简单引入常量池这个简单的概念。  常量池(constantpool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。

       public void test(String... books){

            System.out.println("***形参长度可变的test方法***");

       }

其中“String... books”可以输入多个参数,也可以不输入


二、java里类方法和实例方法:

你说的类方法是不是静态方法呀,实例方法是不是指声明对象后使用这个对象的方法呢. 首先你这两个名词说法我是真没听说过. 如果指静态方法的话,是指不用声明就可以使用的方法, 这些方法被定义在一个静态类中,使用的直接写类名.方法(); 而你所说的实例方法应该是那些非静态的方法,也就是说必须先声明包含这个方法的类的实例,然后通过这个实例来使用这些方法. 这就是它们两个的不同点.

@@

我们已经知道类体中的方法分为实例方法和类方法两种,用static修饰的是类方法。二者有什么区别呢?当一个类创建了一个对象后,这个对象就可以调用该类的方法。

当类的字节码文件被加载到内存时,类的实例方法不会被分配入口地址,当该类创建对象后,类中的实例方法才分配入口地址,从而实例方法可以被类创建的任何对象调用执行。需要注意的是,当我们创建第一个对象时,类中的实例方法就分配了入口地址,当再创建对象时,不再分配入口地址,也就是说,方法的入口地址被所有的对象共享,当所有的对象都不存在时,方法的入口地址才被取消。

对于类中的类方法,在该类被加载到内存时,就分配了相应的入口地址。从而类方法不仅可以被类创建的任何对象调用执行,也可以直接通过类名调用。类方法的入口地址直到程序退出才被取消。

类方法在类的字节码加载到内存时就分配了入口地址,因此,Java语言允许通过类名直接调用类方法,而实例方法不能通过类名调用。在讲述类的时候我们强调过,在Java语言中,类中的类方法不可以操作实例变量,也不可以调用实例方法,这是因为在类创建对象之前,实例成员变量还没有分配内存,而且实例方法也没有入口地址。

class A

{    int x,y;

    static float f(int a){}

    float g(int x1,int x2){}

}

class B

{  public static void main(String args[])

   {  A a1=new A();

     A.f(2,3);        //合法。

     a1.f(2,4);       //合法。

     a1.g(2,5);      //合法。

     A.g(3,2);      //非法。

    }

}

 

三、类A是公共的,应在名为A.java的文件中声明错误:

第一种!!!

 

“类A是公共的,应在名为A.java的文件中声明”这句话需要分两步来理解:

1、如果类A被声明为公共的(public),那么必须将类A保存在名为A.java的文件中;

2、反之,在一个文件中最多包含一个顶级的公共类,并且该公共类的名字与文件名相同。比如文件A.java中,允许定义一个或多个类,但最多允许一个顶级的公共类,此类名为A。此处强调的顶级的意思是,允许非顶级的公共类存在,如内部公共类等。

 

 

第二种

这是你的命名错误把文件名改为 A.java 因为你里面的类是 public class A{} 要不你把你这个公共的(public)去掉要不就要和类名保持一致

第三种

一个文件中最多只能有一个类是public的,这样可以暴露类的定义,方便其他类来访问!如果已经有了这个公共的类那么这个文件名必须和类名相同!

还要注意,如果你只建了一个java文件,public只能声明在public static void main前,要不即使你自己定义的public 的类名与你声明的java文件的名字一致,也只能是枉然。

 

四、子类重写父类方法应遵循的:


java中的基本数据类型的大小:

int    32bit   4字节
short   16bit  2
long    64bit  8
byte    8bit   1

char   16bit  2
float   32bit  4
double  64bit  8

抛出的异常类大小:

·        java.lang.Object     

·        java.lang.Throwable

·        java.lang.Exception            最大

·        java.lang.RuntimeException            

·        java.lang.IndexOutOfBoundsException          最小

形参列表相同:

参数个数和类型要相同。

class Base{

         publicvoid amethod(int i)throws Exception{

                   System.out.println("father");

         }       

}

 

public class Scope extends Base{

         publicstatic void main(String[] args) throws Exception{

                   newScope().amethod(5);                                     //自动调用父类方法(super().amethod(5))

                   newScope().amethod(5,5);

         }       

         //在这里定义一个方法

         //voidamethod(long i)throws Exception{}                //Scope类自己的方法

         //voidamethod(long i){}                                                                                      //Scope类自己的方法

         publicvoid amethod(int i,int j)throws Exception{

                   System.out.println("child");

         }

}

 

五、Javamain方法必须写在public类中吗?解决方法

class Ostrich extends Bird{                                  //去掉public一样可以执行,但是有什么区别呢

                   publicstatic void main(String[] args){

                            Ostrichos= new Ostrich();

                            os.fly();

                   }

 

                   publicvoid fly(){

                     System.out.println("child");

           }

          

                   publicclass Bird{

                            publicvoid fly(){

                            System.out.println("father");

                            }       

                   }

}

/*main 方法是程序的入口,JVM只会寻找main方法,找到后,才开始执行程序。

而java中规定文件名要与public 类的类名保持一致,所以当你编译时,

若按这样编译:javac Test.java 则会报错并提示你该程序中public 类不是该类;

而按这样编译:javac T.java 则会提示LZ所提出的错误提示;因为JVM找不到程序入口,即main方法。

最后当一个程序里只有一个类时,可以省略public,而当有多个时,必须有且只有一个public类,且文件名得与它同名。

至于为什么java中规定文件名必须跟public类的类名保持一致,这就涉及到JVM原理的问题了

*/

 

Math.floor();

round();

ceil();

pow(double a,double b);a的b次幂pow(a,8)

log 自然对数

exp e为底指数

random() 返回0.0到1.0的随机数

long round(double a) double型的数据a转换为long型(四舍五入)

round()

Math.log(Math.pow(Math.e,15));

Math.PI/4

Math.toRadians(d)

Math.toDegrees(r)

 

六、java char几个字节问题:

Java中无论是汉字还是英文字母都是用Unicode编码来表示的,一个Unicode码是16位,每字节是8位,所以一个Unicode码占两字节。但是英文字母比较特殊,源自于8位(1字节)的ASCII吗,于是在Unicode码仅使用了低8位(1字节)就可以表示,高8位的话不使用也无所谓。所以

char c='a';

System.out.println(c.getBytes().lenth()),得到的是1(字节)

但汉字就完整地使用了16位(2字节)的Unicode,所以

char c='中';

System.out.println(c.getBytes().lenth()),得到的是2(字节)

综上,c='a'在内存中确实只占1字节,但这不意味着String s="abc"在内存中只占3字节。应该这么说,Strings="abc"至少在内存中占3字节。这是因为char是基本数据类型,而String确是对象类型。对象是一种很复杂的数据类型,你要看一个对象具体占多少字节,可以把这个对象序列化后存入一个文本文件来看它具体占用了多少字节,当然这也不是精确的,因为序列化需要写入少量系统信息,但大致是对的

一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间.

符号:英文标点占一个字节,中文标点占两个字节

 

七、抽象类:

抽象类不能实例化(InputStream)父类引用指向子类对象

 

System.out.print((char)b)System.out.println((char)b);的区别:

System.out.println()这个编译器给你自动换行了 而System.out.print()这个的话没换行System.out.println()这个相当于System.out.print(“\n”)

System.out.println();-->打印空行

 

 

你可能感兴趣的:(learn)