目录
(1)资源免费
(2)跨平台 (源代码->class->虚拟机->具体平台的机器码)
(3)健壮性、安全性
(4)高性能
(5)简单
(6)面向对象
(7)动态性
(8)多线程
(1)JDK(Java开发工具包)
(2)JRE(Java运行时环境)
(3)JVM(Java虚拟机)
(4)SDK(软件开发工具包)
? ? ? ? 跨平台机制具有“一次编译随处运行”的特性,流程如下:
? ? ? ? Java字节码执行方式:解释执行方式、即时编译方式
? ? ? ? 垃圾回收:清理不再使用的对象、释放内存空间,Java程序的内存分配和回收都是由JRE在后台自动进行的。
? ? ? ? 垃圾回收特点:内存优化、动态回收、回收的不确定性、占用系统开销
? ? ? ? 通过获取一个变量的Class对象可以用于返回这个变量所属类的名称,构造方法,方法,成员变量。
? ? ? ? 获取Class对象的方式:
? ? ? ? 一般来说,会使用第一种方法,通过在尖括号中添加想知道的类,比如Float,返回系统中类的名称class java.lang.Float。
? ? ? ? 而使用第二种方法,必须要建立异常机制,因为forName中的参数,有可能并不存在。
//第一种方法
Class<Float> fClass=Float.class; //使用.class属性
System.out.println(fClass);
//第二种方法
try{
Class strClass=Class.forName("java.lang.String"); //通过Class类的forName方法(明知故问)
System.out.println(strClass);
}
catch(Exception e)
{
e.printStackTrace();
}
//第三种方法
String a="123"; //通过变量的getClass方法,获取变量的类名
System.out.println(a.getClass());
? ? ? ? Class类的几个常见方法:
(1)getSuperclass()? ? ? ? 返回父类名称
(2)getDeclaredConstructors()? ? ? ? 返回构造方法列表,返回类型为Constructor
(3)getDeclaredFields()? ? ? ? 返回成员变量列表,返回类型为Field
(4)getDeclaredMethods()? ? ? ? 返回方法列表,返回类型为Method
? ? ? ? 代码实例:?
String a="123";
System.out.println(a.getClass());
Class aclass=a.getClass();
System.out.println(aclass.getSuperclass());
System.out.println("------------------------------------------------");
System.out.println("构造方法:");
Constructor[] ctors=aclass.getDeclaredConstructors();
for(Constructor b:ctors)
System.out.println(b);
System.out.println("------------------------------------------------");
System.out.println("所有方法:");
Method[]mods=aclass.getDeclaredMethods();
for(Method b:mods)
System.out.println(b);
System.out.println("------------------------------------------------");
System.out.println("所有成员变量:");
Field[] flds=aclass.getDeclaredFields();
for(Field b:flds)
System.out.println(b);
? ? ? ? 类的加载分为三个步骤:加载、连接、初始化
? ? ? ? 加载:类加载器完成,类加载器由JVM提供
? ? ? ? 连接:类的二进制数据合并到JRE中
? ? ? ? 初始化:对类变量进行初始化,JVM初始化一个类的步骤:
(1)若类没有被加载和连接,则先加载和连接该类(按顺序执行)
(2)若类的直接父类没有初始化,则先初始化直接父类(加载也要保证继承关系)
(3)若类中有初始化语句,则系统直接执行初始化语句
? ? ? ? JVM启动后,会形成三个类加载器组成的初始类加载器层次结构:根类加载器、扩展类加载器、系统类加载器。
? ? ? ? 类加载机制主要有三种:全盘负责、父类委托、缓存机制。
? ? ? ? 反射机制主要提供了几个功能:判断任意对象所属类、运行构造任意类的对象、获取任意类的成员变量和方法,调用任意对象的方法,生成动态代理。
? ? ? ? 反射是Java被视为动态语言的一个关键性质
? ? ? ? 为此,java.lang.reflect中提供了Constructor、Field、Method类,分别用于描述类的构造方法、属性和方法。
? ? ? ? 其中Executable类派生出Constructor和Method两个子类。
? ? ? ? 记住几个关键字:
(1)getParameters或者getParameterTypes? ? ? ? 获取形参(第一个用在Executable类中)
(2)getName? ? ? ? 获取(构造)方法名或属性名
(3)getModifiers? ? ? ? 返回修饰符标识(如public)
(4)getReturnType? ? ? ? 返回当前方法返回类型
? ? ? ? 枚举类定义方法:
public enum SeasonEnum
{
SPRING,SUMMER,AUTUMN,WINTER
}
? ? ? ? 枚举类与普通类的区别:
(1)枚举类可以实现一个或多个接口
(2)使用enum定义的非抽象的枚举类默认会使用final修饰
(3)枚举类的构造方法只能使用private访问修饰
(4)枚举类所有实例必须在枚举类的类体第一行显式列出
?
? ? ? ? 枚举类型的常用方法:
? ? ? ? 返回枚举实例:
? ? ? ? 获取枚举有关信息:
? ? ? ? 注意,在使用equals对两个枚举值进行比较时,也可以使用"=="。?
? ? ? ? compareTo函数,例如s1.compareTo(s2),当s1的序号小于s2时,返回-1,大于s2时,返回1,取等时,返回0。
? ? ? ? 代码实例:
public class enumdemo {
public static void main(String[] args)
{
System.out.println(Season.spring);
System.out.println(Season.spring.ordinal()); //返回索引
System.out.println(Season.spring.toString()); //一般用于重写,默认返回实例
System.out.println(Season.valueOf("spring")); //返回实例
for(Season a:Season.values()) //遍历实例
System.out.println(a);
}
enum Season
{
spring,summer,autumn,winter;
}
}
? ? ? ? 改写Enum类,在原枚举后添加括号项,并改写toString方法,此时,输出实例都只会返回括号内的春、夏、秋、冬。
public class enumdemo {
public static void main(String[] args)
{
System.out.println(Season.spring); //调用toString方法
System.out.println(Season.spring.ordinal());
System.out.println(Season.spring.toString()); //返回this.name
System.out.println(Season.valueOf("spring")); //返回this.name
for(Season a:Season.values())
System.out.println(a); //返回this.name
}
enum Season
{
spring("春"),summer("夏"),autumn("秋"),winter("冬");
private String name;
Season(String name)
{
this.name=name;
}
public String toString()
{
return this.name;
}
}
}
? ? ? ? java.lang包中包含5个基本注解:
(1)@Override:限定重写父类的方法
(2)@Deprecated:标示某个元素已过时
(3)@SuppressWarnings:抑制编译警告的发布
(4)@SafeVarargs:抑制“堆污染”警告
(5)@FunctionInterface:指定否个接口必须是函数式接口
? ? ?? ?在Java中实现国际化使用的是Locale类。
? ? ? ? 在Java8中开始允许接口中定义默认方法、静态方法。
? ? ? ? 默认方法必须使用default来修饰,静态方法使用static来修饰,区别于接口中的普通方法只能用public abstract修饰,作为抽象方法,这两者必须有方法体的实现。
? ? ? ? 默认方法,不能通过接口来访问,只能通过接口的实现类的实例来访问。
? ? ? ? 静态方法,可以通过接口名进行访问,也可以通过接口的实现类的实例进行访问。
? ? ? ? Lambda表达式是Java8的新特性之一,实现方式:
????????(参数名)->{ 方法体 }
例如:
? ? ? ?(x)-> {++x}
? ? ? ? (int x,int y)-> {?System.out.println(x+y); return x+y; }
? ? ? ? 利用Lambda方法实现遍历:
ArrayList<Integer> list=new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.forEach((a)->System.out.println(a));
//也可以用两个冒号替代箭头
list.forEach(System.out::println);
?
??参考书籍:《Java 8 基础应用与开发》QST青软实训编?