1.接口也是一种抽象类,只不过是特殊的抽象类,平常的定义格式是public interface 接口名{},同样也可以定义成public abstract interface 接口名{}
2.内部类:匿名内部内:匿名子类的类名,定义格式:父类的类型(通常是抽象类和接口) 对象名 = new 父类的类型(){重写父类的方法}
成员内部类:跟方法同级别的类,定义在一个类里面,访问权限可以是四种访问权限的任意一种
构造对象方式:
如果非static:外部类.内部类 对象名 = 外部类对象.new 内部类()
Static:外部类.内部类 对象名 = new 外部类.内部类()
方法内部类;直接在方法内部定义声明的类,只允许当前方法使用的类
注意:一定不能有访问权限
代码示例:
public class Test {
public static void main(String[] args) {
//1.首先获得该成员内部类的外部类的对象
Test t = new Test();
//2.创建类B的对象
Test.B object = t.new B();
}
//成员内部类,同样有四种修饰符
class B{
}
}
public class Test extends JFrame{
public void initFrame(){
JButton button = new JButton();
//ActionListener是一个接口,这就是匿名内部类的使用
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}
});
}
}
public class Test {
public void say(){
class Hello {
}
//方法内部类的使用,此类只能在当前方法使用,且只能在类声明后创建对象
Hello hello = new Hello();
}
}
3.浮点型的值,如果后面带了小数,则在小数后一定带F或者f,证明这是一个浮点数
float a = 3.14F;
4.变量引用的注意点:当对象作为入参传入方法时,判断传入方法之前的对象和传入方法之后的对象是否指向同一个栈地址,就是看
方法内的对象是否再重新初始化了
代码示例:
public class Test {
public int a = 10;
public char chars[] = {'a','b','c','d'};
public static void main(String[] args) {
Test t = new Test();
t.say(t.a,t.chars);
//输出依旧是10,因为在方法中改变的方法内对象的栈地址,他指向了值为5的栈地址
System.out.println(t.a);
//而第二个输出的是gbcd因为,在下面的方法中并没有创建一个新的字符数组的对象,只是改变了其内容
System.out.println(t.chars);
}
public void say(int a,char chars[]){
a =5;
chars[0] = 'g';
}
}
5.使用switch判断语句时,一定要注意在case语句中是否有break,如果没有break,语句会一直执行到最后一个结果
6.抽象类中可以有抽象方法,普通方法,构造方法,属性可以是成员变量,也可以是常量,抽象方法的定义格式为
public abstract 返回值 方法名();
注意:抽象方法小括号后面一定不能有大括号
7.成员变量不初始化是不能被输出在控制台的
public class Test {
public static void main(String[] args) {
//此成员方法没有初始化是编译通过不了的
String s ;
System.out.println("s=" + s );
}
}
8.字节流和字符流不能直接转换,要依靠InputStreamReader或者OutputStreamWriter来转换
public class Test {
public static void main(String[] args) {
try {
InputStream is = new FileInputStream("");
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
} catch (Exception e) {
e.printStackTrace();
}
}
}
9.静态变量和实例变量的区别
静态变量和实例变量的区别在于:类变量是所有对象共有,其中一个对象将它值改变,其他对象得到的就是改变后的结果;而实例变量则属对象私有,某一个对象将其值改变,
不影响其他对象;
10.线程的run方法和start方法有什么区别
1)用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的 start()方法来启动一个线程,这时
此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu的控制权,就开始执行run()方法,这里方法 run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结
束,此线程随即终止。
2)run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体
执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。
3)总结:调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。
11.sleep(),suspend()和wait()之间有什么区别
1)sleep ()使当前线程在指定的时间处于“非运行”(Not Runnable)状态。线程一直持有对象的监视器。比如一个线程当前在一个同步块或同步方法中,其它线程不能进入该块
或方法中。如果另一线程调用了 interrupt ()方法,它将唤醒那个“睡眠的”线程。
注意:sleep ()是一个静态方法。这意味着只对当前线程有效,一个常见的错误是调用t.sleep (),(这里的t是一个不同于当前线程的线程)。即便是执行t.sleep (),也是当前线
程进入睡眠,而不是t线程。
2)suspend ()是过时的方法,使用 suspend ()导致线程进入停滞状态,该线程会一直持有对象的监视器,suspend ()容易引起死锁问题。
3)wait():当前前线程出于“不可运行”状态,和 sleep ()不同的是wait 是 object 的方法而不是 thread。调用 object.wait ()时,线程先要获取这个对象的对象锁,当前线程必须在锁
对象保持同步,把当前线程添加到等待队列中,随后另一线程可以同步同一个对象锁来调用 object.notify (),这样将唤醒原来等待中的线程,然后释放该锁。基本上wait ()/notify
()与sleep ()/interrupt ()类似,只是前者需要获取对象锁。