J2SE基础知识

1.数据类型
1).基本类型:存储在栈中
    a).字符类型char 
// 包装类:java.lang.Character
    b).布尔类型boolean
    c).数值类型
    
byte   // 包装类:java.lang.Byte    位数: 2^3
    short  // 包装类:java.lang.Short   位数: 2^4        
    int    // 包装类:java.lang.Integer 位数: 2^5   
    long   // 包装类:java.lang.Long    位数: 2^6   
    float  // 包装类:java.lang.Float   位数: 2^5   
    double // 包装类:java.lang.Double  位数: 2^6   
2).引用类型:存储在堆中
  a).类
  b).接口
  
2.数据类型的相互转换
static byte parseByte(String s) 
static Short parseShort(String s)
static int parseInt(String s)
static long parseLong(String s)
static float parseFloat(String s)
static double parseDouble(String s)
 
static String toString(byte b) 
static String toString (char c)
static String toString(Short s)
static String toString(int i)
static String toString(Long i)
static String toString(float f)
static String toString(Double)
  
3.循环遍历
1).for(int i=0;i<myArray.Length;i++){}
2).foreach(Iterator itr = myCollection.iterator();itr.hasNext();){}
3).for(int i : myArray){}

4.可变参数
public void PrintNumbers(int...numbers){for(int i : numbers) System.out.print(i);}

5.枚举
1).简单枚举: 
    
public enum ColorSet
    {
        red,white,yellow,black,green,blue;
    }
2).类枚举: 枚举可以像类一样添加方法和属性,你可以为它添加静态和非静态的属性或方法
  
public enum Season {
      winter, spring, summer, fall; 
//枚举列表必须写在最前面,否则编译出错
      private final static String location = "Phoenix"
      
public static Season getBest() {
          
if (location.equals("Phoenix"))
              
return winter;
          
else
              
return summer;
      }
  }
3).带构造方法枚举:通过括号赋值,而且必须有带参构造器和一属性跟方法,赋值必须是都赋值或都不赋值,如果不赋值则不能写构造器
    
public enum Temperature {
      absoluteZero(
-459), freezing(32),boiling(212), paperBurns(451);        
      
private final int value;
      
public int getValue() { return value;}
      
//构造器只能在内部使用,默认为private
      Temperature(int value) { 
          
this.value = value;
      }
  }
  
6.反射:使代码能够接入装载到JVM中的类的内部信息,允许编写与执行时,而不是源代码中选定的类协作的代码.

import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 

public class Admin { 
    
public Admin(){ } 
    
    
private String id = ""
        
public String getId() { 
        System.out.print(id); 
        
return id; 
    } 
    
public void setId(String id) { 
        
this.id = id; 
    } 

    
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException,SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException { 
        String str
="com.spring.event.Admin"
        Class c
=Class.forName(str); 
        Object obj
=c.newInstance(); 
        
        
//这里是里设置属性的值 
        Method m = c.getMethod("setId",new Class[]{Class.forName("java.lang.String")}); 
        m.invoke(obj,
new Object[]{"penghao122"}); 
        
//这里是里获取属性的值 
        m = c.getMethod("getId",new Class[]{}); 
        m.invoke(obj,
new Object []{}); 
    } 


7.内省: 对Bean类属性,事件的处理方法(给定一个javabean对象,可以得到/调用它所有的get/set方法)(通过反射的方式访问javabean)

public class PersonBean {
   
public String name;
   
public String[] childname;
   
public String[] getChildname() {
      
return childname;
   }
   
public void setChildname(String[] childname) {
      
this.childname = childname;
   }
   
public String getName() {
      
return name;
   }
   
public void setName(String name) {
      
this.name = name;
   }
}
 

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;

public class TestIntrospector {
   
public static void main(String[] args) throws IllegalArgumentException,IllegalAccessException, SecurityException, NoSuchMethodException,InvocationTargetException, IntrospectionException {
          
//演示一下get方法的调用
      PersonBean pb=new PersonBean();
      pb.setName(
"kangjian");
      String[] childs
=new String[]{"kk","jj","nn"};
      pb.setChildname(childs);
      
      
//将该javabean中的属性放入到BeanInfo中.第二个参数为截止参数,表示截止到此类之前,不包括此类。如果不设置的话,那么将会得到本类以及其所有父类的info。
      BeanInfo bi=Introspector.getBeanInfo(pb.getClass(), Object.class);
      
//将每个属性的信息封装到一个PropertyDescriptor形成一个数组其中包括属性名字,读写方法,属性的类型等等
      PropertyDescriptor[] pd=bi.getPropertyDescriptors();
      
//演示如何get
      for (int i = 0; i < pd.length; i++) {
         
if(pd[i].getPropertyType().isArray())  //getPropertyType得到属性类型。
         {
            
//getReadMethod()得到此属性的get方法-Method对象,然后用invoke调用这个方法
            String[] result=(String[]) pd[i].getReadMethod().invoke(pb, null);
            System.out.println(pd[i].getName()
+":");//getName得到属性名字
            for (int j = 0; j < result.length; j++) {
               System.out.println(result[j]);
            }
         }
         
else
         {
            System.out.println(pd[i].getName()
+":"+pd[i].getReadMethod().invoke(pb, null));
         }
      }
      
          
//演示一下set方法的调用
      PersonBean pb0=new PersonBean();
      
//模拟一个数据(数据名字和javabean的属性名一致)
      String name="luonan";
      String[] childname
=new String[]{"luo","nan"};
 
      BeanInfo bi0
=Introspector.getBeanInfo(pb0.getClass(), Object.class);
      PropertyDescriptor[] pd0
=bi0.getPropertyDescriptors();
 
      
for (int i = 0; i < pd0.length; i++) {
         
if(pd0[i].getPropertyType().isArray())
         {
            
if(pd0[i].getName().equals("childname"));
            {
               
if(pd0[i].getPropertyType().getComponentType().equals(String.class))
               {
                       
//getComponentType()可以得到数组类型的元素类型
                  
//getWriteMethod()得到此属性的set方法---Method对象,然后用invoke调用这个方法
                  pd0[i].getWriteMethod().invoke(pb0,new Object[]{childname});
               }
            }
         }
         
else
         {
            
if(pd0[i].getName().equals("name"));
            {
               pd0[i].getWriteMethod().invoke(pb0,name);
            }
         }
      }
 
      System.out.println(pb0.getName());
      String[] array
=pb0.getChildname();
      
for (int i = 0; i < array.length; i++) {
         System.out.println(array[i]);
      }
   }
}

8.注解: 它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注解是以‘@注解名’在代码中存在的.它们都不会直接影响到程序的语义,只是作为注解(标识)存在,我们可以通过反射机制编程实现对这些元数据的访问。另外,你可以在编译时选择代码里的注解是否只存在于源代码级,或者它也能在class文件中出现
根据参数个数分为:
1)标记注解
2)单值注解
3)完整注解

9.泛型:泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简单。
class Collections {
    
public static <T, S extends T>  void copy(List<T> dest, List<S> src){    }
}

10.类加载器:java是具有动态性,什么是动态性?有个最直观的例子:windows系统的即插即用,支持即插即用的设备可以在系统不重新启动的情况下既可以热把插使用。而java的动态性表现在:我们的程序可以不用全盘的重新编译就能对程序某部分进行更新,C#也和java一样具有动态性,而且它的这种动态性表现更为直观:直接生成windows的动态连接库文件——dll文件。而java生成的是class文件,class是怎么实现动态性的了,这个时候就全靠我们今天的主角:java的类加载器。
       我们都知道所有的java类都是继承了object这个类,在object这个类中有一个方法:getclass(),这个方法返回的是一个Class类对象,具体见:认识java的Class类
       一旦一个类被载入JVM中,同一个类就不会被再次载入了(切记,同一个类)。这里存在一个问题就是什么是“同一个类”?正如一个对象有一个具体的状态,即标识,一个对象始终和其代码(类)相关联(见文认识java的Class类)。同理,载入JVM的类也应该有一个具体的标识,我们知道:在JAVA中,一个类用其完全匹配类名(fully qualified 
class name)作为标识,这里指的完全匹配类名是包名和类名。不过在JVM中一个类是用其全名再附加上一个加载类ClassLoader的实例作为唯一标识。因此,如果一个名为Pg的包中,有一个名为Cl的类,被类加载器KlassLoader的一个实例对象kl1加载,生成Cl的对象,即C1.class(这里指类,而非对象)在JVM中表示为(Cl, Pg, kl1)。这意味着两个类加载器的实例(Cl, Pg, kl1) 和 (Cl, Pg, kl2)是不同的,被它们所加载的类也因此完全不同,互不兼容的。
       在java中每个类都是由某个类加载器的实体来载入的,因此在Class类的实体中,都会有字段记录载入它的类加载器的实体(当为null时,其实是指Bootstrap ClassLoader)。 在java类加载器中除了引导类加载器(既Bootstrap ClassLoader),所有的类加载器都有一个父类加载器(因为他们本身自己就是java类)。而类的加载机制是遵循一种委托模式:当类加载器有加载类的需求时,会先请求其Parent加载(依次递归),如果在其父加载器树中都没有成功加载该类,则由当前类加载器加载。
        java的类加载器分为以下几种:
        
1.Bootstrap ClassLoader,用C++实现,一切的开始,是所有类加载器的最终父加载器。负责将一些关键的Java类,如java.lang.Object和其他一些运行时代码先加载进内存中。
        
2.ExtClassLoader,用java实现,是Launcher.java的内部类,编译后的名字为:Launcher$ExtClassLoader.class 。此类由Bootstrap ClassLoader加载,但由于Bootstrap ClassLoader已经脱离了java体系(c++),所以Launcher$ExtClassLoader.class的Parent(父加载器)被设置为null;它用于装载Java运行环境扩展包(jre/lib/ext)中的类,而且一旦建立其加载的路径将不再改变。
        
3.AppClassLoader,用java实现,也是是Launcher.java的内部类,编译后的名字为:Launcher$AppClassLoader.class 。AppClassLoader是当Bootstrap ClassLoader加载完ExtClassLoader后,再被Bootstrap ClassLoader加载。所以ExtClassLoader和AppClassLoader都是被Bootstrap ClassLoader加载,但AppClassLoader的Parent被设置为ExtClassLoader。可见Parent和由哪个类加载器来加载不一定是对应的。类装载器是我们经常使用的,可以调用ClassLoader.getSystemClassLoader() 来获得,如果程序中没有使用类装载器相关操作设定或者自定义新的类装载器,那么我们编写的所有java类都会由它来装载。而它的查找区域就是我们常常说到的Classpath,一旦建立其加载路径也不再改变。
        
4.ClassLoader:一般我们自定义的ClassLoader从ClassLoader类继承而来。比如:URLClassloader是ClassLoader的一个子类,而URLClassloader也是ExtClassLoader和AppClassLoader的父类(注意不是父加载器)。


11.装箱与拆箱:
Object value 
= 10;
int intValue = (Integer)value;
Integer newIntValue 
= new Integer(10);


专注于机器学习、前端相关邻域。关注 全栈深入 公众号查看更多硬核文章。
原文地址:https://www.cnblogs.com/janas/p/2132624.html