java基础

来源:互联网 发布:三了个七 淘宝买家秀 编辑:程序博客网 时间:2024/06/06 18:59


下面开始笔记:

一,静态导入

    import语句可以导入一个类或某个包中的所有类

    import static语句导入一个类中的某个静态方法或所有静态方法

      语法举例:

    import static java.lang.Math.sin;

    import static java.lang.Math.*;

 

二,可变参数:不固定的参数

        问题:一个方法接受的参数个数不固定,例如:

          System.out.println(countScore(2,3,5));

          System.out.println(countScore(1,2,3,5));

 

**面试**overloadoverride的区别(最好说出深入的,自己的观点)

     overload:重载:在同一个类中的两个或两个以上的方法,拥有相同的方法名,但是参数却不相同,方法体也不相同,最常见

                                       重载的例子就是类的构造函数,可以参考API帮助文档看看类的构造方法

     override:重写:子类的方法覆盖父类的方法,要求方法名和参数都 

     egpublic static int add (int x,int … args)

         {

                int sum = x;

                forint I = 0;i<args.length;i++

                {

                   sum += args[1];

                }

                return sum;

}

特点1)只能出现在参数列表的最后;这个要记住

            2...位于变量类型和变量名之间,前后有无空格都可以;

            3)调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。

 

三,增强for循环

      语法:for ( (可以加上修饰符)type变量名:集合变量名 )  {

      注意事项:迭代变量必须在( )中定义!     集合变量可以是数组或实现了Iterable接口的集合类

      示例:(注释/+Shift

            for (int arg : args)

            {

                  sum+=arg[1];

            }

      课外:可以多查查SUN公司提供的源代码,看看具体代码怎么写,什么意思。。。

 

四,自动装箱与拆箱

        自动装箱:Integer num1 = 12;

        自动拆箱:System.out.println(num1 + 12);

     细节:aInteger i1 = 13

                        Integer i2 = 13

                        i1==i2;——》true

                  bInteger i1 = 137

                        Integer i2 = 137

                         i1==i2;——》false

                  cInteger i1 = Integer.valueOf(3)

                        Integer i2 = Integer.valueOf(3);

                        i1==12——》true

                  dInteger i1 = Integer.valueOf(231)

                        Integer i2 = Integer.valueOf(231);

                        i1==12——》false

           Integer装箱对象时,此时对象是一个字节之内(-128——127)会把它放进敞亮池中,下次建立此对象是直接用,不用在new新的了,可以节省内存,这种做法叫做享元模式。

      享元模式flyweight:当使用的对象使用率较高或属性相同率较大,对象又比较小,把对象存起来,如图标,把同一类型的图标设计成一个

 

五,枚举Emun

      1,出现的原因:当我们遇到问题如,要定义星期几或性别的变量,该怎么定义?假设用1-7分别表示星期一到星期日,但有人可能会写成int weekday = 0;或即使使用常量方式也无法阻止意外。枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。

   示例:1)模拟枚举类

class EnumTest

{

     public static void main(String[] args)

       {

            //int weekday = 7;

                     WeekDay weekday = WeekDay.MON();

                    //此时只能调用在WeekDay中定义好的常量,防止重复的定义

       }

}

//枚举:使用的值(如SUN等)都是在类中固定的,且都是对象

class WeekDay

{

         private weekDay(){}

 

         public finally static WeekDay SUN = new WeekDay();

         public finally static WeekDay MON = new WeekDay();

         public WeekDay nextDay()

        {

                    if(this == SUM)

                   {

                            return MON;

                   }

                   else

                   {

                           return SUN;

                   }

        }

         public String toString()

         {

                     return this==SUN?”SUN’:”MON”;

         }

}

  以上代码的另一种方法,用匿名内部类的形势

abstract class WeekDay

{

        private weekDay(){}

    //由于类是抽象的,不能建立自己的对象,因此我们建立子类对象,并覆盖方法

        public finally static WeekDay SUN = new WeekDay()

        {

                  public WeekDay nextDay()

                  {

                           return MON;

                   }

         };  //通过建立匿名内部类的方法

          public finally static WeekDay MON = new WeekDay()

          {

                     public WeekDay nextDay()

                     {

                               return SUN;

                      }

          }; 

          public abstract WeekDay nextDay()//由于这里方法抽象化,因此类也要抽象的

          public String toString()

          {

                     return this==SUN?”SUN’:”MON”;

          }

}  //用这种抽象方法定义nextDay就将大量的ifelse语句转移成了一个个独立的类,便于观看使代码简化

 

       2)基本的枚举类(也可以叫枚举的应用)

class EumTest

{

         public static void main(String[] args)

        {

                     WeekDay weekday = WeekDay.MON;

                    weekDay.name();   //获取名字

                     weekDay.ordinal()   //自己的排行

                     weekDay.getClass();

                     WeekDay.valueOf(“SUN”);   //把字符串变成WeekDay对象 

                     WeekDay.values();       //返回WeekDay的数组

          }

}

//建立WeekDay的内部类

public enum WeekDay   //枚举的关键字

{

      SUN,MON,TUE,WED,THI,FRI,SAT;(这里的分号可以使用,也可以省略)

       private WeekDay(){}    //枚举的构造方法必须在元素列表之后,且必须是私有的

                                             //调用的时候都是调用第一个方法

       private WeekDay(int day){};  //在元素后加()SUN(1),调用此时的方法

}  //枚举

        3)带有抽象方法的枚举

public enum WeekDay  

{

         SUN(1),MON,TUE,WED,THI,FRI,SAT;  

           //(这里的分号可以使用,也可以省略)

          private WeekDay(){}   

           //枚举的构造方法必须在元素列表之后,且必须是私有的

           //调用的时候都是调用第一个方法

          private WeekDay(int day){System.out.println("frist");} 

           //在元素后加()如SUN(1),调用此时方法

}   //枚举

        4)如果枚举只有一个对象,就可以用单例的实现方式

new Date300{} //new Date的子类,子类的构造方法可以调用父类有参数的构造方法,可以加上参数

 

六,反射

1Class类:

     1)反射的基石,Java类用于描述一类事物的共性,该类事物有什么属性,没有什么属性,至于这个属性的值是什么,则是由这个类的实例对象来确定的,不同的实例对象有不同的属性值。Java程序中的各个Java类,它们是否属于同一类事物,是不是可以用一个类来描述这类事物呢?这个类的名字就是Class,要注意与小写class关键字的区别哦。Class类描述了哪些方面的信息呢?类的名字,类的访问属性,类所属于的包名,字段名称的列表、方法名称的列表,等等

     2),定义ClassClass cls1 =字节码1;(当我们在建立对象的时候,会在内存中建立一份字节码)

     3),获取字节码的方式:三个字节码是一样的

             aClass cls = Date.class;  //建立一份Date文件的字节码

             bDate d = new Date();

                d.getClass();      //获取字节码

             cClass.forName(“java.lang.Date’);   //**面试**这个方法的作用:返回字节码返回两种,一种是JVM中已经加载了字节码,一

                                                                                               种是没有字节码,现加载到内存中

     4),预定义的Class实例对象:八个基本类型,和一个void类型

              在源程序中出现的类型,都有儿子各自的Class示例对象

     5)方法:isPrimitive();   //是否是原始类型字节码

               int.Class = = Integer.TYPE——》true

              数组类型的Class示例对象:Class.isArray()

2,反射定义:反射就是把Java类中的各种成分映射成相应的java类。例如java类的Class类要提供一系列的方法,来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类的实例对象来表示,它们是FieldMethodContructorPackage等等。

            但是反射会导致系统性能下降。

3Constructor类(构造方法类):代表了某个类中的一个构造方法

     1)得到某个类所有的构造方法:

      Constructor [] constructors= Class.forName("java.lang.String").getConstructors();

     2)得到某一个构造方法:

      Constructor constructor =

      Class.forName(java.lang.String).getConstructor(StringBuffer.class);

            //确定要获得哪个构造方法,传进构造方法的参数类型的字节码

     示例:用构造方法Constructor实现new String (new StringBuffer(“abc”))

            Constructor constructor1 = String.class. getConstructor(StringBuffer.class);

            String str =Stringconstructor1.newInstance(new StringBuffer(“abc”));

           //建立一个参数为StringBuffer类型的String实例

     3newInstance方法:

           a,在Constructor中的newInstance方法:

                <T> newInstance(Object... initargs)   //带参数

               使用此 Constructor对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。

           b,在Class中的newInstance方法:

                <T> newInstance()      //不带参数

                创建此 Class对象所表示的类的一个新实例。简化Constructor创建实例的代码。

 

***查找源代码的方法:找到JDK,在srczip中在按照包名,类名***