Java琐碎小知识(二)

1、继承:在Java中一个类只能直接继承一个父类,这与c++不同,但可以继承多个接口,从而实现多重继承;在子类继承方法覆盖中,不能降低方法的可见性,可以提高可见性,比如有protected到public;
2、子类的实例化过程:子类在实例化时调用子类构造器时,子类构造器首先调用直父类无参构造器,以此类推,直到object,因此,子类创建后,其所有父类也都实例化了。调用父类构造器其实是编译器修改成如下:public sub(String s){
super();//必须第一行 也可以调用父类有参构造器 super(s);
system.out.println(s);
}
super关键字表示当前超类的一个实例,可以用super.method等调用超类的隐藏成员和方法,此时不必第一行。
3、错误处理:分为两种情况:如果遇到错误,Java会停止运行直接匹配到catch语句块,从而可以执行异常处理;还有一种情况是,重新将异常或者新的exception对象抛回给调用此方法代码,由用户决定怎么处理这个错误。在jdk1.7中出现了可以同时捕捉多个异常的功能如:

try{
serverSocket.accept();
}catch(SocketTimeoutException|SecurityException e){
//handle exception
}catch(IOException e){
}

表示对于不同的异常采取相同的处理,在catch中异常排列要从精确到不精确,否则后面的异常永远捕捉不到。
4、try-with-resource:在jdk1.7之前一直用finally来确保一定会调用close方法来关闭资源,在1.7中新增加了特性:try-with-resource语句,可以将资源自动关闭:

Connection connection=null;
try(Connection connection=openConnection();){
//do something with connection
}catch(SQLException e){
......
}

5、从方法抛出异常:将异常抛给调用者,让调用者处理它。

public String capitalize(String s)throws NullPointerException{
   if(s==null){
   throw new NullpointerException("your passed a null argument");
}
Character firstChart=s.charAt(0);
String theRest =s.subString(1);
return firstChar.toString().toUppercase()+theRest;
}
将异常抛给调用者,调用者处理异常:
String input=null;
try{
  String capitalized=util.capitalize(input);
  System.out.println(capitalized);
}catch(NullPointException e){
System.out.println(e.toString());
}

6、数字和日期:
数字格式化:public class NumberFormatTest{
public static void main(String[]args){
NumberFormat nf=NumberFormat.getInstance(Locale.US);
System.out.println(nf.getClass().getName());
System.out.println(nf.format(123445));
}
}
java.text.DecimalFormat
123,445
解析数字:java.text.NumberFormat 的parse方法来解析数字,这个方法重载之一:
public java.lang.Number parse(java.lang.String source)throws ParseException
使用java.text.DateFormat和java.text.SimpleDateFormat进行日期解析和格式化。

public class DateFormatTest{
  public static void main(String[]args){
  DateFormat shortDf=DateFormat.getDateInstance(DateFormat.SHORT);
  System.out.println(shortDf.format(new Date()));
  try{
  Date date=shortDf.parse("12/12/2009");
}catch(ParseException e){}
}
}

SimpleDateFormat比Date
Format的功能更强大:

public class SimpleDateFormat{
 public static void mian(String[] args){
  SimpleDateFormat format=new SimpleDateFormat("MM/dd/yyyy");
  try{
   Date date=format.parse("12/31/2011");
}catch(ParseException e){
e.printStackTrace();
}
system.out.println(format.format(new Date()));
}
}

7、接口:我们在开始学接口的时候可能会认为接口就是用关键字interface声明的一个类,并且它的方法没有主体;接口及其方法都是隐式公开(public,方法 public abstract),域是隐式 public static final(即使域已有其中一至两个修饰了),其方法一定不能有static 修饰。
但对接口最好的定义应该是协议,它是服务提供者(服务器)和用户(客户端)之间的一个协议,有时候服务器定义协议,有时候客户端定义协议。
实现类必须覆盖接口中的所有方法,实现类的实例也是接口的实例。接口也可以继承接口。
tip:由于接口中的域是public static final ,所以想起一个知识点,就是 final 在修饰类、方法、以及域时的区别。
final在Java中表示常量、不可修改,static表示静态的、全局(public static 作用整个程序)。当final修饰类时,由于代表常量不可改变,所以不可以继承,如果允许继承,那子类就可以扩展其实例对象也是父类的对象,此时的final类就被修改了,与final定义相悖;final修改方法,表示该方法已经完整不能被子类覆盖修改,也是体现不能改变意思;final修饰变量时,一旦赋值就不能修改,但如果是一个集合等,虽然指向不能修改,但内部内容可以修改。这里要注意的是,只有修饰类的时候不能继承,修饰其他的和继承无关,和普通属性一样继承和修饰符public等有关。
8、抽象类:由于接口中需要把所有方法覆盖实现,有时候很多不用的也要实现,虽然可以写个基类,但不如编一个抽象类。抽象类也是 一种协议,但其中有部分方法实现,没实现的需要用abstract修饰(只要有一个抽象方法 就是抽象类且需要abstract修饰类。即使没有抽象方法abstract也可以修饰类),由于抽象类不能实例化,因此需要实现类,但实现类必须覆盖所所有抽象方法。
9、Comparable和Comparator:当两个对象需要比较排序的时候,需要制定比较标准,可以通过继承java.lang.Comparable和java.util.Comparator接口实现。
继承Comparable接口的类,是要实现接口内部函数public int compareTo(Object obj)来实现,通过比较返回大于零、等于零、和小于零值:
public class Person implements Comparable {
private String firstName;
private String lastName;
private int age;
@Override
public int compareTo(Object obj)throws ClassCastException {
// TODO Auto-generated method stub
if(!(obj instanceof Person)){
throw new ClassCastException("A Person object excepted");
}
return this.age-((Person)obj).age;
}
.............
}

使用方法collection.sort()或Arrays.sort(arrays)自动调用类中实现接口的方法public int compareTo(Object obj)来比较排序。继承Comparable接口是在函数内部就有比较方法,是数据和比较方法写在一起,而使用Comparator则是单纯的建造一个比较标准类,没有实现comparable接口的类也可以比较排序。

public class FirstNameComparator implements Comparator {

    @Override
    public int compare(Object obj1, Object obj2) {
        String firstName1=((Person)obj1).getFirstName().toUpperCase();
        String lastName1=((Person)obj1).getLastName().toUpperCase();
        String firstName2=((Person)obj2).getFirstName().toUpperCase();
        String lastName2=((Person)obj2).getLastName().toUpperCase();
        if(firstName1.equals(firstName2)){
            return lastName1.compareTo(lastName2);
        }else{
            return firstName1.compareTo(firstName2);
        }
    }
}

调用

//persons为对象数组,如果集合 可使用collection.sort(new FirstNameComparator())
 Arrays.sort(persons, new FirstNameComparator());

10、Iterator:由于Collection扩展了Iterable,他有一个方法(Iterator)返回Iterator,可以用它来迭代Collection。Iterator
有以下方法:
hasNext:Iterator内部用一个指针初始指向第一个元素之前的位置,如果指针后有多个指针,则返回true;
next:将内部指针指向下一个元素并返回该元素,第一次调用next时,会让指针指向第一个元素;
remove;删除内部指针所指的元素。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值