Java 对象和类学习笔记
什么是对象和类
在Java中,一切皆是对象。对象是具有状态(属性)和行为(方法)的实体。而类则是对象的模板或蓝图,它定义了对象的属性和方法。
类的定义
在Java中,我们使用关键字 class
来定义一个类,并通过大括号来包含类的成员变量和方法。下面是一个简单的例子:
javaCopy Codepublic class Person {
String name;
int age;
public void eat() {
System.out.println("I am eating.");
}
}
上面的代码定义了一个名为 Person
的类。它有两个成员变量:name
和 age
,以及一个方法 eat()
。
对象的创建与使用
要创建一个对象,我们需要使用关键字 new
来调用类的构造方法。下面是一个示例:
javaCopy CodePerson p = new Person();
p.name = "张三";
p.age = 20;
p.eat();
上面的代码首先创建了一个名为 p
的实例对象,然后给它的属性 name
和 age
赋值为 "张三"
和 20
。最后,调用对象的 eat()
方法。
封装性
在Java中,我们可以使用访问修饰符来控制类的成员变量和方法的访问权限。这样可以保护类的数据,防止外部程序对其进行随意访问和修改。下面是一个示例:
javaCopy Codepublic 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.");
}
}
上面的代码中,我们将 name
和 age
变量声明为私有的,提供了公共的访问器和修改器方法来获得和设置它们的值,并在 setAge()
方法中添加了一些验证逻辑,确保年龄在合法范围内。
继承性
Java支持类的继承,子类可以继承父类的属性和方法。这样可以避免重复编写代码,增加代码的可复用性。下面是一个简单的继承示例:
javaCopy Codepublic 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 CodePerson p = new Student();
p.setName("李四");
p.setAge(18);
p.eat();
上面的代码中,我们通过使用 new
关键字创建了一个 Student
对象,并将其赋值给了一个类型为 Person
的变量 p
。由于 Student
继承自 Person
,p
可以调用父类中的方法和属性。同时,由于 Java 支持动态绑定机制,调用 eat()
方法时会自动调用 Student
子类中的同名方法。
示例
下面是一个完整的例子,演示如何定义一个名为 Animal
的抽象类,并定义两个子类 Dog
和 Cat
,以及一个测试类 Test
:
javaCopy Codepublic 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()
。同时,我们定义了两个子类 Dog
和 Cat
,它们重写了 play()
方法,并分别输出狗和猫的玩耍方式。最后,在测试类 Test
中创建了一个名为 a1
的 Dog
实例和一个名为 a2
的 Cat
实例,并调用它们的 play()
方法。