JAVA面向对象编程自学指南

74 阅读6分钟

摘要:
本文为你提供了一个全面的JAVA面向对象编程自学指南。通过本文,你将了解JAVA面向对象的基本概念、特性、以及如何在实际开发中应用这些知识。文中包含大量的代码实例,以便你更好地理解相关概念。

一、什么是面向对象编程?
面向对象编程(OOP)是一种编程范式,它使用“对象”来设计软件和应用程序。在OOP中,对象是数据和与之相关的操作的集合。主要的面向对象编程概念包括:类、对象、封装、继承和多态。

二、JAVA与面向对象编程
JAVA是一种完全支持面向对象编程的语言。它提供了丰富的类库和工具,使开发人员能够利用面向对象的方法来设计和构建软件。

三、基础概念

  1. 类(Class) : 类是对象的模板或蓝图。它定义了对象的属性和方法。例如:
java复制代码
	public class Dog {  

	    String breed;  

	    int age;  

	      

	    void bark() {  

	        System.out.println("The dog barks.");  

	    }  

	}

解释:这里定义了一个名为Dog的类,它有两个属性(breed和age)和一个方法(bark)。
2. 对象(Object) : 对象是类的实例。例如,我们可以创建一个Dog类的对象:

java复制代码
	Dog myDog = new Dog(); // 创建一个新的Dog对象
  1. 封装(Encapsulation) : 封装是将数据(属性)和对数据执行的操作(方法)结合到一个类中的过程。封装有助于隐藏对象的内部状态,并确保通过对象的方法来访问和修改这些状态。
  2. 继承(Inheritance) : 继承是从基类派生新类的一种方式。新类(子类)继承了基类(父类)的属性和方法,并且可以添加或覆盖它们。例如:
java复制代码
	public class Animal {  

	    String name;  

	      

	    void eat() {  

	        System.out.println("The animal eats.");  

	    }  

	}  

	   

	public class Dog extends Animal { } // Dog类继承了Animal类
  1. 多态(Polymorphism) : 多态是指允许子类重新定义和实现父类的方法,从而在运行时根据对象的实际类型来执行相应的方法。例如:
java复制代码
	Animal myAnimal = new Animal(); // Animal类型引用指向Animal对象  

	Animal anotherAnimal = new Dog(); // Animal类型引用指向Dog对象,但实际是Dog类型

在上面的例子中,虽然引用类型是Animal,但实际的对象可能是Dog或其他子类。在运行时,将根据对象的实际类型来调用相应的方法。

四、实践应用
为了更好地理解这些概念,让我们通过一个简单的JAVA程序来演示它们的应用:

  1. 创建一个Person类:
java复制代码
	public class Person {  

	    String name;  

	    int age;  

	      

	    void introduce() {  

	        System.out.println("My name is " + name + " and I am " + age + " years old.");  

	    }  

	}
  1. 创建一个Student类,继承自Person类:
java复制代码
	public class Student extends Person {  

	    String studentId;  

	    String major;  

	      

	    void displayStudentDetails() {  

	        System.out.println("Student ID: " + studentId + ", Major: " + major);  

	    }  

	}
  1. 在主程序中使用这些类:
java复制代码
	public class Main {  

	    public static void main(String[] args) {  

	        Person person = new Person(); // 创建一个Person对象  

	        person.name = "John"; // 设置Person对象的name属性值  

	        person.age = 25; // 设置Person对象的age属性值  

	        person.introduce(); // 调用Person对象的introduce方法来输出介绍信息  

	        System.out.println("----------------"); // 分隔线,使输出更清晰可见  

	        Student student = new Student(); // 创建一个Student对象,继承自Person类  

	        student.name = "Alice"; // 设置Student对象的name属性值,继承自Person类中的name属性  

	        student.age = 22; // 设置Student对象的age属性值,继承自Person类中的age属性值设置Student对象的studentId和major属性值并调用displayStudentDetails方法来输出学生详细信息;Student对象也有自己的introduce方法,会覆盖父类Person中的introduce方法,输出自己的介绍信息;调用displayStudentDetails方法来输出学生详细信息;

四、封装和继承的补充

封装(Encapsulation) :

封装是面向对象编程中的一个重要概念,它涉及将数据(属性)和对数据执行的操作(方法)结合到一个类中。通过封装,我们可以隐藏对象的内部状态,并确保只能通过对象的方法来访问和修改这些状态。这有助于保护数据不被外部代码随意修改,提高了数据的安全性和软件的可维护性。

在JAVA中,我们可以使用访问修饰符(如private、protected和public)来控制属性的访问权限。默认情况下,如果一个属性没有指定访问修饰符,它将是包级别的访问,即只能在同一个包中的其他类中访问。通过将属性设置为private,我们可以确保它们不会被外部代码直接访问,而只能通过公有的方法(称为getters和setters)来获取和修改它们的值。

以下是一个示例,展示了如何使用封装来保护一个类的内部状态:

java复制代码
	public class Person {  

	    private String name; // 私有属性,无法直接访问  

	    private int age; // 另一个私有属性  

	      

	    public String getName() { // 公有的getter方法,用于获取name属性的值  

	        return name;  

	    }  

	      

	    public void setName(String name) { // 公有的setter方法,用于设置name属性的值  

	        this.name = name;  

	    }  

	      

	    public int getAge() { // 另一个公有的getter方法,用于获取age属性的值  

	        return age;  

	    }  

	      

	    public void setAge(int age) { // 公有的setter方法,用于设置age属性的值  

	        if (age >= 0) { // 添加条件判断,确保age属性不会被设置为负数  

	            this.age = age;  

	        } else {  

	            System.out.println("Age cannot be negative.");  

	        }  

	    }  

	}

在上面的示例中,Person类中的name和age属性都是私有的,这意味着它们不能被外部代码直接访问。我们通过公有的getter和setter方法来提供对它们的访问和修改。这确保了外部代码只能通过指定的方法来操作这些属性,从而保护了内部状态的完整性。同时,我们还使用setter方法中的条件判断来确保age属性不会被设置为负数,提高了代码的健壮性。

继承(Inheritance) :

继承是从基类派生新类的一种方式。通过继承,我们可以创建一个与现有类相似的新的类,并可以添加或覆盖其属性和方法。继承允许我们构建一个层次结构,其中更具体的类(子类)继承了更一般的类(父类)的属性和方法。这有助于代码的重用和软件的模块化。

在JAVA中,我们使用关键字extends来创建继承关系。子类可以继承父类的所有属性和方法,并且可以添加自己的属性和方法或覆盖父类的方法。默认情况下,继承的属性是隐式的公有(public),而方法则是隐式的公有(public)。我们可以使用访问修饰符来修改这些默认行为。子类可以继承父类的构造函数。如果我们没有在子类中显式定义构造函数,则将自动调用父类的构造函数。如果我们定义了自己的构造函数,则必须显式地调用父类的构造函数。以下是一个示例:

java复制代码
	public class Animal {  

	    String name;  

	    int age;  

	      

	    public Animal(String name, int age) { // 公有构造函数  

	        this.name = name;  

	        this.age = age;  

	    }  

	      

	    public void eat() { // 公有方法  

	        System.out.println("The animal eats.");  

	    }  

	}  

	   

	public class Dog extends Animal { // Dog类继承了Animal类  

	    String breed; // 添加自己的属性  

	      

	    public Dog(String name, int age, String breed) { // 调用父类的构造函数并添加自己的参数  

	        super(name, age); // 调用父类的构造函数设置name和age属性值  

	        this.breed = breed; // 设置自己的breed属性值  

	    }  

	}