首页 > 代码库 > 查漏补缺

查漏补缺

查漏补缺
[1].this语句;
this语句用于构造函数之间进行相互调用。
this语句只能定义在构造函数的第一行,因为初始化要先执行。
[2].对象的初始化过程
Person p =new Person("hei",10);
1.因为new用到了Person.class,所以先找到Person.class文件加载到内存中
2.执行类中的静态代码块,如果有的话,给Person.class类进行初始化
3.在堆内存中开辟空间,分配内存地址
4.在堆内存中建立对象的特有属性,并进行默认初始化
5.对属性进行显式初始化
6.对对象进行构造代码块初始化
7.对对象进行与之对应的构造初始化
8.将内存地址赋值给内存中的p变量
[3].对象的执行过程
静态方法调用是 类名.静态方法()
静态属性调动是 类名.属性
注:类名一般省略
非静态的方法调用是 this.方法()
非静态的属性调用是 this.属性

[4]单例
1.将构造函数私有化
2.在类中提供一个本类对象
3.对外提供一个获取本类对象的方法

[5]继承对象的初始化执行过程
class Fu {
public static int fuNum = 23;
static {
System.out.println("static Fu.enclosing_method()... " + fuNum);
}

{
System.out.println("Fu.enclosing_method().... " + ++fuNum);
}

Fu() {
System.out.println("Fu.Fu()");
}
}

class Zi extends Fu {
public static int ziNum = 23;
static {
System.out.println("static Zi.enclosing_method()... " + ziNum);
}

{
System.out.println("Zi.enclosing_method()... " + ++ziNum);
}

Zi() {
System.out.println("Zi.Zi()");
}

Zi(String zi) {
System.out.println("Zi.Zi((String zi) .... " + zi);
}
}
Zi zi =new Zi();

[6]抽象类中可以不定义抽象方法,这样做仅仅是不让该类建立对象。

[7]接口中的修饰成员符是固定的(默认的)。
成员常量:public static final
成员函数:public abstract

[8]多态中的特点
成员函数的特点:
编译时期,参阅引用类型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败
在运行期,参阅对象所属的类中是否有调用的方法。

成员变量的特点:
编译时期:参阅引用类型变量所属的类
在运行期:参阅引用类型变量所属的类

静态成员函数、静态成员变量的特点:
编译时期:参阅引用类型变量所属的类
在运行期:参阅引用类型变量所属的类

9.内部类,静态内部类,局部内部类,匿名内部类,没有实现接口和继承类的匿名内部类

内部类的特点:
内部类可以直接访问外部类的成员(外部类.this.成员),包括私有成员。
外部类要访问内部类中的成员必须要建立内部类的对象。

package cn.soldier.oop;

public class InnerDemo {
private String name = "InnerDemo";
private static int age = 1;

InnerDemo() {
Inner inner = new Inner();
System.out.println(inner.name);
}
// 内部类
class Inner {
private String name = "Inner";

Inner() {
System.out.println(InnerDemo.this.name);// 默认InnerDemo.this.,可以忽略不写
}
}
// 静态内部类
public static class InnerStatic {
void innerStatic() {
// 只能访问外部类的静态成员
// 非静态内部类中不可以定义静态成员
System.out.println(age);
}
}
public void method() {
final int method_age = 10;
// 局部内部类
class MethodInner {
void function() {
// 不可以被成员修饰符修饰 .
// 可以直接访问外部类中的成员和引用,但是不可以访问它所在的非final变量。
System.out.println(age);
System.out.println(name);
System.out.println(method_age);
}
}
new MethodInner().function();
}
public void method_1() {
// 匿名内部类
// 1.定义匿名内部类的前提:内部类必须继承一个类或实现接口
// 2.其实内部类就是一个匿名子类对象。而且这个对象有点胖
new AbsDemo() {
void show() {
System.out.println("InnerDemo.method_1().show()+ name=" + name);
}

void show1() {
System.out
.println("InnerDemo.method_1().show1()+ name=" + name);
}
}.show();
//
new AbsDemo() {
void show() {
System.out.println("InnerDemo.method_1().show()+ name=" + name);
}

void show1() {
System.out
.println("InnerDemo.method_1().show1()+ name=" + name);
}
}.show1();
}
}
abstract class AbsDemo {
abstract void show();
}
class OuterDemo {
public static void main(String[] args) {
InnerDemo.Inner inner = new InnerDemo().new Inner();
new InnerDemo.InnerStatic().innerStatic();
new InnerDemo().method();
new InnerDemo().method_1();
// 面试题:请构造出下面的写法; *
new Method().method().method();
Method.method().method();
// 分析如下:
// Method类中有一个静态方法method()
// method()这个方法运算后返回结果是一个对象,而且是一个静态匿名类对象,
// 改静态匿名类对象继承一个类或实现一个接口,该类或接口里面有一个method()方法。
// 面试题:
new Object() {//这是Object子类对象,是没有实现接口和继承类的匿名内部类对象
public void function() {
System.out.println("OuterDemo.main()");
}
}.function();
}
}

class Method {
static class _Inner implements Imethod {
public void method() {
System.out.println("Method._Inner.method(),呵呵");
}
}
static _Inner method() {
return new _Inner();
}
}
interface Imethod {
abstract void method();
}


10.
Trowable
|--Error
|-- ...
|--Exception
|--ApplicationException
|--PrintException
|--ArithmeticException
|--ArrayIndexOutOfBoundsException
|--RuntimeException
|-- ...

异常声明 throws
//throws 关键字声明了该功能有可能会出现问题。需要调用者处理。
void show() throws Exception{}

异常声明 throw
void show() throws Exception{
if(true){
throw new RuntimeException();
}
}

throws 与 throw 的区别
throws 定义在函数上 ,后面跟的是异常类,可以多个以逗号隔开。
throw 定义在函数中 ,后面跟的是异常对象。


RuntimeException 及其子类 如果在函数里被抛出可以不用再函数声明。
|--ArithmeticException
|--NullPointerException
|--IndexOutOfBoundsException
|-- ...
之所以不用声明,是因为该异常的发生,不需要让调用者处理。当发生异常时,
设计者希望程序停止,因为出现了无法继续运算的情况。希望通过程序停止后,
使用者对该问题进行修正。

异常在子父类覆盖中的处理。
1.子类覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者改异常的子类。
2.如果父类方法抛出了多个异常,那么子类在覆盖该方法是,只能抛出父类异常的子集(比父类少或相等)。
3.如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法是,也不可抛出异常,也就是说,如果子类方法发生了异常,只能自己消化不能抛出。

finally 只有一种情况不会执行,
当执行到 System.exit(0);finally{}时不会执行。

自定义异常
继承Exception
或者RuntimeException
//1.具备可抛性,2,具备操作异常的共性方法。
Class MyException extends Exception
{
MyException(String message)
{
super(message);
}
}

11.多线程
多线程的线程安全问题:
当多个语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分执行完,另一个线程参与进来执行,导致共享数据的错误。

解决线程安全问题,保证共享数据的操作是线程同步的。

同步的前提:1.一个进程中,必须由两个或者两个以上的线程。
2.多个线程使用的是同一个锁

同步函数的锁是this
静态同步函数的锁是Class对象

死锁问题:同步中嵌套同步,锁不同
public class ThreadDemo {
public static void main(String[] args) {
new Thread(new Testlock(true)).start();
new Thread(new Testlock(false)).start();
}
}

class Testlock implements Runnable {
private boolean flag;

Testlock(boolean flag) {
this.flag = flag;
}

public void run() {


if (flag) {
synchronized (Mylock.locka) {
System.out.println("if locka");
synchronized (Mylock.lockb) {
System.out.println("if lockb");
}
}

} else {
synchronized (Mylock.lockb) {
System.out.println("else lockb");
synchronized (Mylock.locka) {
System.out.println("else locka");
}
}

}
}
}

class Mylock {
static Object locka = new Object();
static Object lockb = new Object();
}
线程间通讯
wait()、notify()、notifyAll()为什么要定义在Object类中?
1.这些方法存在于同步中。
2.使用这些方法是必须要标识所属的同步锁。
3.锁是可以是任意对象,所以任意对象调用的方法一定要定义在Object类中。

wait()和sleep()有什么区别
wait释放资源,释放锁
sleep释放资源,不释放锁

 

package cn.soldier.oop;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;//创建Thread,小秀一手public class ThreadDemo {    public static void main(String[] args) {        new TestThread("逗比 ").start();        new TestThread("呵呵 hehe").start();        //        for (int i = 0; i < 100; i++) {            System.out.println("ThreadDemo.main() -------- " + i);        }    }}class TestThread extends Thread {    TestThread(String name) {        super(name);    }    @Override    public void run() {        for (int i = 0; i < 100; i++) {            System.out.println(this.getName()                    + "-------TestThread.run() -------- " + i);        }    }}// 实现Runnable接口,使用synchronized解决多个线程操作共享数据的安全问题public class ThreadDemo {    public static void main(String[] args) {        TickeRunnable tickeRunnable = new TickeRunnable();        new Thread(tickeRunnable).start();        new Thread(tickeRunnable).start();    }}// class TickeThread extends Thread {class TickeRunnable implements Runnable {    private int tick = 100;    Object obj = new Object();    public void run() {        boolean flag = true;        while (flag) {            synchronized (obj) {                if (tick > 0) {                    try {                        Thread.sleep(100);                    } catch (InterruptedException e) {                    }                    System.out.println("Ticke:  " + tick-- + "号,被   "                            + Thread.currentThread().getName() + "  卖了");                } else {                    flag = false;                }            }        }    }}public class ThreadDemo {    public static void main(String[] args) {        Cus cus = new Cus();        new Thread(cus).start();        new Thread(cus).start();    }}class Bank {    private int sum;    public void add(int n) {        synchronized (this) {            sum = sum + n;            System.out.println(Thread.currentThread().getName()                    + "  Bank.add()--- sum=" + sum);        }    }}class Cus implements Runnable {    private Bank bank = new Bank();    public void run() {        for (int i = 0; i < 3; i++) {            bank.add(100);        }    }}// 延迟加载的单例模式class Single {    private static Single s = null;    private Single() {    }    public static Single getInStance() {        if (s == null) {            // 这是关键,减少同步次数,提高效率            synchronized (Single.class) {                // 锁。该类所属的字节码文件对象                if (s == null) {                    s = new Single();                }            }        }        return s;    }}// 饿汉试单例模式class Single1 {    private static final Single1 s = new Single1();    private Single1() {    }    public static Single1 getInStance() {        return s;    }}// 死锁public class ThreadDemo {    public static void main(String[] args) {        new Thread(new Testlock(true)).start();        new Thread(new Testlock(false)).start();    }}class Testlock implements Runnable {    private boolean flag;    Testlock(boolean flag) {        this.flag = flag;    }    public void run() {        if (flag) {            synchronized (Mylock.locka) {                System.out.println("if locka");                synchronized (Mylock.lockb) {                    System.out.println("if lockb");                }            }        } else {            synchronized (Mylock.lockb) {                System.out.println("else lockb");                synchronized (Mylock.locka) {                    System.out.println("else locka");                }            }        }    }}class Mylock {    static Object locka = new Object();    static Object lockb = new Object();}public class ThreadDemo {    public static void main(String[] args) {        Resource resource = new Resource();        Producer producer = new Producer(resource);        Consumer consumer = new Consumer(resource);        new Thread(producer).start();        new Thread(consumer).start();        new Thread(producer).start();        new Thread(consumer).start();    }}class Resource {    private String name;    private int count = 1;    private boolean flag = false;    public synchronized void set(String name) {        while (flag) {            try {                this.wait();            } catch (Exception e) {            }        }        this.name = name + "--" + count++;        System.out.println(Thread.currentThread().getName() + "--生产者--"                + this.name);        flag = true;        this.notifyAll();    }    public synchronized void out() {        while (!flag) {            try {                this.wait();            } catch (Exception e) {            }        }        System.out.println(Thread.currentThread().getName()                + "--------消费者-------" + this.name);        flag = false;        this.notifyAll();    }}class Producer implements Runnable {    private Resource resource;    Producer(Resource resource) {        this.resource = resource;    }    public void run() {        while (true) {            resource.set("逗比");        }    }}class Consumer implements Runnable {    private Resource resource;    Consumer(Resource resource) {        this.resource = resource;    }    public void run() {        while (true) {            resource.out();        }    }}public class ThreadDemo {    public static void main(String[] args) {        Resource resource = new Resource();        Producer producer = new Producer(resource);        Consumer consumer = new Consumer(resource);        new Thread(producer).start();        new Thread(consumer).start();        new Thread(producer).start();        new Thread(consumer).start();    }}class Resource {    private final Lock lock = new ReentrantLock();// 拿到锁    private final Condition condition_producer = lock.newCondition();// 生产者的监视器    private final Condition condition_consumer = lock.newCondition();// 消费者的监视器    //    private String name;    private int count = 1;    private boolean flag = false;    public void set(String name) throws InterruptedException {        lock.lock();        try {            if (flag)                condition_producer.await();            this.name = name + "--" + count++;            System.out.println(Thread.currentThread().getName() + "--生产者--"                    + this.name);            flag = true;            condition_consumer.signal();        } finally {            lock.unlock();        }    }    public void out() throws InterruptedException {        lock.lock();        try {            if (!flag)                condition_consumer.await();            System.out.println(Thread.currentThread().getName()                    + "--------消费者-------" + this.name);            flag = false;            condition_producer.signal();        } finally {            lock.unlock();        }    }}class Producer implements Runnable {    private Resource resource;    Producer(Resource resource) {        this.resource = resource;    }    public void run() {        while (true) {            try {                resource.set("逗比");            } catch (InterruptedException e) {                e.printStackTrace();            }        }    }}class Consumer implements Runnable {    private Resource resource;    Consumer(Resource resource) {        this.resource = resource;    }    public void run() {        while (true) {            try {                resource.out();            } catch (InterruptedException e) {                e.printStackTrace();            }        }    }}

 

查漏补缺