数组角标越界异常:
1.数组角标越界异常:ArrayIndexOutOfBoundsExcetion
2.空指针异常: NullPointerException
面向对象的三大特征
封装性 继承性 多态性
方法的重载:两同一不同,两同是指同一个类、方法名相同,一不同是指参数列表不同。
1、同一个类
2、同一个方法名
3、列表不同
方法的重写:2同2小1大,2同是指方法名相同、形参列表相同;2小是指返回值类型相同或更小、抛出的异常更小;1大访问权限相同或更大。
1、方法名相同
2、形参列表得相同
3、返回值类型相同或更小
4、抛出异常更小
5、访问权限相同或者更大
注意:如果父类方法的类型是void,子类的方法类型必须只能是void。静态static方法是不能被重写的,只能重写非静态的方法。
形参和实参:形参就是没有被赋值的参数,实参就是被赋值过的参数。
//可变个数形参,最多只能声明一个可变形参,如果要使用,其它变量一起用,可变形参需要放置在尾部
public void show(String ... str){
}
public void show(int a,String ... str){
}
方法参数的值传递机制
如果变量是基本数据类型,此时的赋值的是变量所保存的数据值。
如果变量是引用数据类型,此时变量是变量所保存的数据的地址值
java是值传递
栈和堆
2.5堆和栈中的存储内容
栈: 在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可
执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈
的,然后是函数中的局部变量。注意静态变量是不入栈的。
当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地
址,也就是主函数中的下一条指令,程序由该点继续运行。
堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容由程序员安排。 一般是new出来的结构,对象,还有数组
方法的递归
就是一个方法体内调用它自身
封装的体现
就像调用bean里面的get,set方法,但是设置属性为private就是为了不让用户直接的去使用属性给他们赋值,比如说对于这个属性想给出一点限制条件,比如说Int a>100,就要通过set方法来实现。
构造器
constructor就相当于一个方法在new的时候,就可以理解为new的是一个构造器。构造器默认调用的就是:
person a = new person();
//这个构造器就是系统默认提供的
public void person(){
//默认里面是为空
};
说明
- 如果没有显示的定义类的构造器的话,则系统默认会提供一个空参构造器
- 定义构造器的格式:权限修饰符 类名(形参列表){}
- 一个类中定义多个构造器,彼此构成重载
- 一旦我们显示的定义了类的构造器后,系统就不在提供默认的空参构造器
- 一个类中,至少会有一个构造器
JavaBean
- JavaBean是一种Java语言写成的可重用组件
- 所谓javaBean,是符合一下标准的java类
1、类是公共的;2、有一个无参的公共构造器;3.有属性,且有对应的get,set方法
就是相当于实体类的存在
MVC的设计模式
mvc分为三个层次:视图模型层,控制器层,数据模型层
模型层 model 主要处理数据
- 数据对象封装
- 数据库操作类
- 数据库
控制层 controller 处理业务逻辑
- 应用界面相关
- 存放fragment
- 显示列表适配器
- 服务相关的
- 抽取的基类
视图层 view显示数据
- 相关工具类
- 自定义view
多态性
什么是多态性
可以理解为一个事物有多种形态。
对象的多态性:父类的引用指向子类的对象(或子类的对象赋值给父类的引用)
多态的使用,虚拟方法调用
有了对象的多态性以后,我们在编译期,只能调用父类中声明的方法,但是在运行期,我们实际执行的是子类重写父类的方法。
总结:编译看左边,运行看右边
多态使用的前提
①类的继承关系;
②方法的重写;
例如:以下就是多态的例子
Person p1 = new Person();
p1.eat();
Person p2 = new Man();
p2.eat();
p1调用的方法就会是Person类中的方法,而p2调用的方法就会是Man类中的方法,也只是能用重写的方法。
比如说,Man中有一个run()方法,而Person类中没有这个方法。p2是可以使用这个方法的,但是p1却使用不了这个方法。这就是编译看左边。
方法的多态是不看属性的。就是只适用于方法,不适用于属性。
instanceof关键字使用
a instanceof A:判断对象a是否是类A的实例。如果是,返回true;如果不是,返回false。
使用的情景:为了避免在向下转型的时候出现ClassCastException的异常,我们在向下转型之前,先进行instanceof的判断,一旦返回true,就会进行向下转型。如果返回false,不会进行向下转型。
如果a instanceof A返回了true,那么a instanceof B也会返回true,其中,类B是类A的父类。
finalize()方法
finalize()是Object里面的一个方法,当一个堆空间中的对象没有被栈空间变量指向的时候,这个对象会等待被java回收:jdk里面是这样实现的:
protected void finalize() throws Throwable {
}
}
equals()方法(toString()方法也是在各个子类中进行了重写)
- 是一个方法,而非运算符
- 只能适用于引用数据类型
- 在Object的类中调用的equals的方法就和使用==是一样的,其下面的各个子类对它的方法进行了自己的重写,例如String还有Date等等都进行了重写
//这是Object类中的equals的方法
public boolean equals(Object obj) {
return (this == obj);
}
****************************************
//这是String中的equals的方法
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
equals和==的区别:
==是直接的对地址进行比较,而equals是对字符进行比较
static关键字使用
使用static修饰属性的时候
实例变量:我们创建了类的多个对象,每个对象都独立的拥有一套类中的非静态属性。当修改其中一个对象中的非静态属性的时候,是不会影响到其它对象中同样的属性值的修改
静态变量:我们创建了类的多个对象,多个对象共享同一个静态变量。当通过某一个对象修改静态变量时,会导致其它对象调用此静态变量的时候,会调用修改过的。
注意:
①静态变量会随着类的加载而加载,可以勇敢“类.静态变量”的方式进行调用
②静态变量的加载要早于对象的创建
③由于类只会加载一次,则静态变量在内存中也只会存在一份,存在方法区的静态域中
Persin.name="aa"
例子:name属性是静态属性staic name
Person a1=new Person();
a1.name="小洪"
Person a2=new Person();
a2.name="小明"
sout(a1.name);
//输出的内容将会是小明
static修饰静态方法
1.静态变量会随着类的加载而加载,可以勇敢“类.静态变量”的方式进行调用;
2.静态方法中,只能去用静态的方法或者属性;非静态方法中,既可以调用非静态的方法或属性,也可以调用静态的方法或属性;
3.在静态的方法中,是不能使用this关键字、super关键字的。
public void eat(){
sout("吃东西");
}
public staic void run(){
sout("跑步");
//eat();是不能调用的,会报错;
}
在开发中,如何确定一个方法或者属性是否要声明为static?
······属性:属性是可以被多个对象所共享的,不会随着对象不同而不同的。例如银行利率,分数线等
······方法:操作静态属性的方法,通常设置为static;工具类中的方法,习惯上声明为static的,比如说:Math、Arrays…
单例模式:http://blog.csdn.net/dmk877/article/details/50311791(转)
(1)私有化该类的构造函数
(2)通过new在本类中创建一个本类对象
(3)定义一个公有的方法,将在该类中所创建的对象返回
饿汉式
优点:线程是安全的
缺点:对象加载时间过长
public class Singleton {
private static Singleton instance=new Singleton();
private Singleton(){
};