首页 » java » 正文

重学java(二)

对象的回收由java虚拟机的垃圾回收线程能够进行自动回收。

通过为对象设置有几个引用的方式来决定对象是否可以回收。

System.gc()可以建议系统进行垃圾回收,但是无法强制系统回收垃圾。

java提供了finalize()方法进行一些操作,如清理一些非内存资源,关闭打开的文件等。除内存的回收以外,其他资源不要依赖垃圾收集器进行处理,应该制作自己的清除方法,也不要依赖finalize()。

class TestCleanUp {
    public static void main(String[] args){
        PolyLine x=new PolyLine(47);
        try{

        }
        finally {
            x.cleanup();
        }
    }
}

class Shape{
    Shape(int i){
        System.out.println("shape constructor.");
    }
    void cleanup(){
        System.out.println("shape cleanup.");
    }
}

class Line extends Shape{
    private int start, end;
    Line(int start, int end){
        super(start);
        this.start=start;
        this.end=end;
        System.out.println("Drawing a Line:"+start+","+end);
    }

    void cleanup(){
        System.out.println("Enrasing a Line:"+start+","+end);
        super.cleanup();
    }
}

class PolyLine extends Shape{
    private Line[] lines = new Line[10];
    PolyLine(int i){
        super(i+1);
        for(i=0; i<10; i++){
            lines[i]=new Line(i, i*i);
        }
        System.out.println("PolyLine constructor.");
    }
    void cleanup(){
        System.out.println("PolyLine cleanup.");
        for(int i=0; i<10; i++){
            lines[i].cleanup();
        }
        super.cleanup();
    }
}

自己的对象要将他调用进行清除,先处理了自己的清除,再调用父类的清除。

java没有析构函数,笔试题c++和java混合,我还以为有析构函数。

内部类:将逻辑上相关联的类放在一起。

可以理解为内部类只是定义在类的内部,只有在外部使用内部类时才有点不同。new的时候需要使用外部类的对象来new。

内部类可以访问外部类,感觉可以成为外部类对象的一个成员。

内部类可以使用成员的所有修饰符。

使用final表示不能被继承,abstract表示不能实例化,static表明实际上不是一种内部类。普通的内部类其实是外部类的附属。

还能有更牛的,方法中定义的类叫做局部类。

局部变量虽然是在方法中,但是不能访问方法中定义的变量。能访问外部类的变量。

匿名类使用父类的构造方法。

lambda表达式:主要用来做函数的参数。

创建线程:new Thread(()->System.out.println("ccc")).start();
添加监听器:button2.addActionListener((event)->System.out.println(event.getSource()))
排序做参数:Array.sort(people,(p1,p2)->(int)(p1.score - p2.score))

lambda表达式可以当成只有一个函数的接口。

包含且只包含一个抽象函数的接口称为函数式接口,可以加@FunctionalInterface进行标注。

String.format("",)

lambda表达式可以当函数和单函数接口使用。

@override用来注明覆盖的父类,@Deprecated表示已过时,@SuppressWarnings关闭对类、方法及成员变量的警告。

@interface Auther{
    int value();  
    String name();  
    String[] telephones();  
}

@Auther(value = 123, name = "zhang",telephones = {"1234", "2234"})

获得Class对象的三种方法:
1. 通过类型获得类,直接使用.class属性,如Class cls=String.class;
2. 通过变量来获得类,使用对象的getClass()方法。
3. 通过Class.forName(“完整的类名”)来获得类。

得到了Class之后,就可以得到该类的包、修饰符、字段、构造方法、方法的信息。

import static java.lang.System.*;
public class ClassViewer {
    public static void view(Class clz) throws ClassNotFoundException{
        out.println("类名称:"+clz.getName());
        out.println("是否为接口:"+clz.isInterface());
        out.println("是否为基本类型:"+clz.isPrimitive());
        out.println("是否为数组对象:"+clz.isArray());
        out.println("父类名称:"+clz.getSuperclass().getName());

        Package p = clz.getPackage();
        out.printf("Package%s;%n",p.getName());

        int modifier = clz.getModifiers();
        out.printf("%s %s %s {%n", Modifier.toString(modifier)
                ,Modifier.isInterface(modifier)?"interface":"class",clz.getName());

        Field[] fields =clz.getFields();
        for(Field field : fields){
            out.printf("\t%s %s %s,%n", Modifier.toString(field.getModifiers())
                    , field.getType().getName(),  //显示类型名
                    field.getName());//显示数据成员名
        }

        Constructor[] constructors = clz.getConstructors();
        for(Constructor constructor : constructors){
            out.printf("\t%s %s();%n",
                    Modifier.toString(constructor.getModifiers()),
                    constructor.getName());
        }

        Method[] methods = clz.getMethods();
        for(Method method:methods){
            out.printf("\t%s %s %s();%n",
                    Modifier.toString(method.getModifiers()),
                    method.getReturnType().getName(),
                    method.getName());
        }
        out.println("}");
    }

    public static void main(String args[]){
        try{
            Class clz = Class.forName("java.lang.String");
            ClassViewer.view(clz);
        }catch (ArrayIndexOutOfBoundsException e){
            out.println("没有指定类.");
        }catch(ClassNotFoundException ee){
            out.println("找不到指定类.");
        }
        finally {

        }
    }
}

多个异常可以放在同一个catch里面,以|隔开。

子类的方法覆盖父类,抛出的异常为父类抛出的异常的同类和子类。

自定义异常:

class MyException extends Exception{
    private int idnumber;
    public MyException(String message, int id){
        super(message);
        this.idnumber=id;
    }

    public int getIdnumber(){
        return idnumber;
    }
}

异常链接:将异常作为参数,加上其他的东西组成新的异常,将其抛出。

finally中也有可能抛出异常,要么捕,要么抛。

try…with…resource系统会自动关闭,前提是这个资源已经实现了java.lang.AutoCloseable接口。
jdk中文件、流、网络中的大部分类都已经实现这个接口,可以使用。

多个资源用分号隔开。

assert 表达式 : 错误信息;

junit提供了一些检测错误的方法,可以学学。

如果没有覆盖类的equals方法,则调用这个方法只是判断是否引用的同一个对象。

运算符==用于引用时,只是判断引用的是否为同一个对象,如果是,则返回true。

String name3="Liming";  String name4="Liming";  
out.println(name3==name4);  输出的是true,因为都是引用的常量,java将常量当对象处理。

System.out.println(); 带一个对象作为参数,那么会自动的调用对象的同String方法。

字符串加一个对象,会自动调用toString方法。

基本数据类型的包装类:Character、Byte、Short、Integer、Long、Float、Double、Boolean。这些类提供了一些常数。

基本数据类型中的值是不能修改的。

Math类中包含了一些数学函数和常量。

System有三个重要的成员:in、out、err。

System:currentTimeMillis得到时间,exit退出、gc()进行垃圾回收;getProperties()得到系统属性。

所有用双引号括起来的都被认为是对象。

可以利用String、StringBuffer、char[]作为String构造函数的参数。

java中每个字符是占2个字节的。

public boolean startsWith(String prefix):判断字符串的前缀。
public boolean endsWith(String suffix):判断字符串的后缀。

public indexOf(int ch)和public indexOf(int ch, int fromIndex)查找字符,找不到返回-1;

public indexOf(String str,[int fromIndex])查找字符串,找不到-1;
public lastIndexOf(String str, [fromIndex])查找字符串,从后往前找。

String有三个比较函数:
1. compareTo
2. equals
3. equalsIgnoreCase,这个是不区分大小写的

Java中的String不能用下标,而是使用charAt(int index)
求子串是substring(int startindex, int endIndex)如果没有endIndex则是一直到末尾。
String转成char[],toCharArray();

String可以使用format像C语言一样的进行格式转换。

其他还有:concat(String str)连接字符串、trim()去掉字符串前后的空格、toUpperCase()转成大写、toLowerCase()转成小写、replace(char oldChar,char newChar):替换String中的全部字符。

可以使用长度和String作为StringBuffer的构造函数的参数。

append和insert可以插入对象,会自动的进行转换成String进行相加。

String的加是个神奇的东西,java编译器将它变成了append加完转化成String。

String对象不能改变,String的引用可以引用其他的。

StringTokenizer(String str);
StringTokenizer(String str, String delim)//分隔符
StringTokenizer(String str, String delim, boolean returnDelims); //分割符是否做一串。

方法有:public int countTokens()//分割串的个数
public boolean hasMoreTokens()//是否还有分割串
public String nextToken()//得到下一个分割串

使用System得到系统的参数,再通过StringTokenizer进行分割进行查看。

发表评论