继承(extends“扩展”):继承是对某一批类的抽象,对实际问题更好的建模,提高代码的复用性子类继承父类,可以得到父类的全部属性和方法(除了父类的构造方法);Java中类只有单继承。定义一个类时,没有调用extends,系统默认父类:java.lang.Object(根类)。
super关键字:是直接父类对象的引用。所有类的构造器(除Object类之外)中第一句都是系统默认的super();自己加不加它都存在。子类、父类、父类的父类...即根类的代码信息等均存放在方法区。由于系统默认的super()的作用,通过子类构造器new出来的放置在堆中的对象由于构造器中第一句super()的作用,一级一级等待直接父类的响应,所以实际情况如下图所示:
方法的重写(override)在子类中可以根据需要从基类中继承来的方法进行重写。重写方法必须与被重写方法具有相同方法名称、参数列表和返回类型。也就是说对相同的参数有子类自己独有的处理方法,返回类型相同结果不同的值。
由于重写的原因,上图中子类对象和父类对象中可能存在相同名称的方法,由对象名称直接调用该方法时,由于该对象名指向子类对象,所以运行出来的是子类中被重写的方法对应的结果,子类中未重写的方法即继承父类的普通属性方法要是被调用,编译器找完子类后就忘父类对象中寻找,然后找到该方法,运行出结果。
组合:不再通过extends 父类名来继承父类的属性与方法,组合是将父类作为一个属性定义在子类中,具体定义方式为:父类名 属性名称=new 父类名();此时不存在父类与子类的继承关系,而是将想要利用的原类作为属性放在新类中。 也就是说假设父类中存在方法xx(),要调用该方法属性名.xx()和子类名.属性名.xx()均可调用,组合模式中没有父类子类之分,已经当做子类中的一种属性在使用。
继承与组合:XX是XX,的关系适合用继承;XX有XX的关系则适合用组合。
封装/隐藏(encapsulation)隐藏对象内部的复杂性,只对外公开简单的借口。便于外界调用,从而提高系统的可扩张性、可维护性。封装的类的属性一般使用private(private:私有;只有自己类中可见),一些只用于本类的辅助性方法也用private属性;不过static声明的属性或常量使用public(public:公开,所有类均可见)。对private类,Java提供相应的get/set方法来访问相应的属性(Boolean变量的get方法有is开头)。
多态polymorphism:必要条件:要有继承,要有重写,父类引用指向子类对象(父类名 对象名=new 子类名())。
声明类型为父类的对象a,并不能直接引用子类中独有的而非重写于父类的方法,因为先编译后运行,编译器编译时a为父类类型,会被判定为不能直接调用子类中的其他方法,报错。要想调用子类中独有的方法,需将父类引用强制转型。
编译时类型是父类但实际指向子类对象,所以实际调用时,指向的子类是什么就实际用的是子类的什么方法。即方法的多态。
隐式参数this指向当前对象,也就是说父类与子类的方法中的隐式参数this均指向子类。
例:public class Father(){
---;//n条语句
public void firstWay(){
---;//n条语句
secondWay();//调用了secondWay
}
}
public void secondWay(){
---;//n条语句
}
}
class Son(){
public void secondWay(){
---------;//m条语句,重写方法secondWay()
}
}
这种情况下。main方法中若有Father a=newSon();
a.firstWay();
内存运行分析结果:a中的地址指向子类,但子类没有重写firstWay(),所以再往父类中找,父类中有,运行父类中的firstWay()方法,然后firstWay()中有一句调用secondWay(),上文已经说明,子类父类方法中的隐式参数this均指向子类,所以此时firstWay()中调用的secondWay(this,super)相当于this.secondWay(),而this则指向的最外部的子类,所以接着运行的是子类中被改写的secondWay()方法,而非父类中原来的secondWay()。
抽象类abstract
public abstract class 类名(){
-----;//普通属性方法、构造方法
public abstract void 方法名();//抽象方法
}
——包含了抽象方法(抽象方法:只有方法声明,没有方法体。其意义在于:将方法的设计与方法的实现分离)的类。抽象类不能被实例化,及不能用new来实例化对象。抽象类中仍可以定义属性和普通方法、构造方法。抽象类只能用来被继承。其子类必须重写父类的抽象方法。
接口:比抽象更“抽象”。接口定义出的是一种规则xx能干xx,而具体的怎么干,则在实现它的类中来完成。
接口的定义,格式
[修饰符] interface 接口名 [extends 父接口1,父接口2...]
-常量定义 //总是public static final
-方法定义 //总是public abstract
public interface InterfaceA(){
void first();
}
interface InterfaceB(){
void second();
}
interface InterfaceC extends InterfaceA,InterfaceB (){
void third();
}
class TextInterface implements InterfaceC(){
public void first(){
-----;//n条语句
}
public void second(){
-----;//n条语句
}
public void first(){
-----;//n条语句
}
-----------;//n条语句
}
由上例可以看出接口的基本使用要求:子类通过implements来实现接口的规范。接口支持多继承,即他的父接口可以有多个同时列出。一个类实现了接口,必须实现接口中的所有方法。接口不能创建实例,但是可以用于声明引用变量的类型;类比多态。例:main方法中可写作InterfaceCa=new TextInterface();
本文深入探讨了Java中的继承、多态、抽象类、接口等核心概念,讲解了它们的使用方法及其重要性,包括如何实现代码复用、封装、隐藏等特性。
2105

被折叠的 条评论
为什么被折叠?



