前言
设计规则:一般的设计规则大概内容如下:
- 将所有派生类(子类)共有的属性和行为抽到超类中---------------抽共性。
- 所有派生类(子类)的行为一样,设计为普通方法,所有派生类的行为都不一样,设计为抽象方法。
- 将部分派生类(子类)共有的行为,抽到接口中,接口时对继承的单根性的拓展----------------实现多继承。
面向对象三大特性:封装、继承、多态
一、封装
1.是指一种将抽象性函数式接口的实现细节部分包装,隐藏起来的方法。
2.要访问该类的代码和数据,必须通过严格的接口控制(属性私有化 private,行为公开化 public)
注意:若属性 private 修饰,同包下其他类需要访问,则要 getters 和 setters 方法(有返回值无参与无返回值有参的方法)
二、继承
1.子类继承父类成员方法,如果在子类中出现同名称的成员方法,则为覆盖,即子类成员方法覆盖掉父类成员方法,要在子类访问父类成员方法用 super().
2.父类的构造器调用以及初始化过程一定在子类的前面
3.继承是从已有的类得到继承信息的创建新的类的过程,把父类的行为或者属性继承过来。
三、多态
不同类的对象对同一消息做出响应,即:同一消息可以根据不同对象做或者采用多种不同的行为方式。(发送消息就是函数调用)
1.实现多态的技术:动态绑定,指在执行期间判断所引用的实际类型,根据其实际的类型调用其相应的方法。
2.作用:消除类型之间的耦合关系。
3.多态存在的三个必要条件:继承,重写,父类引用指向子类对象(向上转型)。
4.当使用多态方式调用方法时,检查父类中是否有该方法,如果没有,则编译错误,如果有,再去调用子类的该同名方法。
注意:静态 static 方法属于特殊情况,静态方法只能继承,不能重写 override,如果子类中定义了同名同形式的静态方法,它对父类方法只是起到隐藏的作用。调用看用谁的引用,则调用谁的版本。
如下代码栗子:
public class A {
int age1=1;
String name1="我是父类";
void show1() {
System.out.println("this is 父类");
}
static void method1(){
System.out.println("我是父类静态方法");
}
}
public class B extends A {
int age2=2;
String name2="我是子类";
String newBianliang = "我是新增成员变量";
void show1() {
System.out.println("this is 子类,我重写了父类的show()方法");
}
void showB_1() {
System.out.println("子类新增的方法");
}
static void method1(){
System.out.println("我是子类静态方法");
}
}
public class App {
public static void main(String[] agrs) {
//上转型对象
A a = new B(); //父类引用指向子类
//能操作继承或隐藏的成员变量,
System.out.println(a.age1);
System.out.println(a.name1);
a.show1();//能调用子类继承或重写的方法
a.method1();
// System.out.println(a.age2);
// System.out.println(a.name2);
// System.out.println(a.newBianliang);
//编译错误,不能操作子类新增的成员变量
//a.showB_1();//编译错误,不能调用子类新增方法
/**
* 上转型对象特点总结:可以操作继承或隐藏成员变量,
* 调用子类继承或重写的方法.
* 不能操作子类的新增成员变量,不能调用子类新增的方法
*/
System.out.println("-----------------");
B b = new B();
System.out.println(b.age2);
System.out.println(b.name2);
a.method1();
}
}
代码结果:
5.如果想要调用子类中有的方法,而父类没有的方法,需要进行强制类型转换,因为当父类的引用指向子类的对象(向上造型),用父类引用调用方法时,找不到父类中不存在的方法,这需要强制类型转换(向下转型)。
如下代码栗子:
//多态的演示
public class Duotai {
public static void main(String[] args) {
Aoo o = new Boo(); //向上造型
Boo o1 = (Boo)o; //o所指向的对象,就是Boo类型
o1.b();
Inter1 o2 = (Inter1)o; //o所指向的对象,实现了Inter1接口
o2.a();
//Coo o3 = (Coo)o; //ClassCastException类型转换异常
Aoo dd = new Coo();
Coo o4 = (Coo)dd;
o4.a();
}
}
interface Inter1{
public void a();
}
class Aoo{
}
class Boo extends Aoo implements Inter1{
public void a() {
System.out.println("实现Inter的方法");
}
public void b() {
System.out.println("引用所指向的对象,就是该类型");
}
}
class Coo extends Aoo {
public void a() {
System.out.println("123");
}
}
//输出结果显示如下:
//所指向的对象,就是该类型
//实现Inter的方法
//123
输出结果:
四、抽象(特殊)
1.将相同的类的共同特征总结出来,构造成类的过程。
----1.1.包括数据抽象以及行为抽象。数据抽象变成类的成员变量,行为抽象变成类的成员函数。
----1.2.抽象只关心成员变量以及成员函数,并不关心具体的实现细节。
五、抽象类与接口的区别
1.抽象类可以提供成员方法的实现细节(抽象类可以没有抽象方法),而接口中只能存在 public abstract 方法。
2.抽象类的成员变量可以是各种类型,接口中成员变量只有 public static final。
3.抽象类可以有静态方法和静态块,接口中不能有(但 JDK 1.8 可以重写)。
4.一个类只能继承一个抽象类,而一个类可以实现多个接口。
六、内存管理
- 堆:
- 存储 new 出来的对象(包括实例变量);
- 垃圾:没有任何引用所指向的对象。
垃圾回收器(GC)不定时到内存堆中清扫垃圾,回收过程是看不见的,并不一定发现垃圾就立刻回收,通过调用 System.gc() 可以建议 JVM 调度 GC 来回收。 - 内存泄漏:不再使用的内存还没有被及时回收。
建议:不再使用的对象及时将引用设置为 null。 - 实例变量在声明周期:创建对象时存储在堆中,对象被回收时一并被回收。
- 栈:
- 存储正在调用的方法中的局部变量(包括方法的参数)。
- 调用方法时为该方法在栈中分配一块对应的栈帧,栈帧中存储方法中的局部变量(包括方法的参数),方法执行结束后,栈帧被清除,局部变量一并被清除。
- 局部变量的生命周期:调用方法时存储栈中,方法结束与栈帧一并被清除。
- 方法区:
- 存储 .class 字节码文件(包括静态变量、方法)。
- 方法只有一份,通过 this 来区分具体的调用对象。
总结
面向对象三大特征:
- 封装:
- 类:封装的是对象的属性和行为;
- 方法:封装一段特定的业务逻辑功能;
- 访问控制修饰符:封装的是具体的访问权限;
- 继承:
- 作用:代码复用;
- 超类:所有派生类所共有的属性和行为;
- 接口:部分派生类所共有的行为。
- 派生类:派生类所特有的属性和行为。
- 传递性,单一继承、多接口实现;
- 多态:
- 意义:
1.行为的多态:所有抽象方法都是多态的;
2.对象的多态:所有对象都是多态的; - 向上造型、强制类型转换、instanceof判断;
- 多态的表现形式:
- 重写:根据对象的不同来表现多态。
- 重载:根据参数的不同来表现多态。
- 意义:
Java面向对象介绍到这啦。
后续不断写写更多知识,让读者学起来不迷茫!
写作不易请点个赞3Q。若有错误之处,请各位点评下。
所有章节目录在此处:https://blog.csdn.net/qq_41254299/article/details/106638651
转载请注明出处:https://blog.csdn.net/qq_41254299
本文出自【Superclover_的博客】