Java—类和接口

简介: Java—类和接口

对象 Object

java 是面向对象的语言:对象包含了状态和行为,用户通过调用对象的方法、改变对象的属性来实现 java 程序的功能。

Car myCar = new Car("BMW");                          // 创建对象       
me.brand = "Benz";                                   // 修改对象变量                   
me.go("London");                                     // 调用对象方法Copy to clipboardErrorCopied
复制代码

在 java 程序中我们通过类和接口来定义对象的性质:每个 java 文件都是一个定义好的 public 类 / 接口,且类名 / 接口名与文件名相同。

java 文件可以含有多个类 / 接口,但只能有一个 public 类 / 接口供外部访问。

类 Class

对象的类型:定义对象含有的变量和方法。

public class Car {     
    // 变量
    String brand;
    String description = "this is a car";
    // static 变量 
    static int number_of_car;  
    // 构造方法
    public car(String brand){        
        this.brand = brand;
    } 
    // 方法  
    public void go(String loc){
        System.out.print("go to" + loc);
    }   
    // static 方法
    void static showNum(){            
        System.out.print(number_of_car);
    }
    // 初始化块
    {       
        number_of_car;                                      
    }
    // static 初始化块
    static{                                                              
        number_of_car = 0;
    }
    // 内部类
    public class Warranty{
        public void repair(){
            System.out.print("repair");
        }    
    }
}Copy to clipboardErrorCopied
复制代码
  • 变量

对象中存储的数据。

  • 方法

调用时执行的代码。

  • 初始化块

创建对象前自动执行的代码。

  • 内部类

定义在类中的类。

  • 构造方法

在创建对象时自动执行,不返回任何参数(先执行初始化块,再执行构造方法)。

未定义任何构造方法时,系统会自动添加无参构造方法。

终态声明

  • final 常量: 只能赋值一次,不可更改。
  • final 类: 不可被继承。
  • final 方法:(弃用)不可被继承。现在所有的 private 方法都隐式地指定为 final。

对于 final 常量,如果编译时就可以确定值,编译器会在编译时直接把这个变量替换成它的值。

静态声明

  • static 变量:该变量由该类的所有对象共享,不需要创建对象也可使用。
  • static 方法:允许直接访问,不需要创建对象也可被调用。如 main 方法。
  • static 初始化块:在创建类的第一个对象前自动执行(先执行静态初始化块,再执行初始化块)。
  • static 内部类:外部类对象共享,只能访问外部类的静态成员。

权限声明

  • public: 允许所有访问。
  • protected: 只允许本类、同包和子类访问。
  • [default] : 允许本类和同包访问。
  • private: 只允许本类访问。

接口 Interface

类的规范:只规定应含有哪些方法,而不负责具体实现。

public interface Move{  
    // abstract 方法                   
    public void go(String loc);
    // default 方法                                 
    default void stop() {      
        System.out.print("stop");
    };                  
}Copy to clipboardErrorCopied
复制代码
  1. 声明接口:必须且默认为 static final,通常为 public 。
  2. 只允许声明静态常量:必须且默认为 public static final 。
  3. 声明抽象方法:必须且默认为 abstract ,可以为 static。

JDK 1.8 以前,接口中抽象方法必须且默认为 public,不允许实现任何方法。 JDK 1.8 以后,接口中抽象方法可以且默认为 default,且允许实现 static 和 default 方法。 JDK 1.9 以后,接口中抽象方法可以是 private。*

抽象声明

  • abstract 方法:只有声明,而没有方法的具体实现。
  • abstract 类:类的模板,不能实例化对象。必须由其他类继承才能使用。
public abstract class Vehicle {
    // 声明变量
    String brand;
    // 声明并实现方法
    public void go(String loc){
        System.out.print("go to" + loc);
    }   
}Copy to clipboardErrorCopied
复制代码

接口和抽象类的区别

  1. 接口不能实现普通方法,抽象类可以实现具体的方法、也可以不实现。
  2. 接口只能定义静态常量,抽象类可以定义非静态变量。
  3. 一个实体类可以实现多个接口,但只能继承一个抽象类。

更新声明

  • default 方法:更新接口时添加的新方法,允许旧类实现接口而不实现该方法。
  • 可以直接在接口内实现,供没有定义的旧类直接使用。若类中实现了该方法则覆盖。
  • 如果类实现了多个接口且拥有同名 default 方法:
  1. 两个接口若存在继承关系,调用时优先使用子类方法。
  2. 否则,必须重写子类 default 方法,通过 super 关键字明确实现哪个接口:
class Plane implements Move, Fly{
    ...
    void go(){
        Fly.super.go();                 // 实现选定 default 方法
    }
}Copy to clipboardErrorCopied
复制代码

包 Package

命名空间,表示 java 文件的存储路径。其路径记录在每个 java 文件首。

package com.company.project.module;                    // 声明存储路径Copy to clipboardErrorCopied
复制代码

导入 import

在 java 文件中,如果要调用其他 java 文件中定义的类 / 接口,就需要进行导入:

  • 同一存储路径(包)下的 java 文件不需要导入,可以直接调用。
  • 已默认导入 java.lang 路径下所有 java 文件,包含 System、String、Object、Math 等常用类。
  • 如果没有导入对应 java 文件,或者导入了多个同名 java 文件,在调用类 / 接口时需要标明路径。
package com.company.project.module;  
import java.util.Scanner;                             // 导入 java 文件,但不包括内部 static 变量和方法
import java.net.*;                                    // 导入路径下所有 java 文件,但不包括下属文件夹
import static java.lang.Math.PI;                      // 导入 java 文件中的 static 变量或方法
public class Test{
    public void main(String[] args){
        java.io.InputStream in = new java.io.InputStream(System.in);    // 未导入类,调用时需要标明路径
        Scanner sc = new Scanner(in);                                   // 已导入类,可直接调用
        Integer n = sc.nextInt();                                       // 默认导入类,可直接调用
        sc.close();           
    }
}



目录
相关文章
|
25天前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
|
15天前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
|
16天前
|
Java
在Java中,接口之间可以继承吗?
接口继承是一种重要的机制,它允许一个接口从另一个或多个接口继承方法和常量。
46 1
|
1月前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
48 17
|
25天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
26天前
|
Java
java线程接口
Thread的构造方法创建对象的时候传入了Runnable接口的对象 ,Runnable接口对象重写run方法相当于指定线程任务,创建线程的时候绑定了该线程对象要干的任务。 Runnable的对象称之为:线程任务对象 不是线程对象 必须要交给Thread线程对象。 通过Thread的构造方法, 就可以把任务对象Runnable,绑定到Thread对象中, 将来执行start方法,就会自动执行Runable实现类对象中的run里面的内容。
38 1
|
29天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
85 4
|
1月前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
44 4
|
29天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
49 2
|
1月前
|
安全 Java
在 Java 中使用实现 Runnable 接口的方式创建线程
【10月更文挑战第22天】通过以上内容的介绍,相信你已经对在 Java 中如何使用实现 Runnable 接口的方式创建线程有了更深入的了解。在实际应用中,需要根据具体的需求和场景,合理选择线程创建方式,并注意线程安全、同步、通信等相关问题,以确保程序的正确性和稳定性。