面向对象(Object-Oriented)是一种编程范式,它将程序设计看作是一组对象的集合,每个对象都有自己的属性和行为,并且能够相互通信和交互。面向对象编程(OOP)是一种强大而灵活的编程方法,它将现实世界的概念映射到程序,思想:代码复用性好,扩展性好,维护性好,代码冗余低设计中,使得代码更加模块化、可维护和易扩展。
1.创建类
类中包含:
静态的【属性,成员变量】
动态的【行为,成员方法】
修饰词 class 类名 { //属性信息 //行为信息 } //学生类 public class Student{ //属性信息 String name; int age; //行为信息 public viod study(){ System.out.println("在学习...."); } }
2.使用类创建对象
类型【类名】 引用名称 = new 类名([参数]); //对象 Student student = new Student();
3.通过对象访问类中的成员
属性:对象.属性名;
对属性进行赋值: 对象.属性名=值;
行为:对象.方法名();
student.name; student.name = "zs"; student.study();
4.封装
封装是面向对象编程的一种重要特性,它是指将类的数据(属性、成员变量)和操作(方法、行为)组合成一个单一的单元,从而隐藏了实现细节,使得外部只能通过公共接口访问对象的数据和行为。在封装中,类内部的实现细节对外部是不可见的,而只有暴露的公共接口可以被访问。
1.实现封装的方式
使用访问修饰符
Java中的访问修饰符(public、private、protected等)可以控制成员变量和方法的访问权限。通常将成员变量声明为私有(private),并提供公共的访问方法(get和set)来访问和修改数据。
提供公共接口
类应该定义一组公共的方法作为外部访问点,这些方法对外暴露类的功能。私有的实现细节应该隐藏在类的内部。
数据封装
将相关的数据和行为打包在一个类中,使得数据和行为紧密联系在一起,同时封装数据的改变可能导致的行为变化。
示例代码:
public class Student{ private String name; private int age; //get,set方法 public String getName(){ return name; } public void setName(String name) { this.name= name; } public int getAge(){ return age; } public void setAge(int age) { this.age = age; } public Student(String name, int age) { this.name = name; this.age = age; } //行为 public void displayInfo() { System.out.println("Name: " + name); System.out.println("Age: " + age); } public static void main(String[] args) { //创建对象 Student student = new Student("John", 20); // 使用get访问数据 System.out.println("Name: " + student.getName()); System.out.println("Age: " + student.getAge()); // 使用set修改数据 student.setAge(21); //调用方法 student.displayInfo(); } }
2.优势
数据保护和安全性
通过封装,数据被隐藏在类的内部,不会被外部直接访问或修改。这种保护机制确保了数据的安全性,防止了意外或恶意的数据篡改。只有通过类的公共方法才能访问和修改数据,从而控制了数据的访问权限。
代码模块化
封装使得代码可以以模块化的方式组织。每个类都是一个独立的单元,负责处理自己的数据和行为。这种模块化使得代码更易于理解和维护,降低了代码的复杂性。
代码重用
封装提供了接口来访问类的功能,其他代码可以直接使用这些接口而不需要了解类的内部实现。这种高度抽象的接口使得代码的重用更加容易,减少了代码的冗余。
系统扩展性
通过封装,类的内部实现可以随时更改,而不会影响到外部代码。只要保持类的公共接口不变,其他代码不需要修改,从而提高了系统的扩展性和灵活性。
5.继承
继承是面向对象编程中的一个重要特性,它允许一个类(子类)从另一个类(父类)那里继承属性和方法。子类拥有父类的所有公共属性和方法,并且可以在此基础上添加新的属性和方法。通过继承,子类可以重用父类的代码,避免重复编写相同的功能。
1.实现继承的方式
关键字extends
Java和许多其他面向对象编程语言使用关键字extends
来实现继承。子类通过extends
关键字指定父类,从而继承父类的属性和方法。
单继承
Java中,一个类只能继承一个父类,这称为单继承。这样的设计避免了多重继承可能引发的歧义和复杂性。
多层继承
子类可以作为其他类的父类,形成多层继承关系。这种多层继承使得类的层次结构更加丰富。
示例代码:
// 父类Animal public class Animal { public void sound() { System.out.println("动物发出声音"); } } // 子类Dog继承自Animal public class Dog extends Animal { @Override//重写方法标志 public void sound() { System.out.println("汪汪汪"); } public void wagTail() { System.out.println("摇尾巴"); } } public class Main { public static void main(String[] args) { Dog dog = new Dog(); // 调用继承自父类的方法 dog.sound(); // 调用子类自己添加的方法 dog.wagTail(); } }
2.优势
代码复用
继承允许子类重用父类的代码,避免了重复编写相同功能的情况。子类可以直接使用父类的方法和属性,从而提高了代码的重用性和可维护性。
类层次的建立
通过继承,可以建立类的层次结构。在这种层次结构中,可以将共同特征的类归为同一个父类,形成一个类的层次结构。这种层次结构使得代码的组织更加清晰,提高了代码的可读性。
可扩展性
继承允许在现有类的基础上创建新的子类,可以在子类中添加新的属性和方法,从而实现类的扩展。这种可扩展性使得程序更加灵活,能够应对未来的需求变化。
6.多态
多态是指通过一个统一的接口来访问一组不同的对象。在多态中,子类可以在不改变父类接口的情况下,重写父类的方法,从而实现了不同的行为。多态允许我们将对象视为其父类类型,而在运行时根据实际对象类型来调用相应的方法。
1.实现多态的方式
方法重写
子类可以重写父类的方法,从而改变父类方法的行为。在运行时,会根据实际对象的类型来调用对应的方法。
父类引用指向子类对象
父类的引用可以指向子类的对象。通过父类引用,我们可以使用父类的方法,但在运行时实际上会调用子类的方法。
代码示例:
// 父类Animal public class Animal { void sound() { System.out.println("动物发出声音"); } } // 子类Dog继承自Animal public class Dog extends Animal { @Override void sound() { System.out.println("汪汪汪"); } } // 子类Cat继承自Animal public class Cat extends Animal { @Override void sound() { System.out.println("喵喵喵"); } } public class Main { public static void main(String[] args) { Animal dog = new Dog(); Animal cat = new Cat(); // 调用重写后的方法 dog.sound(); cat.sound(); } }
2.优势
代码灵活性
多态允许我们在运行时决定调用哪个方法,从而使代码更加灵活和适应不同的场景。通过多态,我们可以使用一个通用的接口来处理不同的对象,无需关心具体的对象类型。
代码可扩展性
多态使得代码更易于扩展和维护。当需要增加新的子类时,我们只需要添加新的子类并重写父类的方法,而无需修改现有代码。
代码可读性
多态可以使代码更加简洁和易读。通过使用统一的接口,我们可以隐藏对象的具体实现细节,从而使代码更加简洁和易于理解。
7.总结
面向对象编程的核心思想是将现实世界的实体映射到代码中,通过封装、继承和多态等特性实现代码的组织、重用和灵活性。合理地应用面向对象编程,可以提高代码的安全性、可读性和可维护性,是编写优秀、健壮的软件系统的关键要素。在实际开发中,熟练运用面向对象编程的原则和技巧,可以极大地提高开发效率和代码质量。