Java面向对象思想精华——总结


前言

设计规则:一般的设计规则大概内容如下:

  1. 将所有派生类(子类)共有的属性和行为抽到超类中---------------抽共性。
  2. 所有派生类(子类)的行为一样,设计为普通方法,所有派生类的行为都不一样,设计为抽象方法。
  3. 将部分派生类(子类)共有的行为,抽到接口中,接口时对继承的单根性的拓展----------------实现多继承。

面向对象三大特性:封装、继承、多态

一、封装

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.一个类只能继承一个抽象类,而一个类可以实现多个接口。


六、内存管理

  1. 堆:
    • 存储 new 出来的对象(包括实例变量);
    • 垃圾:没有任何引用所指向的对象。
      垃圾回收器(GC)不定时到内存堆中清扫垃圾,回收过程是看不见的,并不一定发现垃圾就立刻回收,通过调用 System.gc() 可以建议 JVM 调度 GC 来回收。
    • 内存泄漏:不再使用的内存还没有被及时回收。
      建议:不再使用的对象及时将引用设置为 null。
    • 实例变量在声明周期:创建对象时存储在堆中,对象被回收时一并被回收。
  2. 栈:
    • 存储正在调用的方法中的局部变量(包括方法的参数)。
    • 调用方法时为该方法在栈中分配一块对应的栈帧,栈帧中存储方法中的局部变量(包括方法的参数),方法执行结束后,栈帧被清除,局部变量一并被清除。
    • 局部变量的生命周期:调用方法时存储栈中,方法结束与栈帧一并被清除。
  3. 方法区:
    • 存储 .class 字节码文件(包括静态变量、方法)。
    • 方法只有一份,通过 this 来区分具体的调用对象。

总结

面向对象三大特征:

  • 封装:
    • 类:封装的是对象的属性和行为;
    • 方法:封装一段特定的业务逻辑功能;
    • 访问控制修饰符:封装的是具体的访问权限;
  • 继承:
    • 作用:代码复用;
    • 超类:所有派生类所共有的属性和行为;
      • 接口:部分派生类所共有的行为。
      • 派生类:派生类所特有的属性和行为。
    • 传递性,单一继承、多接口实现;
  • 多态:
    • 意义:
      1.行为的多态:所有抽象方法都是多态的;
      2.对象的多态:所有对象都是多态的;
    • 向上造型、强制类型转换、instanceof判断;
    • 多态的表现形式:
      • 重写:根据对象的不同来表现多态。
      • 重载:根据参数的不同来表现多态。

Java面向对象介绍到这啦。
后续不断写写更多知识,让读者学起来不迷茫!
写作不易请点个赞3Q。若有错误之处,请各位点评下。


所有章节目录在此处:https://blog.csdn.net/qq_41254299/article/details/106638651
转载请注明出处:https://blog.csdn.net/qq_41254299
本文出自【Superclover_的博客】

猜你喜欢

转载自blog.csdn.net/qq_41254299/article/details/108033205