【Java】小白友好的面向对象编程学习笔记

目录

OOP介绍

类和对象

方法参数

静态

包和import

构造方法

多态

访问权限

内部类

抽象

接口

枚举

匿名类

bean类

作用域


OOP介绍

Java 是一种面向对象的编程语言,面向对象编程(Object-Oriented Programming,简称 OOP)是一种程序设计思想,它将现实世界中的事物抽象为对象,通过封装、继承和多态等特性来描述对象之间的关系和交互。

面向对象编程的三大特性是:

  1. 封装(Encapsulation):指隐藏对象的内部状态,并且通过公共接口对外提供访问方式。这样可以保证对象的内部状态不被外部改变,同时也方便了对象的使用。

  2. 继承(Inheritance):指子类继承父类的属性和方法。子类可以重写父类的方法,或者增加自己的方法和属性,从而实现代码的复用和扩展。

  3. 多态(Polymorphism):指同一种操作作用于不同的对象上会产生不同的效果。多态可以通过方法的重载和重写实现。

类和对象

通过类和对象的概念,我们可以将代码组织成易于管理和重用的模块化结构。这种面向对象的编程范式是 Java 编程的核心。

1、类(Class): 类是用来描述一类具有相同属性和行为的对象的抽象概念。它是创建对象的模板或蓝图。

  • 属性:类的属性是描述对象特征的变量。也称为成员变量或字段,它们存储对象的状态信息。
  • 方法:类的方法是描述对象行为的函数。也称为成员函数,它们定义了对象可以执行的操作。

在 Java 中,可以使用 class 关键字来定义一个类。以下是一个简单的类的示例:

public class Person {// 属性private String name;private int age;// 构造方法public Person(String name, int age) {this.name = name;this.age = age;}// 方法public void sayHello() {System.out.println("Hello, my name is " + this.name + " and I am " + this.age + " years old.");}
}

2、对象(Object): 对象是类的一个实例,它拥有类定义的属性和方法。通过创建对象,我们可以使用类中定义的方法和访问类的属性。

  • 创建对象:使用 new 关键字来创建一个对象,通过调用类的构造方法对对象进行初始化。
  • 访问属性和方法:通过使用点(.)操作符来访问对象的属性和调用对象的方法。

以下是使用上述类创建对象并访问属性和方法的示例:

// 创建对象
Person person = new Person("Alice", 25);// 访问属性
System.out.println(person.name); // 输出:Alice
System.out.println(person.age);  // 输出:25// 调用方法
person.sayHello(); // 输出:Hello, my name is Alice and I am 25 years old.

方法参数

方法参数是用于接收传递给方法的值或引用的变量。通过方法参数,我们可以将数据传递给方法,并在方法内部进行处理。Java 中的方法参数有两种类型:基本数据类型和引用数据类型。

1、基本数据类型参数: 基本数据类型参数是传递给方法的值的副本。这意味着,在方法内部对参数进行修改不会影响原始的变量。

2、引用数据类型参数(包括字符串、数组、类、接口、枚举、包装类、映射、集合): 引用数据类型参数是传递给方法的引用,这意味着在方法内部对参数进行修改会影响原始的对象。

静态

静态是面向对象编程中的一个关键字,用于修饰类、方法和变量。静态成员与特定的对象实例无关,而是与类本身相关联。

1、静态变量: 静态变量属于类,而不属于类的任何特定实例。它们在类加载时被初始化,并且只有一个副本存在于内存中。静态变量可以通过类名直接访问,无需创建对象实例。

2、静态方法: 静态方法属于类,而不属于类的任何特定实例。它们在类加载时就存在于内存中,可以通过类名直接调用,无需创建对象实例。静态方法只能访问静态成员变量和其他静态方法,不能访问非静态成员变量和方法。

3、静态代码块:一种特殊的代码块,用于在类加载时执行一些初始化操作,对静态变量进行赋值或执行其他静态操作。它只会执行一次,并且在类的所有实例对象之前执行。

包和import

1、包的定义: 在 Java 中,包的定义使用关键字 package,位于源代码文件的开头。包名采用小写字母,多个单词之间使用点(.)分隔。

package com.example.mypackage;

2、导入类: 当我们需要在一个类中使用另一个包中的类时,我们可以使用 import 关键字将其导入。导入可以是针对单个类的,也可以是针对整个包的。

import com.example.otherpackage.SomeClass;
import java.util.*;

3、使用导入的类: 一旦我们导入了某个类或者整个包,就可以直接在代码中使用它们,无需使用包名限定。(如果我们没有导入某个类,而又想使用它,就必须使用完整的包名限定。)

import com.example.otherpackage.SomeClass;public class MyClass {public static void main(String[] args) {SomeClass obj = new SomeClass();// 使用 SomeClass 类}
}

 

构造方法

构造方法(Constructor)是一种特殊的方法,用于创建和初始化对象。它负责在对象创建时为对象的成员变量赋初值,并执行其他必要的初始化操作。构造方法具有以下特点:

  1. 构造方法的名称必须与类名相同。
  2. 构造方法没有返回类型,包括 void。
  3. 构造方法可以有参数,也可以没有参数。
  4. 如果没有定义构造方法,Java 会提供一个默认的无参构造方法,用于创建对象。

构造方法在以下情况下被调用:

  1. 在使用 new 关键字创建对象时,会调用相应类的构造方法。
  2. 在通过继承创建子类对象时,会先调用父类的构造方法,然后再调用子类的构造方法。

 

多态

多态是面向对象编程的一个重要概念。它允许我们使用父类类型的引用来引用子类对象,以一种统一的方式处理不同类型的对象。

多态有以下几个关键点:

  1. 继承关系:多态是建立在类之间的继承关系上的。子类继承了父类的属性和方法,同时还可以添加自己特有的属性和方法。
  2. 方法重写:子类可以重写父类的方法,即在子类中重新定义与父类中同名的方法。这样在通过父类的引用调用该方法时,实际上会执行子类中重写的方法。
  3. 父类引用指向子类对象:我们可以使用父类类型的引用来引用子类对象,例如 父类类型 引用变量 = new 子类类型()。这样做的好处是,我们可以通过父类的引用调用子类中重写的方法,实现多态的效果。
  4. 运行时绑定:Java的多态是在运行时确定的,而不是在编译时。也就是说,当调用一个方法时,实际执行的方法取决于对象的类型,而不是引用的类型。

访问权限

访问权限修饰符可以控制类、接口、方法或变量对外部的可见性,是实现封装性的重要手段。

在 Java 面向对象编程中,有四种访问权限修饰符:public、protected、default(package-private)、private。这四种访问权限修饰符的作用范围如下:

  1. public:表示公开的访问权限,可以被任何类、接口、方法或变量访问。
  2. protected:表示受保护的访问权限,可以被本类、同包内的类和子类访问。
  3. default(或称为 package-private):表示默认的访问权限,只能被同一个包内的类访问。
  4. private:表示私有的访问权限,只能被本类访问。

 

 

内部类

在 Java 中,内部类是定义在其他类内部的类。它允许在一个类的内部创建另一个类,这样可以更好地组织和封装代码。内部类主要有以下几种类型:

  1. 成员内部类:成员内部类是定义在另一个类内部的普通类。它与外部类之间存在一个包含关系,可以访问外部类的成员变量和方法(包括私有成员),并且可以使用外部类的引用来访问外部类的实例。成员内部类可以被私有化,只有外部类可以访问它。

  2. 静态内部类:静态内部类是定义在其他类内部的静态类。它与外部类之间没有包含关系,可以直接通过外部类的类名访问,无需创建外部类的实例。静态内部类不能访问外部类的非静态成员,只能访问外部类的静态成员。

  3. 方法内部类:方法内部类是定义在方法内部的类。它的作用域限定在方法内部,只能在方法内部创建该类的实例。方法内部类可以访问外部类的成员变量和方法,但只能访问 final 或 effectively final 的局部变量。

  4. 匿名内部类:匿名内部类是没有类名的内部类,它通常用于创建一个只需要使用一次的类。匿名内部类必须继承一个父类或实现一个接口,并且可以在创建对象的同时定义类的实现。由于没有类名,所以无法在其他地方再次使用。

使用内部类可以实现以下几个优点:

  1. 封装性:内部类可以访问外部类的私有成员,从而实现更好的封装性。
  2. 组织性:内部类可以将相关的类组织在一起,使代码更加清晰和结构化。
  3. 回调功能:匿名内部类常用于实现回调功能,可以简化代码的编写。

抽象

在 Java 面向对象编程中,抽象是一种重要的概念。抽象是指将问题的本质特征提取出来,忽略掉与问题无关的细节,从而将问题简化为更易于理解和处理的形式。

在 Java 中,可以通过以下方式实现抽象:

  1. 抽象类(Abstract Class):抽象类是用 abstract 关键字声明的类,它不能被实例化。抽象类可以包含抽象方法和非抽象方法。抽象方法是没有具体实现的方法,只有方法的声明,而具体的实现需要在子类中完成。子类必须实现抽象类中的所有抽象方法,否则子类也必须声明为抽象类。

  2. 抽象方法(Abstract Method):抽象方法是用 abstract 关键字声明的方法,它没有具体的实现,只有方法的声明。抽象方法必须声明在抽象类中。子类必须实现抽象类中的所有抽象方法,否则子类也必须声明为抽象类。

使用抽象类和抽象方法可以实现以下几个目的:

  1. 封装共性:抽象类可以定义一组相关的方法,并将它们封装在一个类中,从而提高代码的复用性和可维护性。

  2. 规范行为:抽象类可以定义一组抽象方法,规定子类必须实现的方法,从而强制子类按照规范进行行为的实现。

  3. 隐藏细节:通过将对象的共性特征抽象出来,可以隐藏对象的具体实现细节,使得代码更加简洁和易懂。

举例:

abstract class Animal {public abstract void sound();
}class Dog extends Animal {@Overridepublic void sound() {System.out.println("Dog barks");}
}class Cat extends Animal {@Overridepublic void sound() {System.out.println("Cat meows");}
}public class Main {public static void main(String[] args) {Animal dog = new Dog();dog.sound();Animal cat = new Cat();cat.sound();}
}

接口

在 Java 面向对象编程中,接口是一种定义了一组方法规范的抽象类型。接口可以被类实现(implement),从而使得类能够具备接口所定义的行为。接口类似于契约或协议,它规定了类必须实现的方法以及方法的签名,但不提供具体的实现。

在 Java 中,可以通过以下方式定义接口:

public interface InterfaceName {// 声明方法,不包含方法体void methodName();int anotherMethod();// ...
}

接口中的方法默认为抽象方法,不需要使用 abstract 关键字来声明。接口还可以包含常量和默认方法。

类可以通过关键字 implements 来实现一个或多个接口,并提供接口中方法的具体实现。一个类可以同时实现多个接口,从而具备多个接口所定义的行为。

下面是一个简单的示例,展示了接口的使用:

interface Animal {void sound(); // 声明抽象方法
}class Dog implements Animal {@Overridepublic void sound() {System.out.println("Dog barks");}
}class Cat implements Animal {@Overridepublic void sound() {System.out.println("Cat meows");}
}public class Main {public static void main(String[] args) {Animal dog = new Dog();dog.sound();Animal cat = new Cat();cat.sound();}
}

枚举

在 Java 中,枚举(Enum)是一种特殊的数据类型,用于定义一组有限的常量。枚举常量是预定义的、唯一的,并且在枚举类型中以逗号分隔列出。

使用枚举可以提供更加清晰和可读性强的代码,使得代码更具可维护性和可扩展性。Java 提供了关键字 enum 来定义一个枚举类型。

下面是一个简单的示例,展示了枚举的使用:

enum Day {MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY
}public class Main {public static void main(String[] args) {Day today = Day.TUESDAY;System.out.println("Today is " + today);}
}

枚举类型可以具有方法、构造函数和字段,就像一个普通的类一样。枚举常量也可以附加额外的数据和行为。

下面是一个带有方法和字段的枚举的示例:

enum Color {RED("#FF0000"),GREEN("#00FF00"),BLUE("#0000FF");private String hexCode; // 字段Color(String hexCode) {this.hexCode = hexCode;}public String getHexCode() { // 方法return hexCode;}
}public class Main {public static void main(String[] args) {Color red = Color.RED;System.out.println("Red color's hex code is " + red.getHexCode());}
}

 

匿名类

在 Java 中,匿名类是一种特殊的类,它没有显式的名称,通常用于创建一个只需要使用一次的类的实例。匿名类可以理解为是一个局部类,但是它的定义方式更加简洁。

匿名类可以在实例化对象的时候直接定义,而无需提前定义该类的名称。在创建匿名类的同时,也可以实现该类的接口或继承某个父类,从而利用其行为和属性。

下面是一个匿名类的示例,它继承了 Thread 类并覆盖了 run() 方法:

Thread thread = new Thread() {@Overridepublic void run() {System.out.println("Hello from anonymous class!");}
};thread.start();

bean类

在 Java 中,Bean 是一种特殊的类,它符合以下约定:

  • 公共无参构造函数:Bean 类必须提供一个公共的无参构造函数,否则在某些情况下会出现异常。
  • 私有属性:Bean 类的属性应该是私有的,并通过公共的 getter 和 setter 方法来访问和修改属性值。
  • 可序列化:Bean 类必须实现可序列化接口,以便可以将其状态保存到磁盘或通过网络发送。
  • 命名规范:Bean 类的名称应该以大写字母开头,并且应该为名词。属性名应该是小写字母开头,并且应该使用驼峰命名法。

举例:

public class Person implements Serializable {private String name;private int age;public Person() {}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

作用域

在 Java 中,作用域指的是变量的生命周期和可见性范围。Java 支持四种不同的作用域:

  1. 类级别作用域(static):由 static 修饰的变量或方法属于类级别作用域,可以通过类名访问。这些变量和方法在程序运行期间只会被创建一次,并且在整个程序执行期间都可以访问。

  2. 实例级别作用域:没有被 static 修饰的变量属于实例级别作用域,它们必须在实例化对象后才能被访问。每个实例都有一份独立的实例变量,它们在对象创建时被初始化,在对象销毁时被回收。

  3. 局部作用域:在方法、循环或语句块中定义的变量属于局部作用域,它们只能在所定义的代码块中访问,离开该代码块后就会被销毁。局部变量必须显式地初始化,否则编译器会报错。

  4. 匿名作用域:匿名作用域是指在内部类中定义的变量,它们通常用于解决内部类与外部类之间的数据共享问题。匿名变量的生命周期和内部类相同,离开内部类后就被销毁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/635514.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue2 使用pdf.js 实现pdf预览,并可复制文本

需求:pdf预览,并且可以选中pdf的内容进行复制。 在ruoyi的vue前端项目中用到,参考了网上不少文章,因为大部分没给具体的pdf.js版本,导致运行过程中报各种api 错误,经过尝试以下版本可用&#xff0c…

R语言【cli】——ansi_html():将ANSI格式文本转换为HTML

Package cli version 3.6.0 Usage ansi_html(x, escape_reserved TRUE, csi c("drop", "keep")) Arguments 参数【x】&#xff1a;输入字符向量。 参数【escape_reserved】&#xff1a;是否转义HTML中保留的字符(&、<和>)。 参数【csi】&a…

ARM多核调度器DSU

1. 背景 从A75开始&#xff0c;ARM提出了一个新的多核心管理系统单元&#xff0c;叫做DSU(DynamIQ Shared Unit)。DSU的核心功能是控制CPU内核&#xff0c;使其成簇Cluster使用&#xff0c;簇内每一个核心可以单独开关、调整频率/电压&#xff0c;能效表现更佳&#xff0c;甚至…

如何使用Webpack打包js文件

《Webpack打包简单的js文件》 初始化一个新的npm 步骤一&#xff1a; 初始化npm项目&#xff0c;创建一个package.json文件 npm init -y 步骤二&#xff1a; 添加打包脚本&#xff1a;在scripts部分添加一个命令来运行webpack "scripts": {"build":…

【机器学习】TensorFlowLite安装和模型训练

运行环境 Linux&#xff0c;部分库不支持Apple芯片 做AI这部分的开发&#xff0c;还是强烈建议装个Linux双系统或虚拟机 这些比折腾Windows和Mac上的移植环境要轻松得多 安装依赖 sudo apt install libportaudio219.6.0-1.2 pip3 install tf-models-official2.3.0 pip3 in…

Lodop-批量逐个打印返回状态

文章目录 前言一、LODOP.GET_VALUE(PRINT_STATUS_OK, P_ID)二、LODOP.GET_VALUE(PRINT_STATUS_EXIST, P_ID)三、核心实现代码总结 前言 前面写过Lodop的相关文章 &#xff1a; 文章一&#xff1a;《Lodop打印控件常用指令记录》 文章二&#xff1a;《Vue3hooks快速接入Lodop打…

Docker-Confluence部署记录

启动 docker container run -v $(pwd):/var/atlassian/application-data/confluence/ --nethost -d --nameconfluence_720_20240120 confluence/confluence:7.2.0新建mysql数据库 导入破解包 atlassian-agent 参考-Confluence 破解方式&#xff08;Linux&#xff09; 按流程破…

springcloud OpenFeign服务接口调用

文章目录 代码下载地址OpenFeign简介OpenFeign使用步骤测试 OpenFeign超时控制超时设置&#xff0c;故意设置超时演示出错情况服务提供方8001故意写暂停程序服务消费方80添加超时方法PaymentFeignService服务消费方80添加超时方法OrderFeignController测试YML文件里需要开启Ope…

区间问题笔记

1、k倍区间 #include <iostream> #include<cmath> #include<vector> #include<algorithm> #include<stack> using namespace std;long long sum[100005]; // 前缀和数组 int cnt[100005]; // 记录sum[i]除k得到的余数的个数 int ans;int…

操作系统实验报告

目录 目录 实验一 一、实验结果 实验二 使用信号量实现进程互斥与同步 一、实验结果 1. 使用信号量实现有限缓冲区的生产者和消费者问题 2. 使用信号量实现读进程具有优先权的读者和写者问题 实验三 死锁和预防 一、实验要求 二、实验内容 三、实验结果 实验四 内…

js中高德地图如何自身所在城市

直接上代码 <!doctype html> <html> <head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"initial-scale1.0, user-scalableno, wi…

如何对拉索回归进行调参?

对拉索回归进行调参主要涉及确定最佳的正则化参数 λ。正则化参数 λ 控制着模型对系数的收缩程度&#xff0c;影响着模型的复杂度。选择合适的 λ 值既可以防止过拟合&#xff0c;也可以保证模型有足够的预测能力。 以下是进行拉索回归调参的一般步骤&#xff1a; 准备数据&a…

Linux中的新建用户、切换用户

目录 一、Linux系统中有哪些用户 二、新建普通用户 三、root账号与普通账号的切换 一、Linux系统中有哪些用户 1.root 超级管理员&#xff08;不受权限约束&#xff09; 2.其他用户 普通用户&#xff08;受到权限约束&#xff09; 二、新建普通用户 创建新用户 sudo user…

代码随想录算法训练53 | 动态规划part14

1143.最长公共子序列 体会一下本题和 718. 最长重复子数组 的区别 视频讲解&#xff1a;动态规划子序列问题经典题目 | LeetCode&#xff1a;1143.最长公共子序列_哔哩哔哩_bilibili 代码随想录 1035.不相交的线 其实本题和 1143.最长公共子序列 是一模一样的&#xff0c;大…

c++算法之模拟

目录 模拟算法介绍 例题 蓝桥OJ549 扫雷 题目描述 输入描述 输出描述 输入输出样例 示例 1 运行限制 解 蓝桥OJ 551灌溉 题目描述 输入描述 输出描述 输入输出样例 示例 1 运行限制 解 蓝桥OJ 498回文日期 题目描述 输入描述 输出描述 输入输出样例 示…

如何删除Windows密码,看这篇文章就够了

删除Windows帐户的密码一点也不困难。删除密码后,当计算机启动时,你就不再需要登录到Windows。 在你删除密码后,家里或办公室里的任何人都可以完全访问你电脑上的所有内容,所以这样做并不是一件非常注重安全的事情。 ​注意:如果你忘记了密码,那么你将无法使用下面的方…

Oracle 12CR2 RAC部署翻车,bug避坑经历

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

【AI】ChatGPT和文心一言那个更好用

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读文章&#xff01; 此篇是【话题达人】序列文章&#xff0c;这一次的话题是《自然语言处理的发展》 文章将以博主的角度进行讲述&#xff0c;理解和水平有限&#xff0c;不足之处&#xff0c;望指正。 目录 背景自我介绍面试题…

java项目性能优化(MyBatis中开启查询缓存及flushCache与useCache的使用)

在java项目中&#xff0c;如果需要大量的DB查询&#xff0c;导致缓存过多&#xff0c;项目运行缓慢&#xff0c;可以设置在select查询时&#xff0c;添加二级缓存的清空。 如果没有去配置flushCache、useCache&#xff0c;那么默认是启用缓存的。 1&#xff0c;flushCache默认…

深度解析window.history.go()和history.back()

深度解析window.history.go()和history.back() 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;在今天的文章中&#xff0c;我们将深入研究前端开发中两个非常重要的…