现在的位置: 首页 > 综合 > 正文

Java基础学习笔记_面向对象2

2013年02月08日 ⁄ 综合 ⁄ 共 2754字 ⁄ 字号 评论关闭
1. 设计模式
1)单例模式之恶汉式
class Single {
private Single( ){ } //私有构造函数,目的不让其他类创建本类的对象;
private static Single s = new Single(); //对外提供一种公共的访问方式,可以访问本类创建的对象;
public static Single getInstance(){
return s;
}
}
2)单例模式之懒汉式 --单例的延迟加载
这个目前会有多线程访问的问题,一般面试的时候用;
class Single{
private Single(){}
private static Single s = null;//声明一个本类的引用,先不去创建对象;
public static Single getInstance(){
if(s == null){
s = new Single();
}
return s;
}
}
3) 第三种单例模式
class Single{
private Single){ }
public static final Single s = new Single();
}
2.继承 关键字extends
好处:提高了代码的复用性,在父类中定义子类可以继承过来用;
让类与类之间产生了关系,提供了多态的前提;
特点:
1)java只支持单继承,不支持多继承;
2)Java支持多层继承;
当子父类的成员变量重名时,可以使用super区分;
当成员变量和局部变量重名时,可以用this区分;
子类创建对象调用方法,先看本类有没有方法,有则调用;如果没有则去看父类有无,无则报错;
子类构造函数的第一行默认有一条隐式的super();
易错题:
class Fu {
String name;
Fu(String name) {
this.name = name;
System.out.println("父类构造函数");
}
}
class Zi extends Fu {
Zi( ) { //编译报错
System.out.println("子类构造函数");
}
Zi(String name){ //编译报错
this.name = name;
System.out.println("子类有参构造函数");
}
}
这个程序在编译的时候报错,在子类的构造方法中有一个隐式super(),但父类中没有无参构造函数;
子类实例化过程:
1)子类中所有的构造函数默认都会访问父类中的空参构造函数,因为每一个子类构造函数的第一行都有一个默认的super();
2)当父类中没无参构造函数时,子类的构造函数必须通过this或者super语句来执行要访问的构造函数;
2.1覆盖:
1)子类重新写父类的方法,返回值类型、方法名、参数都要一模一样;
2)访问权限不能是private,在子类中继续使用父类被覆盖的方法可以super.函数名 获取。
3)子类重写父类的方法权限必须大于等于父类的权限,静态只能覆盖静态。
2.2 final
1)final修饰的类不能有子类;
2)final修饰的方法不能被复写;
3)final修饰的变量一旦初始化就不能再改变其值->常量。
初始化分为:
显示初始化: final int num = 15;
构造函数初始化:
class Fu{
final int NUM;
Fu(){
NUM = 10;
}
}
3. 抽象(abstract)
定义:抽象就是从多个事物中将共性的、本质的内容抽取出来。
抽象类:Java 中可以定义没有方法体的方法,该方法的具体实现由子类完成,该方法称为抽象方法,包含抽象方法的类就是抽象类。
3.1 abstract 不能共存的关键字
1).不能和final共存
abstract修饰的类就是为了让子类继承,abstract修饰的方法就是为了让子类重写;
final修饰的类时不可以被继承的,final修饰的方法不可以被重写;
2).不能与private共存
abstract修饰的类就是为了让子类继承父类的方法,如果函数私有了子类将无法直接访问,就覆盖不了了!
3).不能与static共存
static不需要对象,类既可以调用抽象方法,调用抽象方法没有意义。
3.2 重载和重写的区别
1)重载特点:
** 在同一类中;
** 方法名相同,参数列表不同;
2)重写的特点:
** 要有继承的关系,在子父类中;
**方法的声明相同(方法名、参数列表、返回值类型要相同);
**子类方法的权限一定要大于等于父类方法权限;
**静态只能覆盖静态;
4.接口 implements实现
interface Inter {
int num = 0; //num为常量,默认被 public static final 修饰
void show(); //show 方法默认有public abstract 修饰;
}
在jdk1.8之前接口不能定义非抽象方法。
如果成员变量什么也没加,系统会加上: public static final
一个类可实现多个接口,因为接口中的方法都是抽象的,没有方法体,
子类去重写不存在安全隐患,打破了单继承的局限性。
4.1 接口定义:是抽象方法和常量值的集合。
接口和接口之间是 extends 关系,一个接口继承另一个接口会拿到它里面的所有的成员。
接口里面定义的是扩展功能,类和抽象类定义的是这个体系的共性功能。
4.2 接口的特点:
1)接口是对外暴露的规则;
2)是程序功能的扩展;
3)降低耦合性;
4)可以用来多实现;
5)多个无关类可以实现同一个接口;
6)一个类可以实现多个无关接口;
7)接口与实现类之间存在多态;
4.3 接口和抽象类的区别:
共性:都是不断抽取出来的抽象概念;
区别:
1)抽象类体现继承关系,一个类只能单继承;
接口体现是实现关系,一个类可以多实现;
2)抽象是继承,接口是实现;
3)抽象类定义基本共性功能;接口定义对象扩展功能;
4)抽象类可以定义非抽象方法供子类使用;接口的方法都是抽象的,接口中的成员都有固定的修饰符 public static final
5. 多态 (polymorphic)
5.1 定义:一类事物存在的多种形态。
5.2实现多态满足条件:
1)父类引用指向了子类对象,动态绑定;
2)要有继承或则实现;
3)要有重写;
如:Animal a = new Cat();
动态绑定:
是指在执行期间判断引用对象的实际类型,根据实际类型调用相应的方法;
多态好处:提高了程序的扩展性;
多态弊端:不能访问子类特有的;
Animal a = new Cat(); //类型提升,向上转型;
a.eat();
Cat cat = (cat)a; //调用特有方法,强制将父类的引用转成子类类型;
cat.catchMouse();
多态自始至终都是子类对象在做着变化。
instanceof //判断对象是否属于该类型
if( a instanceof Cat) //instanceof前面是一个类型的引用,判断前面面的类型引用是不是后面的数据类型;
多态调用:只有非静态的成员方法,在编译的时候看左边,运行的时候看右边;
其他的都是编译看左边,运行看左边;

抱歉!评论已关闭.