for each循环(加强for)html
for(int element:a) System.out.println(element); public class Main { public static void main(String[] args) { System.out.println("Hello World"); } }
一个对象变量并无实际包含一个对象,而仅仅引用一个对象,如:java
Date deadline = new Date();
有两个部分。New Date()构造了一个Date类型的对象,它的值是新建立的对象的引用。这个引用储存在deadline中。segmentfault
静态方法只能访问静态域。数组
抽象类除了抽象方法,还能够包含具体数据和具体方法。例如Person类能够保存姓名和一个返回姓名的具体方法ide
public abstract class Person { private String name; public Person(String name) { this.name = name; } public abstract String getDescription(); public String getNmame(); { return name; } }
尽可能将通用的域和方法(不论是否是抽象的)放在超类(不论是否是抽象类)中。工具
类即便不含抽象方法,也能够将类声明为抽象类。
抽象类不能被实例化,若是将一个类声明为abstract,就不能建立这个类的对象
注意:能够定义一个抽象类的对象变量,可是它只能引用非抽象子类的对象。例如优化
Person p = new Student("Vince Vu", "Economics"); //p是一个抽象类Person的变量,Person引用了一个非抽象子类Student的实例
能够理解为多态/向上转型this
数组可使用静态的Arrays.equals检测相应的数组元素是否相等。重写equals来比较两个对象的建议:P169。IDEA直接能够自动生成重写的equals和toString方法。。。
重写equals,记得参数列表为(Object other)。(重写:在继承中,方法的名称同样,参数列表也同样;重载:方法名称同样,参数列表不同)
getClass()是使用反射技术来判断对象所属的类。.net
自动装箱和拆箱:
有一个颇有用的特性,便于添加int的元素到ArrayList<Integer>:设计
list.add(3);
将自动变换成
list.add(Integer.valueOf(3));
这种变化称为自动装箱(autoboxing)(基本类型的数据->包装类)
相反地,当一个Integer对象赋给一个int值时,将会自动的拆箱(包装类->基本类型的数据),包装类没法直接参与运算
int n = list.get(i);
自动变成
int n = list.get(i).intValue();
在算数表达式中也可以自动的装箱和拆箱
Integer n = 3; n++;
编译器将自动地插入一条对象拆箱的指令,而后进行自增计算,最后再将结果装箱。
比较两个包装器对象时要调用equals,若是用==可能会出错。
包装器中包含了一些基本方法,如一个整数字符串转换成数值
int x = Integer.parseInt(s);
这里与Integer对象没有任何关系,parseInt是一个静态方法,Interger类只是放置这个方法的地方。
Integer.toString()能够把一个整数转换成字符串
Integer对象是不可变的:包含在包装器中的内容不会改变。因此
public static void triple(Integer x) // won't work { ... }
不会改变参数值。
org.omg.CORBA包中定义持有者(holder)类型,能够访问储存在其中的值,进而改变参数值。
参数数量可变的方法
// 一个方法只能有一个可变参数; // 若是方法的参数有多个,那么可变参数要写在参数的末尾 public static int max(int... values){ int lagest=0; for (int i = 0; i < values.length ; i++) { if(values[i]>lagest) lagest=values[i]; } return lagest; } //可变参数的特殊(终极)写法 public static void method(Object...obj){ }
枚举类型其实是一个类,例如
public enum Size {SMALL, MEDIUM, LARGE, EXTRA_LARGE };
这个声明定义的类型是一个类,它恰好有4个实例。
比较两个枚举类型的值,永远不要用equals,用==。
枚举类型中能够添加一些构造器、方法和域。
解决默认方法冲突:
如何使用成员内部类:
间接方式:
在外部类的方法中,使用内部类,在外部类方法中建立内部类对象,经过内部类对象调用内部类方法,main只是调用外部类的方法。经过外部类的对象,调用外部类的方法,里面间接再使用内部类
public class Outer { public class Inner{ public void show(){ System.out.println("内部类的方法"); } } public void method(){ System.out.println("外部类的方法"); Inner inner = new Inner(); //建立内部类对象 inner.show(); //经过内部类对象调用内部类方法 } }
//经过调用外部类对象,调用外部类的方法 public class Main { public static void main(String[] args) { Outer outer = new Outer(); outer.method(); } }
直接方式:
//类名称 对象名 = new 类名称(); //【外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();】 public class Main { public static void main(String[] args) { Outer.Inner inner = new Outer().new Inner(); inner.show(); } }
内部类既能够访问自身的数据域,也能够访问建立它的外围类对象的数据域。(内用外,随意访问;外用内,须要先创建内部类对象,经过内部类对象访问)
没重名可直接调用外部类数据域,若是重名,经过【外部类名称.this.外部类成员变量名】来调用。
public class Outer { private int num = 100; public class Inner{ final int num = 200; public void show(){ int num = 300; System.out.println(num);//300 System.out.println(this.num);//200 System.out.println(Outer.this.num);//100 } } }
局部内部类定义:若是一个类是定义在一个方法内部的,那么这就是一个局部内部类。“局部”:只有当前所属的方法才能使用它,除了这个方法外面就不能用了。
访问局部内部类,是经过调用外部类包含该内部类的方法
public class Outer { public void methodOuter(){ class Inner { int num = 10; public void methodInner() { System.out.println(num); } } Inner inner = new Inner(); inner.methodInner(); } public static void main(String[] args) { Outer obj = new Outer(); obj.methodOuter(); } }
类的权限修饰符:
public > protected > (default) >private
定义一个类的时候,权限修饰符:
局部内部类想访问所在方法的局部变量,这个局部变量必须是【有效final的】,即final或者没有更改过的
class Outer { public void methodOuter(){ final int num = 5; // num = 9; 错误 class Inner { public void methodInner() { System.out.println(num); } } } }
匿名内部类:若是接口的实现类,(或者是父类的子类)只须要使用惟一的一次,那么这种状况下就能够省略该类的定义,二改成使用【匿名内部类】。
/* 匿名内部类格式 接口名称 对象名 = new 接口名称(){ //覆盖重写全部抽象方法 }; //注意要有分号 */ public static void main(String[] args){ //匿名内部类 MyInterface obj = new MyInterface(){ //new表明建立对象的动做 //接口名称是匿名内部类须要实现的接口 @Override //大括号中的内容才是匿名内部类的内容 public void method(){ } }; obj.method(); } /* 注意: 1.匿名内部类,在【建立对象】的时候,只能使用惟一一次。若是但愿屡次建立对象,并且类的内容同样的话,那么就必须使用单独定义的实现类了。 2.匿名对象,在【调用方法】的时候,只能调用惟一一次。若是但愿同一个对象,调用屡次方法,那么必须给对象起一个名字。 3.匿名内部类是省略了【实现类/子类名称】,可是匿名对象是省略了【对象名称】。匿名内部类和匿名对象不是一码事!!
匿名内部类做用:不用专门写一个类来实现接口,直接使用匿名内部类调用接口。
若是想重复使用,就不要用任何匿名的东西。不论是匿名内部类仍是匿名对象。
//若是有两个对象,要写两遍 //使用匿名内部类 MyInterface objA = new MyInterface(){ @Override public void method(){ System.out.println("匿名内部类实现了方法!"); } }; objA.method(); MyInterface objB = new MyInterface(){ @Override public void method(){ System.out.println("匿名内部类实现了方法!"); } }; objB.method();
匿名对象:
//使用了匿名内部类,并且省略了对象名称,也是匿名对象 new MyInterface(){ @Override public void method1(){ System.out.println("匿名对象匿名内部类实现了方法1"); } @Override public void method2(){ System.out.println("匿名对象匿名内部类实现了方法2"); } }.method1(); //匿名对象只能调用一次方法 //若是还想调用method2还要建立一个新的匿名对象 new MyInterface(){ @Override public void method1(){ System.out.println("匿名对象匿名内部类实现了方法1"); } @Override public void method2(){ System.out.println("匿名对象匿名内部类实现了方法2"); } }.method2(); //若是想重复使用,就不要用任何匿名的东西