文章目录
-
- 0.1类的格式
-
- 修饰符(Modifier):
- 类名(ClassName):
- [extends 父类名:](#extends 父类名:)
- [implements 接口列表:](#implements 接口列表:)
- [类体(Class Body):](#类体(Class Body):)
- 1.举例说明类方法与实例方法以及类变量与实例变量之间的区别。
- 0.2接口声明的格式
- 2.什么是接口?接口的意义是什么?
- 3.什么是包?如何定义包?
- 4.什么是抽象类?抽象类与接口有何区别?
-
- [抽象类(Abstract Class):](#抽象类(Abstract Class):)
- 与接口的区别:
- 5.下列接口的定义中,哪个是正确的?
- [6.在一个图书管理程序中,类Book,Newspaper和 Video 都是类 Media 的子类。编写一个类,该类能够实现对一组书、报纸等的存储,并提供一定的检索功能。](#6.在一个图书管理程序中,类Book,Newspaper和 Video 都是类 Media 的子类。编写一个类,该类能够实现对一组书、报纸等的存储,并提供一定的检索功能。)
- 7.利用枚举类型重新编写例5-13。
0.1类的格式
java
[修饰符] class 类名 [extends 父类名] [implements 接口列表] {
// 类体,包括成员变量和方法
}
各部分解释如下:
修饰符(Modifier):
可选的访问修饰符,如 public、private、protected 或者默认(包访问权限)。
如果是公共类,通常会使用 public 修饰符,使得类可以在任何地方被访问。
abstract 修饰符表示类是抽象的,不能被实例化,但可以被其他类继承。
final 修饰符表示类不能被继承。
static 修饰符(不用于类声明,但可以用于定义静态嵌套类)。
类名(ClassName):
遵循驼峰命名法,首字母大写,如 MyClassName。
extends 父类名:
可选的,如果类继承自另一个类,则在此处指定父类的名称。
Java 不支持多重继承,即一个类只能继承一个父类。
implements 接口列表:
可选的,如果类实现了一个或多个接口,列出接口名,用逗号分隔,如 implements MyInterface1, MyInterface2。
一个类可以实现多个接口,以实现多态性。
类体(Class Body):
包含在大括号 {} 内,声明类的成员变量和方法。
1.举例说明类方法与实例方法以及类变量与实例变量之间的区别。
类方法是不需要声明实例就可以直接直接用类调用的,是类级别的方法,用static来声明,而实例方法是对象级别的,需要声明对象来调用方法。类变量是所有实例所共享的,属于类层面的,都有,而且一经改变就影响所有实例。对象变量是对象层面的,只影响特定对象。
java
public class Animal {
// 类变量 (静态变量)
public static String species = "Mammal"; // 所有Animal实例共享的种类信息
// 实例变量
private String name; // 每个Animal实例都有自己的名字
// 构造方法
public Animal(String name) {
this.name = name; // 初始化实例变量
}
// 实例方法
public void speak() {
System.out.println(name + " says Woof!");
}
// 类方法 (静态方法)
public static void changeSpecies(String newSpecies) {
species = newSpecies; // 修改类变量,影响所有Animal实例
}
}
public class Main {
public static void main(String[] args) {
// 创建Animal实例
Animal dog = new Animal("Dog");
Animal cat = new Animal("Cat");
// 实例方法调用
dog.speak(); // 输出: Dog says Woof!
// 类方法调用
Animal.changeSpecies("Reptile"); // 改变类变量的值
// 查看类变量和实例变量的变化
System.out.println(dog.species); // 输出: Reptile
System.out.println(cat.species); // 输出: Reptile
System.out.println(Animal.species); // 输出: Reptile
// 注意:类变量的改变影响了所有实例
}
}
0.2接口声明的格式
java
[修饰符] interface 接口名 [extends 其他接口列表] {
// 常量声明
public static final 数据类型 常量名 = 常量值;
// 抽象方法声明
public 返回类型 方法名(参数列表);
// 默认方法声明(Java 8起)
public default 返回类型 方法名(参数列表) {
// 默认方法的实现
}
// 静态方法声明(Java 8起)
public static 返回类型 方法名(参数列表) {
// 静态方法的实现
}
}
例如
java
public interface MyInterface {
// 常量声明
public static final int CONSTANT_VALUE = 100;
// 抽象方法声明
void doSomething();
// 默认方法声明
default String getDefaultMessage() {
return "This is a default method.";
}
// 静态方法声明
static void staticMethod() {
System.out.println("This is a static method in the interface.");
}
}
接口中的变量实际上应该声明为 static final,这是Java语言规范的要求。在接口中声明的变量自动具有 public static final 的修饰符 ,因此通常可以省略这些关键字。但是,为了清晰和易读,有些人会选择显式写出这些修饰符。下面是修正后的接口声明:
2.什么是接口?接口的意义是什么?
接口(Interface):
定义:接口在面向对象编程中是一种契约,它定义了一组方法的签名,但不提供具体的实现 。接口是用来规定实现接口的类必须提供 哪些方法,但不规定如何实现这些方法。
意义:接口的主要目的是实现多态性和解耦合。它允许不同的类实现相同的接口,从而确保这些类具有共同的行为,即使它们之间没有继承关系。通过接口,开发者可以设计更加灵活和可扩展的系统。
3.什么是包?如何定义包?
包(Package):
定义:包是Java中用于组织类和接口的一种命名空间 ,它帮助管理类的命名冲突,提供了一种模块化的机制,使得类和接口可以被分类和分组。
定义包:在Java中,使用package关键字来定义包,通常放在源代码文件的顶部。例如,定义名为com.example.myapp的包:
4.什么是抽象类?抽象类与接口有何区别?
抽象类(Abstract Class):
定义:抽象类是不能被实例化的类 ,它可能包含抽象方法(没有实现的方法)和非抽象方法(有实现的方法)。抽象类用于提供一个基类,供其他类继承,并可以提供部分默认实现。
与接口的区别:
方法的实现:抽象类可以包含方法的实现,而接口只能声明方法,不能包含实现 。
多重继承:Java中,一个类只能继承一个抽象类,但可以实现多个接口 。
成员变量:抽象类可以有实例变量 ,而接口不能有实例变量 (除了static final常量)。
访问修饰符:接口的方法默认是public,而抽象类的方法可以有不同的访问级别。
目的:抽象类通常用于表示具有共同特性的类 的模板,而接口主要关注行为的一致性,定义类必须遵循的规范。
5.下列接口的定义中,哪个是正确的?
(1)interface Printable{
void print(){ };
}
(2)abstract interface Printable{
void print();
}
(3)abstract interface Printable extends Interfacel, Interface2{
void print(){};
}
(4)interface Printable{
void print();
}
第四个正确。
6.在一个图书管理程序中,类Book,Newspaper和 Video 都是类 Media 的子类。编写一个类,该类能够实现对一组书、报纸等的存储,并提供一定的检索功能。
这是定义被调用的类
java
package com.example.demo.chapter;
/**
* @author zyk
* @date 2024/4/30 上午10:03
* @return
*/
abstract public class media {
public String mediaName;
public void store(String mediaName)
{
System.out.println("这是储存模块");
}
public void find(String mediaName)
{
System.out.println("这是查找模块");
}
}
class video extends media
{
@Override
public void store(String mediaName) {
super.store(mediaName);
System.out.println("这是储存到的视频模块");
}
@Override
public void find(String mediaName)
{
super.find(mediaName);
System.out.println("这是检索到的视频模块");
}
}
下面的测试代码
java
package com.example.demo.chapter;
public class mediaTest {
public static void main(String[] args)
{
media media = new video();
media.store("media");
media.find("media");
}
}