----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
第一点:包名的命名习惯,前面是公司的域名,后面是功能。Eg:cn.itcast.day1。
第二点:高版本的Java能运行低版本的Javac,低版本的Java不能运行高版本的javac。
第三点:在eclipse中配置java模版代码。配置地址是 windows - Preferences - Java - Editor- Template。
第四点:导入Jar包。Jar包里面有好多Class文件。Jar库里面可以包含多个Jar包。
第五点:import 语句可以导入一个类或某个包中的所有类。
Import static 语句可以导入一个类中的某个静态方法或者全部静态方法。这种方法叫做静态导入。
第六点:可变参数:注意点a、只能出现在参数列表的最后;b、...位于变量类型和变量名之间,前后有无空格都可以;c、调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。下面是演示:
import static java.lang.Math.*;
public class VariableParemetersDemo {
public static void main(String[] args) {
System.out.println(compare(1, 2, 3, 4, 5));
System.out.println(compare(1, 2, 3, 4, 5, 8));
}
public static int compare(int... list) {
int max = list[0];
for (int i = 0; i < list.length; i++)
max = max(max, list[i]);
return max;
}
}
第七点:自动打包和解包。 Int 类型的变量可以自动打包变成 Integer 类型。 Integer 类型的可以自动解包成为 int 类型的。需要注意的是 : Integer i1 = 13 ; Integer i2 = 13 ; i1 == i2 ----->true 。 Integer i1 = 1311 ; Integer i2 = 1311 ; i1 == i2 ----->false 。在一个字节( -128---127 )内的就会封装成一个引用。这是享元设计模式。
第八点:享元模式:它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件。它适合用于大量物件只是重复而导致无法令人接受的使用大量内存。
第九点:枚举enum。枚举是指变量的值一一列出来,变量的值只限于列举出来的值的范围内。下面是一种比较复杂的枚举运用:
public class EnumDemo {
public static void main(String[] args) {
System.out.println(TrafficLight.GREEN);
System.out.println(TrafficLight.GREEN.getTime());
System.out.println(TrafficLight.RED.name());
System.out.println(TrafficLight.RED.ordinal());
System.out.println(TrafficLight.valueOf("GREEN"));
}
}
enum TrafficLight{
GREEN(20) {
@Override
public TrafficLight nextLight() {
// TODO Auto-generated method stub
return YELLOW;
}
},YELLOW(3) {
@Override
public TrafficLight nextLight() {
// TODO Auto-generated method stub
return RED;
}
},RED(5) {
@Override
public TrafficLight nextLight() {
// TODO Auto-generated method stub
return GREEN;
}
};
private int time;
private TrafficLight(int time){
this.time = time;
}
public int getTime() {
return time;
}
abstract public TrafficLight nextLight();
}
需要注意的是,枚举在前面列举出来全部的对象,这些对象是枚举类型的对象。可以有抽象方法。同样也可以有构造方法。如果枚举只有一个成员的时候,就可以作为单例设计方式。
第十点:反射。反射就是把Java类中的各种成分映射到相应的类。反射要用到一个类,就是Class类。Class类描述的是,Java程序中的各个Java类,他们是否属于同一类事物,是不是用一个类来描述,这个类就是Class。Class的对象是字节码。如Person.class 或者 person.getClass()。Class类中常用的方法有isPrimitive()是否是原始类型。原始类型指的是int, double, boolean 等。Integer.TYPE就是代表原始类型的字节码。即int.class == Integer.TYPE。数组类型的Class实例对象可以用isArray()来判断。总之在源程序中出现的类型,都有对应的Class实例对象。
反射中常用到的类有Constructor,代表某个类中的一个构造方法;Field 类代表类中的一个成员变量。 Method 类代表某个类中的方法。下面是获取各个类对象的演示。
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ClassDemo {
public static void main(String[] args) throws Exception{
Class clazz = Class.forName("it.cast.day3.DemoClassByPerson");
System.out.println("------- constructors start -----------");
Constructor[] constructors = clazz.getConstructors();
for (Constructor constructor : constructors) {
StringBuilder sb = new StringBuilder();
sb.append(constructor.getName());
sb.append('(');
Class[] classes = constructor.getParameterTypes();
for (Class class1 : classes) {
if (classes.length != 0) {
sb.append(class1.getName());
sb.append(",");
}
}
if(classes.length != 0)
sb.deleteCharAt(sb.length() - 1);
sb.append(')');
System.out.println(sb);
}
System.out.println("------- Field start -----------");
Field field = clazz.getDeclaredField("age");
System.out.println(field.getName());
System.out.println("------- Method start -----------");
DemoClassByPerson person = (DemoClassByPerson)clazz.newInstance();
Method method1 = clazz.getDeclaredMethod("setAge", int.class);
method1.invoke(person, 20);
Method method2 = clazz.getDeclaredMethod("setName", String.class);
method2.invoke(person, "lailongwei");
System.out.println(person);
}
}
class DemoClassByPerson {
int age;
String name;
public DemoClassByPerson() {
age = 0;
name = "";
}
public DemoClassByPerson(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "Person [" + name + " : " + age + "]";
}
}
第十一点:内存泄漏,内存泄漏:动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。即所谓内存泄漏。
JAVA中的内存泄漏:当一个对象被存储进Hash表中后,修改那些参与计算哈希值的字段,就会照成内存泄漏。下面是内存泄漏的演示:
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.HashSet;
public class RamOutCon {
public static void main(String[] args) throws Exception{
Collection<Person> coll = new HashSet<>();
Person person1 = new Person(22, "lailongwei");
Person person2 = new Person(22, "lailong");
coll.add(person1);
coll.add(person2);
Method method = person1.getClass().getMethod("setAge", int.class);
method.invoke(person1, 21);
method.invoke(person2, 21);
System.out.println(coll.contains(person1));
coll.remove(person1);
System.out.println(coll.size());
}
}
class Person {
int age;
String name;
public Person(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
----------------------- android培训、java培训、java学习型技术博客、期待与您交流! ----------------------