Java中OOP的概念及示例
在本指南中,您将学习Java中的OOP概念。面向对象编程系统(OOP)是一种基于“对象”的编程概念。面向对象编程的主要目的是提高程序的可读性、灵活性和可维护性。
面向对象编程将数据及其行为集中在一个称为对象的实体中。它使编程更容易理解。我们将详细介绍OOP的所有特性,如继承、多态、抽象、封装,这样您就不会在理解Java中的OOP时遇到任何困难。
支持面向对象编程的流行编程语言有:Java、C++、Python、C#、Perl、JavaScript、Ruby、Smalltalk等。
Java中的OOP概念是什么
OOP概念包括以下面向对象编程概念:
- 对象
- class 类
- 抽象
- 封装
- 继承
- 多态性
1.对象
对象可以表示为具有状态和行为的实体。例如:汽车是一个具有颜色、型号、价格等状态和速度、启动、换档、停车等行为的物体。
Java中OOP的概念-对象类
让我们来理解状态和行为之间的区别。对象的状态是一个数据项,可以用汽车价格、颜色等值来表示,将它们视为编程中的变量。行为就像类的一个方法,是一组可以一起执行任务的操作。例如,换档是一种行为,因为它涉及多个子任务,如速度控制、离合器、档把移动。
让我们再举几个对象的例子:
状态和行为示例
示例1:
类别:房屋
状态:地址、颜色、区域
行为:开门、关门
让我们看看如何在java程序中编写这些状态和行为。状态可以表示为实例变量,行为可以表示为类的方法。
class House { String address; String color; double area; void openDoor() { //Write code here } void closeDoor() { //Write code here } ... ... }
示例2:
类别:汽车
状态:颜色、品牌、重量、型号
行为:刹车、加速、减速、换挡。
注意:正如我们在上面的例子中看到的,对象的状态和行为可以用类中的变量和方法来表示。
类可以被视为蓝图,您可以使用它来创建任意多的对象。例如,这里我们有一个类Website,它有两个数据成员。这只是一个蓝图,它不代表任何网站,但是使用它我们可以创建代表网站的网站对象。我们创建了两个对象,在创建对象时,我们使用构造函数为对象提供了单独的属性。
public class Website { //fields (or instance variable) String webName; int webAge; // constructor Website(String name, int age){ this.webName = name; this.webAge = age; } public static void main(String args[]){ //Creating objects Website obj1 = new Website("beginnersbook", 11); Website obj2 = new Website("google", 28); //Accessing object data through reference System.out.println(obj1.webName+" "+obj1.webAge); System.out.println(obj2.webName+" "+obj2.webAge); } }
public class hello {
String name;
int age;
hello(String webname,int webage){
this.age =webage;
this.name=webname;
}
public static void main(String args[]){
// Creating instance of JFrame
hello obj1 = new hello("beginnersbook", 11);
hello obj2 = new hello("google", 28);
//Accessing object data through reference
System.out.println(obj1.name+" "+obj1.age);
System.out.println(obj2.name+" "+obj2.age);
}
}
3.摘要
抽象是一个只显示“相关”数据并向用户“隐藏”对象不必要细节的过程。例如,当您在线登录到您的银行账户时,输入您的user_id和密码并按login,按login时会发生什么,输入数据如何发送到服务器,以及如何验证,这些都是从您身上抽象出来的。在这里关于它的信息:Java中的抽象。
抽象类示例:
在这里,我们有一个抽象类Animal,它具有一个抽象方法animalSound(),由于动物的声音因动物而异,因此没有必要为该方法提供实现,因为每个子类都必须覆盖该方法以提供自己的实现详细信息。这就是我们把它抽象化的原因。
现在每个动物都必须有一个声音,通过使这个方法抽象化,我们强制要求子类提供这个方法的实现细节。通过这种方式,我们确保每只动物都有声音。
abstract class Animal{ //abstract method public abstract void animalSound(); } public class Dog extends Animal{ public void animalSound(){ System.out.println("Woof"); } public static void main(String args[]){ Animal obj = new Dog(); obj.animalSound(); } }
4.封装
封装只是指将对象状态(字段)和行为(方法)绑定在一起。如果您正在创建类,那么您正在进行封装。
实例
1) 将实例变量设为私有变量,这样就不能从类外部直接访问它们。只能通过类的方法设置和获取这些变量的值。
2) 在类中使用getter和setter方法来设置和获取字段的值。
class EmployeeCount
{
private int numOfEmployees = 0;
public void setNoOfEmployees (int count)
{
numOfEmployees = count;
}
public double getNoOfEmployees ()
{
return numOfEmployees;
}
}
public class EncapsulationExample
{
public static void main(String args[])
{
EmployeeCount obj = new EmployeeCount ();
obj.setNoOfEmployees(5613);
System.out.println("No Of Employees: "+(int)obj.getNoOfEmployees());
}
}
使用EmployeeCount类的Object的类EncapsulationExample将无法直接获取NoOfEmployees。它必须使用同一类的setter和getter方法来设置和获取值。
在java编程中使用封装的好处是什么?
好吧,在某个时候,如果你想更改EmployeeCount类的实现细节,你可以自由地这样做,而不会影响使用它的类。
package helloword;
public class hello{
public static void main(String args[]){
EmployeeCount obj = new EmployeeCount ();
obj.setNoOfEmployees(5613);
System.out.println("No Of Employees: "+(int)obj.getNoOfEmployees());
}
}
class EmployeeCount
{
private int numOfEmployees = 0;
public void setNoOfEmployees (int count)
{
numOfEmployees = count;
}
public double getNoOfEmployees ()
{
return numOfEmployees;
}
}
使用EmployeeCount类的Object的类EncapsulationExample将无法直接获取NoOfEmployees。它必须使用同一类的setter和getter方法来设置和获取值。
在java编程中使用封装的好处是什么?
好吧,在某个时候,如果你想更改EmployeeCount类的实现细节,你可以自由地这样做,而不会影响使用它的类。
5.继承
一个类获取另一个类的属性和功能的过程称为继承。继承提供了代码可重用性的思想,每个子类只定义那些对它唯一的特性,其余的特性可以从父类继承。
继承是在现有类的基础上通过扩展其公共数据成员和方法来定义新类的过程。继承允许我们重用代码,它提高了java应用程序的可重用性。父类称为基类或超类。扩展基类的子类称为派生类、子类或子类。注意:继承的最大优点是基类中的代码不需要在子类中重写。基类的变量和方法也可以在子类中使用。
语法:Java中的继承
为了继承类,我们使用extends关键字。这里A班是儿童班,B班是家长班。
class A extends B { }
泛化和专业化:
为了在面向对象程序中实现继承的概念,必须首先识别不同类之间的相似性,从而得出基类。
这种识别不同类之间相似性的过程被称为泛化。泛化是从两个或多个类中提取共享特征,并将它们组合成广义超类的过程。共享特征可以是属性或方法。
与一般化相反,专门化意味着从现有类中创建新的子类。如果某些属性或方法只适用于类的某些对象,则可以创建子类。
继承示例
在这个例子中,我们有一个家长班的老师和一个孩子班的数学老师。在MathTeacher课堂上,我们不需要编写与当前课堂上已经存在的代码相同的代码。这里我们有所有教师通用的学院名称、名称和does()方法,因此MathTeacher类不需要编写此代码,通用的数据成员和方法可以从Teacher类别继承。
class Teacher { String designation = "Teacher"; String college = "Beginnersbook"; void does(){ System.out.println("Teaching"); } } public class MathTeacher extends Teacher{ String mainSubject = "Maths"; public static void main(String args[]){ MathTeacher obj = new MathTeacher(); System.out.println(obj.college); System.out.println(obj.designation); System.out.println(obj.mainSubject); obj.does(); } }
注意:Java中允许多级继承,但不允许多重继承,如下图所示。
继承类型:
单一继承:指的是一个类扩展另一个类的子类和父类关系。
多级继承:是指一个类扩展子类的子类和父类关系。例如,类A扩展类B,类B扩展类C。
层次继承:是指父类和子类的关系,其中多个类扩展了同一个类。例如,类B扩展类A,类C扩展类A。
多重继承:是指一个类扩展多个类的概念,这意味着一个子类有两个父类。Java不支持多重继承,请点击此处了解更多信息。
大多数新的OO语言,如Small Talk、Java、C#,都不支持多重继承。C++支持多重继承。
6.多态性
多态性是一种面向对象的编程特性,它允许我们以不同的方式执行单个操作。例如,假设我们有一个类Animal,它有一个方法animalSound(),这里我们不能实现这个方法,因为我们不知道哪个Animal类会扩展Animal类别。因此,我们将此方法抽象为: