面向对象编程
类和对象
类实质上就是封装对象属性和行为的载体,而对象则是类抽象出来的一个实例。反过来说,具有相同属性和行为的一类实体被称为类。
面向对象概述
对象
通常都会将对象划分为两个部分,即静态部分与动态部分。顾名思义,静态部分就是不能动的部分,这个部分被称为“属性”,任何对象都会具备其自身属性,动态部分即对象可执行的动作,这部分被称为“行为”。
描述对象与类之间的关系
类
类就是同一类事物的统称,如果将现实世界中的一个事物抽象成对象,类就是这类对象的统称,如鸟类。
在Java语言中,类对象的行为是以方法的形式定义的,对象的属性是以成员变量的形式定义的,所以类包括对象的属性和方法。
封装
面向对象程序设计具有以下特点:封装性、继承性和多态性。
封装是面向对象编程的核心思想。将对象的属性和行为封装起来,其载体就是类,类通常对客户隐藏其实现细节,这就是封装的思想。
继承
类与类之间同样具有关系,这种关系被称为关联。
设计软件时,使用继承思想可以缩短软件开发的周期,复用那些已经定义好的类可以提高系统性能,减少系统在使用过程中出现错误的概率。
在Java语言中,将类似于平行四边形类的类称为子类,将类似于四边形类的类称为父类或超类。值得注意的是,可以说平行四边形是特殊的四边形,但不能说四边形是平行四边形,也就是说子类的实例都是父类的实例,但不能说父类的实例是子类的实例。
父类与子类存在一种层次关系。一个类处于继承体系中,它既可以是其他类的父类,为其他类提供属性和行为,也可以是其他类的子类,继承父类的属性和方法。
多态
将父类对象应用于子类的特征就是多态。多态的实现并不依赖于具体类,而是依赖于抽象类和接口。在Java语言中,称这样的类为抽象类,抽象类不能实例化对象。在多态的机制中,父类通常会被定义为抽象类,在抽象类中给出一个方法的标准,而不给出实现的具体流程。
在多态的机制中,比抽象类更方便的方式是将抽象类定义为接口。由抽象方法组成的集合就是接口。
注意继承与多态的联系与区别
继承是多态的基础,多态依赖于继承。
继承
子类继承父类的所有非私有属性和方法。
子类可以重写(override)父类的方法,也可以增加新的方法
// 父类
class Animal {
public void eat() {
System.out.println("动物正在吃东西");
}
}
// 子类
class Dog extends Animal {
public void bark() {
System.out.println("狗正在叫");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.eat(); // 继承父类的方法
dog.bark(); // 子类特有的方法
}
}
多态
多态主要有编译时多态(方法重载)和运行时多态(方法重写)。
运行时多态依赖于方法重写(子类重写父类的方法)。
父类的引用可以指向不同的子类对象,并根据实际的对象类型执行不同的子类方法。
class Animal {
public void makeSound() {
System.out.println("动物发出声音");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("狗叫:汪汪");
}
}
class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("猫叫:喵喵");
}
}
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog();
Animal myCat = new Cat();
myDog.makeSound(); // 输出: 狗叫:汪汪
myCat.makeSound(); // 输出: 猫叫:喵喵
}
}
类
在Java语言中对象的属性以成员变量的形式存在,对象的方法以成员方法的形式存在。成员变量就是普通的变量,可以为它设置初始值,也可以不设置初始值。如果不设置初始值,则会有默认值。
一个成员方法可以有参数,这个参数可以是对象,也可以是基本数据类型的变量,同时成员方法有返回值和不返回任何值的选择,如果方法需要返回值,则可以在方法体中使用return关键字。
要使Java代码中的成员方法无返回值,可以使用void关键字表示。
成员方法的返回值可以是计算结果,也可以是其他想要的数值和对象,返回值类型要与方法返回的值类型一致。
权限修饰符
当声明类时不使用public、protected和private修饰符设置类的权限,则这个类被预设为包存取范围,即只有一个包中的类可以访问这个类的成员变量或成员方法。
局部变量
局部变量是在方法被执行时创建,在方法执行结束时被销毁。局部变量在使用时必须进行赋值操作或被初始化,否则会出现编译错误。
将局部变量的有效范围称为变量的作用域。在作用范围外使用局部变量是一个常见的错误,因为在作用范围外没有声明局部变量的代码。
在相互不嵌套的作用域中可以同时声明两个名称和类型都相同的局部变量,如果是嵌套区域则不可以这样使用。
this关键字
this关键字用于表示本类当前的对象,当前对象不是某个new出来的实体对象,而是当前正在编辑的类。this关键字只能用于本类中。
this除了可以调用成员变量或成员方法,还可以作为方法的返回值。
类的构造方法
构造方法的特点如下:[插图] 构造方法没有返回值。[插图] 构造方法的名称要与本类的名称相同。注意在定义构造方法时,构造方法没有返回值,但这与普通没有返回值的方法不同,普通没有返回值的方法使用public void methodEx()这种形式进行定义,但构造方法并不需要使用void关键字进行修饰。
注意如果在类中定义的构造方法都不是无参的构造方法,那么编译器也不会为类设置一个默认的无参构造方法,当试图调用无参构造方法实例化一个对象时,编译器会报错。因此,只有在类中没有定义任何构造方法时,编译器才会在该类中自动创建一个不带参数的构造方法
静态变量和静态方法
由static修饰的变量和方法被称为静态变量和静态方法。被声明为static的变量和方法被称为静态成员。静态成员属于类所有,区别于个别对象,可以在本类或其他类使用类名和“.”运算符调用静态成员。(类名.静态类成员)
注意:
在静态方法中不可以使用this关键字。
在静态方法中不可以直接调用非静态方法。[插图] 局部变量不可以使用static关键字进行声明。[插图] 主方法必须用static关键字进行声明。[插图] 只有内部类可以使用static关键字进行声明。
类的主方法
主方法是静态的,因此如要直接在主方法中调用其他方法,则该方法也必须是静态的。
主方法没有返回值。
主方法的形参为数组。