Java 对象和类学习笔记

什么是对象和类

在Java中,一切皆是对象。对象是具有状态(属性)和行为(方法)的实体。而类则是对象的模板或蓝图,它定义了对象的属性和方法。

类的定义

在Java中,我们使用关键字 class 来定义一个类,并通过大括号来包含类的成员变量和方法。下面是一个简单的例子:

javaCopy Code
public class Person { String name; int age; public void eat() { System.out.println("I am eating."); } }

上面的代码定义了一个名为 Person 的类。它有两个成员变量:nameage,以及一个方法 eat()

对象的创建与使用

要创建一个对象,我们需要使用关键字 new 来调用类的构造方法。下面是一个示例:

javaCopy Code
Person p = new Person(); p.name = "张三"; p.age = 20; p.eat();

上面的代码首先创建了一个名为 p 的实例对象,然后给它的属性 nameage 赋值为 "张三"20。最后,调用对象的 eat() 方法。

封装性

在Java中,我们可以使用访问修饰符来控制类的成员变量和方法的访问权限。这样可以保护类的数据,防止外部程序对其进行随意访问和修改。下面是一个示例:

javaCopy Code
public class Person { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { if (age < 0 || age > 150) { throw new IllegalArgumentException("Invalid age"); } this.age = age; } public void eat() { System.out.println("I am eating."); } }

上面的代码中,我们将 nameage 变量声明为私有的,提供了公共的访问器和修改器方法来获得和设置它们的值,并在 setAge() 方法中添加了一些验证逻辑,确保年龄在合法范围内。

继承性

Java支持类的继承,子类可以继承父类的属性和方法。这样可以避免重复编写代码,增加代码的可复用性。下面是一个简单的继承示例:

javaCopy Code
public class Student extends Person { private String major; public String getMajor() { return major; } public void setMajor(String major) { this.major = major; } public void study() { System.out.println("I am studying."); } }

上面的代码定义了一个名为 Student 的子类,它继承自 Person 父类,并添加了一个名为 major 的新属性和一个名为 study() 的新方法。

多态性

Java支持多态性,允许我们使用子类对象来替代父类对象。这样可以提高代码的灵活性和可扩展性。下面是一个多态示例:

javaCopy Code
Person p = new Student(); p.setName("李四"); p.setAge(18); p.eat();

上面的代码中,我们通过使用 new 关键字创建了一个 Student 对象,并将其赋值给了一个类型为 Person 的变量 p。由于 Student 继承自 Personp 可以调用父类中的方法和属性。同时,由于 Java 支持动态绑定机制,调用 eat() 方法时会自动调用 Student 子类中的同名方法。

示例

下面是一个完整的例子,演示如何定义一个名为 Animal 的抽象类,并定义两个子类 DogCat,以及一个测试类 Test

javaCopy Code
public abstract class Animal { private String name; public Animal(String name) { this.name = name; } public String getName() { return name; } public abstract void play(); } public class Dog extends Animal { public Dog(String name) { super(name); } @Override public void play() { System.out.println(getName() + " is playing with ball."); } } public class Cat extends Animal { public Cat(String name) { super(name); } @Override public void play() { System.out.println(getName() + " is playing with yarn."); } } public class Test { public static void main(String[] args) { Animal a1 = new Dog("小黑"); Animal a2 = new Cat("小白"); a1.play(); a2.play(); } }

上面的代码中,我们定义了一个抽象类 Animal,它有一个名为 name 的私有属性和一个抽象方法 play()。同时,我们定义了两个子类 DogCat,它们重写了 play() 方法,并分别输出狗和猫的玩耍方式。最后,在测试类 Test 中创建了一个名为 a1Dog 实例和一个名为 a2Cat 实例,并调用它们的 play() 方法。