局部变量:
1).定义在类中的大括号中的{}中的变量都是局部变量,如方法中,匿名代码块,流程控制语句等
2).使用前必须进行初始化(自己进行)
3).作用范围,声明位置开始到声明所在的{}大括号结束
实例变量:
1).定义中类中
2).创建实例(对象)时,JVM会对类中的实例变量进行默认初始化
3).创建实例时,实例变量开始存在这个对象消失时,实例变量消失
类修饰符:
public(访问控制符),将一个类声明为公共类,他可以被任何对象访问,一个程序的主类必须是公共类。
abstract,将一个类声明为抽象类,没有实现的方法,需要子类提供方法实现。
final,将一个类生命为最终(即非继承类),表示他不能被其他类继承。
friendly,默认的修饰符,只有在相同包中的对象才能使用这样的类。
成员变量修饰符:
public(公共访问控制符),指定该变量为公共的,他可以被任何对象的方法访问。
private(私有访问控制符)指定该变量只允许自己的类的方法访问,其他任何类(包括子类)中的方法均不能访问。
protected(保护访问控制符)指定该变量可以别被自己的类和子类访问。在子类中可以覆盖此变量。
friendly ,在同一个包中的类可以访问,其他包中的类不能访问。
final,最终修饰符,指定此变量的值不能变。
static(静态修饰符)指定变量被所有对象共享,即所有实例都可以使用该变量。变量属于这个类。
transient(过度修饰符)指定该变量是系统保留,暂无特别作用的临时性变量。
volatile(易失修饰符)指定该变量可以同时被几个线程控制和修改。
方法修饰符:
public(公共控制符)
private(私有控制符)指定此方法只能有自己类等方法访问,其他的类不能访问(包括子类)
protected(保护访问控制符)指定该方法可以被它的类和子类进行访问。
final,指定该方法不能被重载。
static,指定不需要实例化就可以激活的一个方法。
synchronize,同步修饰符,在多个线程中,该修饰符用于在运行前,对他所属的方法加锁,以防止其他线程的访问,运行结束后解锁。
native,本地修饰符。指定此方法的方法体是用其他语言在程序外部编写的。
break 跳出当前循环,继续往下执行
continue 跳出本次循环,继续下一次循环
return 结束当前方法, return 之后的语句不会执行
1).通过java的new关键字创建对象
2).通过反射手段返回对象
调用java.lang.Class类的newInstance()方法
调用java.lang.reflect.Constructor类的newInstance()方法
3)通过I/O流泛型(反序列化)返回对象
调用java.io.ObjectInputStream对象的readObject()方法返回对象
需要实现Serializable接口
4).通过工厂方法返回对象
如:String str = String.valueOf(10);
5).通过对象的clone()方法返回对象
需要满足一下两点条件:
需实现Cloneable接口、覆盖clone方法
目的(作用):
方法重载是:行为相同结果不同时 进行使用
方法重写是:父类不能满足子类的方法要求
要求:
方法重载是:定义在同一个类中,方法名相同,参数列表不同(个数,顺序,类型不同),抛异常等可以相同可以不同
方法重写是:在子类中重写父类的方法,方法名相同,参数列表相同,返回值类型“相同”(当父类的返回值类型是子类的返回值类型的父类时也可以),访问修饰符不能被缩小,抛异常不能被放大
必须是非静态方法(静态的可以再次声明但不是重写)
该方法必须是可以直接访问的
多态:
方法重载是:编译时多态
方法重写是:运行时多态
构造器的调用方面:
this 调用本类的构造器this.constructorName;
super调用父类的构造器super(constructorName);
都需要放在第一行
调用方法:
this调用本类方法
super调用父类方法
调用属性:
this调用本类属性
super调用父类属性
this 指当前类对象 还能用于get,set方法种区别实例变量和局部变量
this和super不能存在于同一个构造方法
对拥有子类的父类方法进行初始化时,父类的构造方法也会执行,且优先于子类的构造方法。
this super 不能被static修饰
public 同类 同包 不同包子类 不同包
protected 同类 同包 不同包子类
default 同类 同包
private 同类
1、修饰成员变量
2、修饰成员方法
3、静态代码块
4、修饰类【只能修饰内部类也就是静态内部类】
5、静态导包
代码块执行顺序静态代码块——> 构造代码块 ——> 构造函数——> 普通代码块
继承中代码块执行顺序:父类静态块——>子类静态块——>父类代码块——>父类构造器——>子类代码块——>子类构造器
1.加载静态代码块先加载父类的,再加载本类的
2.调用父类的匿名代码块
3.调用父类的构造器
4.调用本类的匿名代码块
5.调用本类的构造器
p.s.new一个对象的时候JVM都做了那些事情
1.类加载,(java -cp xx.xx.xx,Class.forName/load)
同时初始化类中静态的属性(赋默认值)
2.执行静态代码块(先父类后自己)
//如果之前做过类加载,从第三步开始执行
3.分配内存空间,同时初始化非静态的属性(赋默认值)
4.调用父类构造器,如果父类中有匿名代码块先调用匿
名代码块
5.父类构造器执行完后,如果自己声明属性的同时有
显示的赋值,那么进行显示赋值把默认值覆盖
6.执行匿名代码块
7.执行构造器
8.返回内存地址
1).共同点
A.两者都是抽象类,都不能实例化
B.Interface实现类和abstract继承类都必须实现抽象方法
2).不同点
A.Interface需要实现,用implements;Abstract 需要继承,用exends
B.一个类可以实现多个Interface ;一个类只能继承一个Abstract
C.抽象类可以有构造方法,接口中不能有构造方法。
D.抽象类中可以有普通成员变量,接口中没有普通成员变量
E.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
F.抽象类中可以包含静态方法,接口中不能包含静态方法
G.抽象类中的抽象方法的访问类型可以是public,protected;但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型
//懒汉式单例类.在第一次调用的时候实例化自己
public class Singleton {
private Singleton() {}
private static Singleton single=null;
//静态工厂方法
public static Singleton getInstance() {
if (single == null) {
single = new Singleton();
}
return single;
}
}
//饿汉式单例类.在类初始化时,已经自行实例化
public class Singleton {
private Singleton() {}
private static final Singleton singleton = new Singleton1();
//静态工厂方法
public static Singleton getInstance() {
return singleton;
}
1).static Inner classes
2).member Inner classes
3).local Inner classes
4).anonymous Inner classes
A.在哪定义
B.怎么定义
C.内部类里能定义什么
D.内部类中可以使用外部类的什么
E.外部类怎么使用内部类
F.外部类的外面怎么使用内部类
基本数据类型包括:int,char,float,long,double,boolean,byte,short(注:String不是基本数据类型);基本数据类型之间的比较用"=="。
引用数据类型包括:Integer,Char,Float,Long,Double,Boolean,Byte,Short。引用数据类型“==”比较的是他们在内存中的存放地址,equals比较的是值是否相等。
Object中的.equals()方法和"==’功能一样,但是String类中的.equals()方法重写了.
1)静态方法直接调用
2)通过对象调用普通方法
3)通过反射invoke调用方法
1)new对象调用构造器
2)this
3)super
4)Constructor>[] cons=c.getDeclaredConstructors(); 取出构造器
反射 创建对象调用有参/无参的构造器Object o =con.newInstance();
5)反射 调用无参构造器Class 的new Instance();
唯一吗?
是:Set
排序吗?
是:TreeSet或LinkedHashSet
否:HashSet
如果你知道是Set,但是不知道是哪个Set,就用HashSet。线程安全用HashTable
否:List
要安全吗?
是:Vector
否:ArrayList或者LinkedList查询多:ArrayList
增删多:LinkedList
如果你知道是List,但是不知道是哪个List,就用ArrayList。
如果你知道是Collection集合,但是不知道使用谁,就用ArrayList。
如果你知道用集合,就用ArrayList。
for(int i=0;i<list.size;i++){System.out.println(list.get(i));}
for(Object o:list){System.out.println(o);}
Iterator iterator = list.iterator();
while(iterator.hasNext()){System.out.println(iterator.next());}
泛型将接口的概念进一步延伸,”泛型”字面意思就是广泛的类型,类、接口和方法代码可以应用于非常广泛的类型,代码与它们能够操作的数据类型不再绑定在一起,同一套代码,可以用于多种数据类型,这样,不仅可以复用代码,降低耦合,同时,还可以提高代码的可读性和安全性。
通过使用泛型,开发环境和编译器能确保你不会用错类型,为你的程序多设置一道安全防护网。使用泛型,还可以省去繁琐的强制类型转换,再加上明确的类型信息,代码可读性也会更好。
枚举是JKD1.5 新增的一个关键字enum,表示一种枚举类型。
枚举类型也是一种类(class),是一种特殊的类,枚举类型中所列出的元素,就是枚举类型的对象,默认是用public static final修饰的,所以这些对象的名字一般都是全字母大写
反射main方法下
Class> c1 = ClassName.class;
ClassName Name=new ClassName(null);
Class extends ClassName> c2 = Name.getClass();
Class> c3=Class.forName(“PackageName.ClassName”);
newInstance();
invoke();
InterruptedIOException
IOException
FileNotFoundException
FileException
FileSystemException
InterruptedException
RuntimeException:
ArrayStoreException
EmptyStackException
FileSystemNotFoundException
NullpointerException
IndexOutOfBoundsException:
ArrayIndexOutOfBoundsException
StringIndexOutOfBoundsException
Arith metic Exception
UnknownHostException
ClassCastException
创建线程的方法:
使用接口implements Runnable
或者继承extends Thread
区别:
接口需要具体实现接口下的方法,但是原class类可以继承其他类
而继承不需要实现方法,可以继承父类Thread下的所有方法,但是不能继承其他的类
start和run的区别:
start方法:
通过该方法启动线程的同时也创建了一个线程,真正实现了多线程。**无需等待run()方法中的代码执行完毕,就可以接着执行下面的代码。此时start()的这个线程处于就绪状态,当得到CPU的时间片后就会执行其中的run()方法。**这个run()方法包含了要执行的这个线程的内容,run()方法运行结束,此线程也就终止了。
run方法:
通过run方法启动线程其实就是调用一个类中的方法,当作普通的方法的方式调用。并没有创建一个线程,程序中依旧只有一个主线程,必须等到run()方法里面的代码执行完毕,才会继续执行下面的代码,这样就没有达到写线程的目的。
java线程中的七种状态
新建状态(New)
就绪状态(Runnable)
运行状态(Running)
阻塞状态(Blocked)
等待状态(WAITING)
限时等待状态(TIMED_WAITING)
死亡状态(TERMINATED)
sleep()方法与wait()方法有什么区别?
sleep()是使线程暂停执行一段时间的方法。wait()也是一种使线程暂停执行的方法。二者区别为:
①原理不同。
sleep()方法是Thread类的静态方法,是线程用来控制自身流程的,它会使此线程暂停执行一段时间,而把执行机会让给其他线程,等到计时时间一到,此线程会自动苏醒。而wait()方法是Object类的方法,用于线程间的通信,这个方法会使当前拥有该对象锁的进程等待,直到其他线程用调用notify()或notifyAll()时才苏醒过来,开发人员也可以给它指定一个时间使其自动醒来。
②对锁的处理机制不同。
由于sleep()方法的主要作用是让线程暂停一段时间,时间一到则自动恢复,不涉及线程间的通信,因此调用sleep()方法并不会释放锁。而wait()方法则不同,当调用wait()方法后,线程会释放掉它所占用的锁,从而使线程所在对象中的其他synchronized数据可被别的线程使用。
③使用区域不同。
wait()方法必须放在同步控制方法或者同步语句块中使用,而sleep方法则可以放在任何地方使用。
sleep()方法必须捕获异常,而wait()、notify()、notifyAll()不需要捕获异常。在sleep的过程中,有可能被其他对象调用它的interrupt(),产生InterruptedException异常。
由于sleep不会释放锁标志,容易导致死锁问题的发生,一般情况下,不推荐使用sleep()方法,而推荐使用wait()方法。