黑马程序员_基础加强小结

时间:2021-10-03 12:15:07

------- android培训java培训 、期待与您交流! ----------

这篇博客可能写的知识点有点乱、有点不成系统,但这些都是我们平时学习可能忽略掉的,但对我们的理解还非常重要的知识点。学习往往也就是这样积少成多,汇小溪以成江河。现在的我就是漫游在知识海洋的小船,一边重拾和回顾知识,一边驶向彼岸,接下来就跟我一块来看看吧。

Eclipse使用技巧:

IDEitegrity development environment集成开发环境

一个workspace可以包含多个project,一个workspace保留了eclipse的一套环境选项的配置,例如,所使用的javacjava命令,等等,细节可以查看windowàpreferences。如果要为eclipse再配置一套环境选项,可以再创建一个workspacePackageexplorer视图窗口中的fileters菜单项,可以显示空的父包(此功能默认是关闭的)

Alt+/补全命令(windowàpreference—>Generalàkeysàcontents Assist)

File-switchworkspace切换和新建工作站。

调试:双击设置断点,右击debug切换到debug透视图,选中变量右击watch可以看到变量当时的值。

Windowàshow view显示某个小窗口。

高版本的java能运行低版本的javac编译的程序

低版本的java不能运行高版本的javac编译的程序。

Surround with可选各种代码块。

静态导入;

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

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

可变参数:

只能出现在参数列表的最后;

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

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

例:

Public static int add(int x,int …args){

Int sum = 0;

For(int i-0;i<args.length;i++){

    Sum+=args[i];

}

Return sum;

}

增强for循环

For(type变量名:集合变量名){……}(有的地方也叫foreach循环)

基本数据类型的自动拆箱与装箱

Integer iObj = 3;

System.out.println(iObj+12);

 

Integer i1 =13;

Integer i2=13;

System.out.println(i1=i2);     //打印结果为true

 

Integer i1=137;

Integer i2=137;

System.out.println(i1=i2);     //打印结果为false

-128127之间都是返回true

Integer i3 = Integer.valueof(3)

Integer i4 = Integer.valueof(3)

System.out.println(i3=i4);     //打印结果为true

享元模式(flyweigh):有很多很小的东西它们有很多共同的东西,所以把它们整成一个,它们不同的参数做成函数的参数。

抽象类只能通过子类实例化对象。

例:

Public abstract class WeekDay{

      Private WeekDay(){}

      Public final static WeekDay SUN = new WeekDay(){     //用匿名类实例化子类

            Public WeekDay nextDay(){

                  Return MON;

}

}

Public final static WeekDay MON = new WeekDay(){

      Public WeekDay nextDay(){

             Return SUN;

}

}

Public abstract WeekDay nextDay();

}

这样一来就将大量的if else语句转移成了一个个独立的类。

枚举的ordinal()方法返回对象在枚举中的编号(0开始)

Values()函数返回枚举的每一个元素,返回一个数组。

枚举的列表必须放在所有的方法和所有的成员变量之前。

枚举元素列表最后一定要有分号。

枚举的构造方法必须是私有的。

枚举里抽象类的应用:

例:

Public enum TrafficLamp{

      RED{

       Public TrafficLamp nextLamp(){

             Return GREEN;

}

},

GREEN{

          Public TrafficLamp nextLamp(){

             Return YELLOW;

}

 

},

YELLOW{

Public TrafficLamp nextLamp(){

             Return RED;

}

 

};

      Public abstract TrafficLamp nextLamp();

}

虽然枚举里包含抽象方法但public enum TrafficLamp{}并不用abstract修饰

New Date(300){}   //创建Date类的子类对象,并调用父类的有参构造方法。

枚举只有一个成员时,就可以作为一种单例的实现方式。

反射的基石--àClass(Java的新特性是JDK1.2之后增加的)

Java程序中的各个Java类属于同一类事物,描述这类事物的java类名就是Class

例:Date.class       //表示Date类的字节码

P1.getClass()  //表示得到对象p1对应类的字节码

Class.forName(“java.lang.String”);      //也是表示该类对应的字节码文件

得到类的字节码有三种方式:

1.       类名.class例如:System.class

2.       对象.getClass()例如:new Date().getClass()

3.       Class.forName(“类名”)例如:Class.forName(“java.lang.String”)

有九个预定义对象:八个基本数据类型和一个void对象。

Class.isPrimitive()看是不是原始文件。

System.out.println(int..class ==  Integer.class);  //返回结果是false

System.out.println(int..class ==  Integer.Type);  //返回结果是 true,Integer.Type代表Integer包装的基本类型是什么。

数组类型的Class实例对象用Class.isArray()

总之,只要是在源程序中出现的类型,都有各自的Class实例对象,例如,int[],void

反射的概念:反射就是把java类中的各种成分映射成相应的java类。

例:String.class.getConstructor(StringBuffer.class)    //表示获取String类的带有一个StringBuffer参数的构造函数。

JDK1.5之后增加了可变参数的新特性。

Constructor constructor = String.class.getConstructor(StringBuffer.class)

String str = (String)Constructor.newInstance(new StringBuffer(“abc”))   //用此构造方法创建一个新对象(返回方法对象是Object

Class.newInstance()方法调用不带参数的构造方法创建对象。

反射回降低程序的性能。

Field类代表某个类中的一个成员变量

例:

Public class ReflectPoint{

      private   Int x;

      public    Int y;

Public ReflectPoint(int x,int y){

            This.x = x;

            This.y = y;

}

Public static void main(String args[]){

            ReflectPoint pt1 = new ReflectPoint(3,5);

            Field fieldy = pt1.getClass().getField(“y”);  //得到y成员变量

            //此时的fieldy不等于5,它只是代表类的y这个成员变量,并不表示某个对象的y的具体值。

            Fieldy.get(pt1);      //得到对象pt1y值。

            //getField()不能得到类的私有的成员变量,getDeclaredField()可得到所有的声明的成员变量。

            Field fieldx = pt1.getClass().getDeclaredField(“x”);   

            Fieldx.setAccessible(true);     //虽然上边用getDeclaredField()得到了私有方法x,但无法使用,所以此时就需要使用setAccessible()把它设为可访问的。

            System.out.println(fieldx.get(pt1));

}

}

例题:将任意一个对象中的所有String类型的成员变量所对应的字符串内容中的”b”改成”a”

Public class ReflectPoint{

     String str1 = “ball”;

     String str2 = “basketball”;

     String str3 = “itcast”;

Public String toString(){

     Return str1+”--”+str2+”--”+str3;

}

Public static void main(String args[]){

    ReflectPoint pt1 = new ReflectPoint(3,5);

changeStringValue(pt1);

System.out.println(pt1);

}

Public static void changeStringValue(){    

     Field[] fields = obj.getClass.getFields();

     For(Field field:fields){

            If(field.getType() == String.class) //这里用==比较好,因为一个类的字节码都是一个

            String oldValue= (String)field.get(obj);

            String newValue = oldValue.replace(‘b’,’a’);

            Field.set(obj,newValue);       //把值设置回去

}

 

}

}

Method类代表某个类中的一个成员方法

例:

String str1 = “abc”;

//现在我们的目的是实现str1.charAt(1)

Method methodCharAt = String.class.getMethod(“charAt”,int.class);

methodCharAt.invoke(str1,1);

methodCharAt.invoke(null,1);    //则方法为静态的方法。

用反射方式执行某个类中的main方法

例:写一个程序,这个程序能够根据用户提供的类名,去执行该类中的main方法。

String startingClassName = args[0];

Method mainMethod = class.forName(startingclassName).getMethod(“main”,String[].class);

mainMethod.invoke(null,new Object[]{new String[]{“111”,”222”,”333”}});

数组的反射:

具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象。

代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class.

Int[] a1 = new int[3]

Int[] a2 = new int[4]

Int[][] a3 = new int[2][3]

String[] a4 = new String[3]

 

Object aObject1 = a1;               //

Object aObject2 = a4;               //

Object[] aObject3 = a1;              //

Object[] aObject4 = a3;              //

Object[] aObject5 = a4;              //

基本数据类型不是Object.

Int[] a1 = new int[]{2,3,4}

String[] a4 = new String[]{“a”,”b”,”c”}

System.out.println(Arrays.asList(a1));              //不能把数组里的内容打印出来

System.out.println(Arrays.asList(a4));              //能把数组里的内容打印出来

因为在JDK1.4Public static List asList(object[] a)接收的是数组int类型的数组不能转换成Object[]String类型的数组则可以。

Object[] a = new Object[]{“a”,1}

a[0].getClass()      //只能得到某个具体元素的类而不是数组的类。

Java中的内存泄露:内存中的某个对象没用了,但没有清除一直保留在内存中。其中一种原因是:某个对象存在了用哈希算法设计的集合里,但又修改了这个对象的某个属性,同时这个属性是哈希算法中用到的,导致对象找不着而删不掉。

反射的作用-à实现框架

建立一个config.properties文件里边写

className = java.util.ArrayList

InputStream ips = new FileInputStream(“config.properties”);

Properties props = new Properties();

Props.load(ips);

Ips.close();

String className = props.getProperty(“className”);

Collection collections = (Collection)Class.forName(className).newInstance();

内省(IntroSpector):用来服务JavaBean特殊的Java类,符合某些特殊命名规范的类,含有getset方法,JavaBean的属性是根据getset方法推断出来的,把getset去掉剩下的就是JavaBean类的属性。

getAge—Ageà如果第二个字母是小写,则把第一个字母变成小写-àage

gettimeàtime

getTime-àtime

getCPU-àCPU