一、面向对象之继承
特点:
1、支持单继承
class SubDemo extends Demo{} //ok
class SubDemo extends Demo1,Demo2...//error
2、支持多成继承(继承体系)
class A{}
• class B extends A{}
• class C extends B{}
定义继承需要注意:
不要仅为了获取其他类中某个功能而去继承类与类之间要有所属( " is a " )关系,xx1是xx2的一种。
&& super关键字:
super和this的用法相同 this代表本类应用 super代表父类引用当子父类出现同名成员时,可以用super进行区分子类要调用父类构造函数时,可以使用super语句。(必须放在第一行)
父类中的私有方法不可以被覆盖。在子类覆盖方法中,继续使用被覆盖的方法可以通过super.函数名获取。
&& 函数覆盖:
子类中出现与父类一模一样的方法时,会出现覆盖操作,也称为重写或者复写
父类中的私有方法不可以被覆盖。在子类覆盖方法中,继续使用被覆盖的方法可以通过super.函数名获取。
覆盖注意事项:
覆盖时,子类方法权限一定要大于等于父类方法权限(从private到default不算是覆写) 子类与父类同名属性也会出现覆盖静态只能覆盖静态。
覆盖的应用:
当子类需要父类的功能,而功能主体子类有自己特有内容时,可以复写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容。
&& final关键字:
final可以修饰类,方法,变量。 final修饰的类不可以被继承。 final修饰的方法不可以被覆盖。 final修饰的变量是一个常量。只能被赋值一次。 内部类只能访问被final修饰的局部变量。
&& 抽象类:(Java中可以定义没有方法体的方法,该方法的具体实现由子类完成,该方法称为抽象方法,包含抽象方法的类就是抽象类。)
抽象就是从多个事物中将共性的,本质的内容抽取出来。
例如:狼和狗共性都是犬科,犬科就是抽象出来的概念。
1、抽象类和抽象方法必须用abstract关键字来修饰
2、抽象方法只有方法声明,没有方法体,定义在抽象类中
3、抽象类不可以被实例化,也就是不可以用new创建对象
4、抽象类通过其子类实例化,而子类需要覆盖掉抽象类中所有的抽象方法后才可以创建对象,否则该子类也是抽象类
5、抽象类中有构造函数,抽象关键字abstract不可以和final关键字共存,抽象类中可以没有抽象方法。
抽象类和普通类比较,除了多了一个抽象方法之外和不能实例之外没有什么不同
&& 接口:
格式:
interface {}
1、接口中的成员修饰符是固定的可以不写
2、接口的最大特点是可以多实现。
3、接口是一个标准
4、接口是程序的功能扩展
类、接口之间的关系:
类与接口之间是实现关系,而且类可以继承一个类的同时实现多个接口。
接口与接口之间可以有多继承关系。
类可以同时继承抽象类和接口
二、面向对象之多态
体现:
父类或者接口的引用指向或者接收自己的子类对象。作用: 多态的存在提高了程序的扩展性和后期可维护性前提: • 需要存在继承或者实现关系 • 要有覆盖操作
成员函数: • 编译时:要查看引用变量所属的类中是否有所 调用的成员。
•在运行时:要查看对象所属的类中是否有所调 用的成员。
成员变量: • 只看引用变量所属的类
抽象类和接口的区别:
1、抽象类是一个模板2、接口是一个标准
设计模式:
1、工厂设计模式3、适配器设计
例:
class Factory//工厂类
{
public static Fruit get(String name)
{
Fruit f = null;
if("苹果".equals(name))
{
f = new Apple();
}
if("橘子".equals(name))
{
f = new Orange();
}
return f;
}
}
class ProxyCl implements Net//代理类,代理类可以实现更多的辅助功能
{
private Net net;
public ProxyCl(Net net)
{
this.net = net;
}
public boolean check()
{
boolean inf = true;
return inf;
}
public void browse()
{
this.check();
this.net.browse();
}
}
适配器:在继承接口时,就必须全部实现接口中的方法,这样很多用不到的也要实现很麻烦,所有就有适配类的出现,即用一个抽象类并用抽象类里的空方法体来实现接口中的所有方法,然后从这个抽象类中继承,就可以有选择的实现相关方法
内部类:
将一个类定义在另一个类的里面,对里面那个类就称为内部类
特点:
• 内部类可以直接访问外部类中的成员,包括私有成
员。
• 而外部类要访问内部类中的成员必须要建立内部类
的对象。
class InnerDemo
{
public static void main(String[] args)
{
new Outer().getInner().print();
}
}
class Outer
{
private String name = "haoren";
class Inner
{
public void print(){
System.out.println(name);
}
}
public Inner getInner(){
Inner in = new Inner();
return in;
}
}
在外部访问内部类:
Outer outer = new Outer();
Outer.Inner in = outer.new Inner();
in.print();
使用static定义内部类:
class InnerDemo
{
public static void main(String[] args)
{
//new Outer().getInner().print();
new Outer.Inner().print();
}
}
class Outer
{
private static String name = "haoren";
static class Inner
{
public void print(){
System.out.println(name);
}
}
}