站在C/C++的肩膀速通Java面向对象

默认学过C或C++,对变量、表达式、选择、循环都会。

运行特征

  1. 解释型语言(JavaScript、Python等)
    源文件-(平台专属解释器)->解释器中执行
  2. 编译型语言(C++、Go等)
    源文件-(平台编译器)->平台可执行文件
  3. Java
    源文件-(通用编译器)->.class二进制文件-(平台JVM)->JVM中执行

Java名词解释

  1. JVM(Java Virtual Machine)虚拟机
  2. JRE(Java Runtime Environment)运行环境(包含JVM和解释器),有这个就能运行Java程序
  3. JDK(Java Development Kit)包含JRE和相关工具的Java开发环境

常用Dos命令

dir查目录,不是ls
cd进目录
d:进D盘
mkdir创建文件夹
rd删除文件夹
cls清屏
exit退出

Java的相关文件(Windows平台)

  1. .java文件:Java源代码文件,包含了程序员编写的Java代码。
  2. .class文件:Java字节码文件,是由Java编译器编译生成的中间代码文件,可以由Java虚拟机(JVM)执行。
  3. .jar文件:JavaArchive文件,是一种归档文件格式,用于将多个Java类文件、资源文件和元数据打包成一个文件。通常用于分发和部署Java应用程序、库或组件。
  4. java.exe:Java程序的执行器,用于执行已编译成的Java字节码文件(.class文件)。
  5. javac.exe:Java编译器,用于编译Java源代码文件(.java文件)成为Java字节码文件(.class文件)。
  6. jar.exe:Java归档工具,用于创建和管理Java归档文件(.jar文件),可以将多个.class文件打包成一个可执行的JAR文件。
  7. javadoc.exe:Java文档生成工具,用于根据源代码中的注释生成API文档,将Java代码注释转换为HTML格式的文档。
  8. jdb.exe:Java调试器,用于在调试Java程序时启动Java调试器,允许暂停程序、检查变量值、设置断点等操作。
  9. javap.exe:Java反汇编器,用于反编译Java字节码文件(.class文件)成为Java源代码的形式,可以查看.class文件的内容,了解其中包含的类、方法、字段等信息。

一个Java程序开发通常如下:编写.java源文件,使用javac.exe编译成.class文件,使用java.exe执行.class文件(不能带.class后缀,直接java 类名)。

基本数据类型

  1. 整型(Integer Types):
    • byte:8位,有符号,范围为 -128 到 127。
    • short:16位,有符号,范围为 -32,768 到 32,767。
    • int:32位,有符号,范围为 -2^31 到 2^31 - 1。
    • long:64位,有符号,范围为 -2^63 到 2^63 - 1。123L
  2. 浮点型(Floating-Point Types):
    • float:32位,单精度浮点数,范围为大约 1.4e-45 到 3.4e+38,精确度为约 7 位小数。12.2f
    • double:64位,双精度浮点数,范围为大约 4.9e-324 到 1.8e+308,精确度为约 15 位小数。
  3. 字符型(Character Type):
    • char:16位,Unicode字符,范围为 ‘\u0000’(即 0)到 ‘\uffff’(即 65,535)。
  4. 布尔型(Boolean Type):
    • boolean:表示 true 或 false 值。

易错:image.png
image.png

引用数据类型

  1. 类(Class):类是用户定义的数据类型,用于创建对象。类包含属性(字段)和方法,可以通过实例化(创建对象)来访问它们。
  2. 接口(Interface):接口是一种抽象数据类型,用于定义类应该实现的方法。类可以实现一个或多个接口,以达到实现多态性和代码复用的目的。
  3. 数组(Array):数组是一组相同类型的数据元素的集合。数组在内存中是连续存储的,可以通过索引访问其中的元素。
  4. 枚举(Enum):枚举是一种特殊的类,用于定义一组命名的常量。枚举常量通常用于表示有限的一组可能值,如星期几、月份等。
  5. 字符串(String):字符串是Java中的特殊对象,用于表示文本数据。字符串是不可变的,可以进行各种操作,如连接、截取、替换等。
  6. 包装类(Wrapper Classes):包装类是一种将基本数据类型封装为对象的类。Java提供了一组包装类,如Integer、Double、Boolean等,用于在需要对象的上下文中使用基本数据类型。
  7. 自定义引用数据类型:除了以上提到的内置引用数据类型外,开发人员还可以创建自定义的引用数据类型,通过定义类和接口来实现自己的数据结构和算法。

控制台输入

import java.util.Scanner;class UseScanner {public static void main(String[] args) {Scanner input = new Scanner(System.in);System.out.println("Input your name: ");String name = input.next();	// 取字符串System.out.println("OK~ next... input your age: ");int age = input.nextInt();	// 取整数System.out.println("Hello " + name + ". And your age is " + age + ". Choose A or B please.");char a = input.next().charAt(0);	// 取字符串第0个字System.out.println("You choose " + a);input.close();}
}

Java特别注意

  1. switch语句中允许接受byte、short、int、char、String作为变量,但不支持long

数组

class UseArray {public static void main(String[] args) {int[] arr; // 声明数组arr = new int[5]; // 分配空间int[] arr2 = { 1, 2, 3, 4, 5 }; // 声明,并(包含分配空间)赋值printArray(arr);System.out.println();printArray(arr2);}static void printArray(int[] arr) {for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}}
}
class UseArray {public static void main(String[] args) {int[] arr = { 1, 2, 3 };// 拷贝扩容arr = Arrays.copyOf(arr, 10);printArray(arr);// 也能截取arr = Arrays.copyOf(arr, 2);printArray(arr);}static void printArray(int[] arr) {System.out.println(Arrays.toString(arr));}
}
import java.util.Arrays;class UseArray {public static void main(String[] args) {int[] arr = { 1, 2, 3 };printArray(arr);arr = extendArray(arr);printArray(arr);addArray(arr);printArray(arr);}static void printArray(int[] arr) {System.out.println(Arrays.toString(arr));}// 传入的是arr所指的地址static void addArray(int[] arr) {arr[0] = 10086;}static void extendArray(int[] arr) {arr = Arrays.copyOf(arr, 10);return arr;}}

可变长参数

只能放最后一个参数位置,作为数组形式使用。

class UseArray {public static void main(String[] args) {System.out.println(sumup("Hello", 1, 2, 3, 4, 5, 6, 7));}public static int sumup(String str, int... nums) {int sum = 0;System.out.println("Input String: " + str);for (int i = 0; i < nums.length; i++) {sum += nums[i];}return sum;}}

二维数组

class UseArray {public static void main(String[] args) {int[][] arrs1 = new int[3][5];arrs1[0][0] = 0;printArrays(arrs1);int[][] arrs2 = new int[3][];arrs2[0] = new int[5];arrs2[1] = new int[3];arrs2[2] = new int[1];printArrays(arrs2);int[][] arrs3 = { { 1, 2, 3 }, { 2, 3 }, { 3 } };printArrays(arrs3);return;}public static void printArrays(int[][] arrs) {for (int i = 0; i < arrs.length; i++) {for (int j = 0; j < arrs[i].length; j++)System.out.print(arrs[i][j] + " ");System.out.println();}System.err.println("--------------");return;}}

面向对象基础

public class Person {String name;int age;public void speak(String words) {System.out.println(name + "say: " + words);}public void jump() {System.out.println(name + "jumps to " + age);}
}
public class Test {public static void main(String[] args) {Person person = new Person();person.name = "小明";person.age = 18;person.speak("哈哈哈");person.jump();}
}
  1. 类由成员变量和方法组成
  2. 类中定义的变量是成员变量,实例化后存在堆空间中,创建后就有默认值,不会因为没有初始化成员变量而报错。
  3. 局部变量的优先级高于成员变量,在类方法中的同名局部变量会先于成员变量。如果在方法中需要使用成员变量,需要加上this.来访问。

方法重载

一个类中定义多个相同名称的方法,但是参数列表不同(类型、顺序、个数不同都算不同)。这与形参名、方法访问修饰符、返回值类型无关!
可以参考println()函数的实现,有很多方法重载的例子。、

 public void println(boolean x) {if (getClass() == PrintStream.class) {writeln(String.valueOf(x));} else {synchronized (this) {print(x);newLine();}}
}
public void println(char x) {if (getClass() == PrintStream.class) {writeln(String.valueOf(x));} else {synchronized (this) {print(x);newLine();}}
}

构造方法

类中的特殊方法,与类名同名。
没有返回值类型,只在创建对象时调用,无法通过方法调用。
没有在类中显式定义构造方法,由编译器提供无参构造方法。
构造方法也可以重载!在定义带参构造后需要补充无参构造!

public class Person {String name;int age;public Person() {System.out.println("Person created!");}public Person(String name) {this.name = name;}public void speak(String words) {System.out.println(name + "say: " + words);}public void jump() {System.out.println(name + "jumps to " + age);}
}

对象的创建步骤

image.png

this关键字

指向当前实例对象。实际是对象在虚拟机中的堆地址(在new的时候就已经确定)

  1. 在类方法中,可以避免与局部同名变量冲突。用于调用成员变量/方法。
  2. 构造方法内自调用this()
public class Person {String name;int age;public Person() {System.out.println("Person created!");}public Person(String name) {this.name = name;}public Person(String name, int age) {this(name);this.age = age;}public void speak(String words) {System.out.println(name + "say: " + words);}public void jump() {System.out.println(name + "jumps to " + age);}
}

封装

隐藏必要的对象内部实现细节,控制对象属性、方法的使用与修改权限。
使用访问修饰符private(私有,仅本类可见)。
属性的访问与修改使用getter和setter。

public class Person {String name;int age;private int score;public void setScore(int score) {if (score >= 0 && score <= 100)this.score = score;elsethis.score = 0;}public int getScore() {return this.score;}
}

继承

使用extends关键字继承父类,实例化子类时,会先调用父类的构造方法,然后调用子类的构造方法。
默认会调用无参父类构造,如果需要调用带参构造,使用super(a,b,c...)调用。
子类创建对象时并没有创建父类对象,只是在子类空间中创建了super指向的父类空间,所以只有一个子类对象实例。

public class Animal {private String name;int age;private double price;public Animal() {System.out.println("Animal Created!");}public Animal(String name) {System.out.println("Animal with name Created!");setName(name);}public Animal(String name, int age, double price) {this.name = name;this.age = age;this.price = price;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}}
public class Dog extends Animal {int age;public Dog() {super("MAKA");System.out.println("Dog created!");this.age = 233;super.age = 666;}public void speak() {System.out.println(getName() + " wang wang!");}}
public class Test {public static void main(String[] args) {Dog pt = new Dog();System.out.println(pt.age);pt.speak();return;}
}
// Animal with name Created!
// Dog created!
// 233
// MAKA wang wang!

属性的继承

父类的所有属性都可以被继承,但是私有属性不能被访问。
当子类和父类有同名属性时,通过super关键字区分,没标注this/super优先访问this的。
image.png

public class Sup {int a;int b;}
public class Sub extends Sup {int b;public void speak() {System.out.println("a: " + a);System.out.println("this.b: " + this.b);System.out.println("super.b: " + super.b);}
}
public class Test {public static void main(String[] args) {Sub sub = new Sub();sub.a = 1;sub.b = 2;sub.speak();return;}
}// a: 1
// this.b: 2
// super.b: 0

方法的覆盖(重写)

当父类提供的方法无法满足子类需求时,对父类相同的方法(包括方法名和参数列表结构完全一致)覆盖。
子类覆盖的方法不能比父类的方法可见性小。父类私有的方法不会被重写(相当于不可见)。
子类返回值类型只能与父类一样或者是父类的子类和null,如果是基本数据类型,需要完全一致。

public class Sup {int a;int b;Sup speak() {return new Sub();}Sub speak(String words) {System.out.println("233");return new Sub();}}
public class Sub extends Sup {int b;Sub speak(String words) {super.speak(words);System.out.println("666");return new Sub();}
}
public class Test {public static void main(String[] args) {Sub sub = new Sub();sub.a = 1;sub.b = 2;sub.speak();sub.speak("");return;}
}
// 233
// 666

访问修饰符

image.png

多态

父类引用指向子类对象,产生了多态。(向上转型、里氏替换)
要求有继承关系,多态只能调用父类有的属性、方法,不能调用子类有的。
如果子类有父类方法的重写,则会调用子类的重写方法。
Pet pet = new Dog();
使用场景1:父类作为方法的形参实现多态,使得方法参数类型更宽泛(能用多个子类作为参数类型)

public class Animal {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public void eat() {System.out.println("Animal eat what?");}public void feed(Animal animal) {animal.eat();	// 实际上是调用子类的eat重写方法}}
public class Dog extends Animal {public void eat() {System.out.println("Dog eat something!");}
}
public class Cat extends Animal {public void eat() {System.out.println("Cat eat fish!");}
}
public class Test {public static void main(String[] args) {Animal dog = new Dog();dog.eat();Animal cat = new Cat();cat.eat();}
}
// Dog eat something!
// Cat eat fish!

使用场景2:父类作为方法的返回值实现多态,使得方法返回不同的子类对象(能用多个子类作为返回值)

public class Animal {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public void eat() {System.out.println("Animal eat what?");}public void feed(Animal animal) {animal.eat();}public Animal getAnimal(String type) {if (type.equals("Dog"))return new Dog();if (type.equals("Cat"))return new Cat();return null;}
}
public class Test {public static void main(String[] args) {Animal animal = new Animal();animal = animal.getAnimal("Cat");animal.eat();}
}
// Cat eat fish!

向下转型

父类无法调用子类的特有方法,需要强转(向下转型)后才能调用。要保证强转后的子类确实有这个方法。

public class Test {public static void main(String[] args) {Animal animal = new Cat();if (animal instanceof Cat) {Cat cat = (Cat) animal;cat.eatFish(); // Cat独有的方法}}
}

抽象类和抽象方法

https://www.bilibili.com/video/BV1994y1r7uV/?p=83&spm_id_from=pageDriver&vd_source=9cf1572a869a6a64c75ab4bdbe55f984

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

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

相关文章

【白话前端】JS库的作用和常见的九种类型—值得收藏

js库就好比预制菜&#xff0c;我们想吃美食没必要从买菜、择菜、炒菜开始&#xff0c;直接加工就行。 一、什么是JS库 JS库&#xff08;JavaScript Library&#xff09;是指一组封装好的函数、方法、类等&#xff0c;用于简化开发者的编程工作。它们通常提供了常用的功能和算…

Android ·移动应用开发 创建第一个Android项目

文章目录 一、创建第一个Android项目1.1 准备好Android Studio1.2 运行程序1.3 程序结构是什么app下的结构res - 子目录&#xff08;所有图片、布局、字符串等资源&#xff09;AndroidManifest.xml 有四大组件&#xff0c;程序添加权限声明 Project下的结构 二、开发android时&…

【ArcGIS Pro二次开发】(79):符号系统_CIMUniqueValueRenderer

CIMUniqueValueRenderer是ArcGIS Pro SDK中的一个类&#xff0c;用于创建唯一值渲染器&#xff08;Unique Value Renderer&#xff09;。 在ArcGIS Pro中长这样&#xff1a; 通过对CIMUniqueValueRenderer的操作&#xff0c;可以对符号系统进行更改&#xff0c;实现很多功能。…

尚硅谷最新Node.js 学习笔记(一)

目录 一、Nodejs入门 1.1、为什么要学习Nodejs&#xff1f; 1.2、Nodejs是什么&#xff1f; 1.3、Nodejs的作用 1.4、Nodejs安装 1.5、Nodejs初体验 1.6、编码注意事项 二、Buffer&#xff08;缓冲器&#xff09; 2.1、概念 2.2、特点 2.3、使用 创建Buffer Buffe…

Cocos2dx-lua ScrollView[一]基础篇

一.ScrollView概述 cocos游戏中ScrollView控件大量使用,95%以上的项目都会使用ScrollView,个别游戏可能全部使用翻页的滑动效果。如果想要精通Cocos的UI开发,精通ScrollView控件非常关键,因此对ScrollView的使用进行总结很有必要。 下文缩写说明:sv = ScrollView, item代…

嵌入式Linux网络编程入门:轻松构建网络通信

大家好&#xff0c;今天给大家介绍嵌入式Linux网络编程入门&#xff1a;轻松构建网络通信&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 为什么选择嵌入式Linux网络编程&#x…

vue3+ts+vite+uniapp项目常见问题

vue3tsvite中""路径失效的问题 ""需要进行配置&#xff1a; 首先npm install types/node --save-dev&#xff08;需要用到node其中的path&#xff09;接着在vite.config.ts配置文件中进行配置&#xff1a; 引入 import path from ‘path’&#xff0c;然…

Imgui(2) | macOS 绘制 CPU 占用率曲线

Imgui(2) | macOS 绘制 CPU 占用率曲线 文章目录 Imgui(2) | macOS 绘制 CPU 占用率曲线0. 简介1. 绘制曲线 - 以正弦函数为例1.1 基于 sf::RectangleShape 的渲染 - 不好看&#xff0c;效率低1.2 基于 sf::VertexArray 的绘制 2. 获取和绘制所有 CPU 的占用率2.1 测试程序 - 用…

LeetCode Python - 16.最接近的三数之和

目录 题目答案运行结果 题目 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数&#xff0c;使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 示例 1&#xff1a; 输入&#xff1a;nums [-1,2,1,-4],…

基于轻量级卷积神经网络模型MobileNet开发构建基于GTSRB数据集的道路交通标识识别系统

相信经常需要开车出行的人对于各种各样的道路交通标识定是不陌生的&#xff0c;但是对于经常不开车的人来说生活中出现的形形色色的道路交通标识就未必都能认出来了&#xff0c;本文的主要目的就是想要基于CNN来开发构建道路交通标识识别分析系统&#xff0c;实现看图识标&…

谷歌浏览器安装扩展程序axure-chrome-extension

注&#xff1a; 文末附扩展附件&#xff1a;axure-chrome-extension_v0.7.0.crx 1、安装扩展程序axure-chrome-extension 找到axure-chrome-extension.crx&#xff0c;把axure-chrome-extension.crx后缀改为zip&#xff0c;然后解压&#xff0c;得到一个文件夹 2、打开谷歌浏览…

枚举知识点解析

枚举是什么&#xff1f;枚举就是列举&#xff0c; 将东西一一列举出来。 生活中有许多地方需要用到枚举&#xff0c; 比如一年有12个月&#xff0c;一星期有7天&#xff0c; 这些都需要进行枚举。 那么&#xff0c; 如何进行枚举的定义呢&#xff1f; 如下 枚举中的值是一种…

ubuntu22.04@laptop OpenCV Get Started: 008_image_filtering_using_convolution

ubuntu22.04laptop OpenCV Get Started: 008_image_filtering_using_convolution 1. 源由2. convolution应用Demo2.1 C应用Demo2.2 Python应用Demo 3. 重点分析3.1 identity矩阵3.2 all ones 5x5矩阵3.3 blur 5x5矩阵3.4 GaussianBlur 5x5矩阵3.5 medianBlur 5x5矩阵3.6 Sharpe…

Spring 用法学习总结(一)之基于 XML 注入属性

百度网盘&#xff1a; &#x1f449; Spring学习书籍链接 Spring学习 1 Spring框架概述2 Spring容器3 基于XML方式创建对象4 基于XML方式注入属性4.1 通过set方法注入属性4.2 通过构造器注入属性4.3 使用p命名空间注入属性4.4 注入bean与自动装配4.5 注入集合4.6 注入外部属性…

C# Winform .net6自绘的圆形进度条

using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms;namespace Net6_GeneralUiWinFrm {public class CircularProgressBar : Control{private int progress 0;private int borderWidth 20; // 增加的边框宽度public int Progr…

CTFshow web(php文件上传155-158)

web155 老样子&#xff0c;还是那个后端检测。 知识点&#xff1a; auto_append_file 是 PHP 配置选项之一&#xff0c;在 PHP 脚本执行结束后自动追加执行指定的文件。 当 auto_append_file 配置被设置为一个文件路径时&#xff0c;PHP 将在执行完脚本文件的所有代码后&…

探索IDE的世界:什么是IDE?以及适合新手的IDE推荐

引言 在编程的世界里&#xff0c;集成开发环境&#xff08;IDE&#xff09;是我们日常工作的重要工具。无论是初学者还是经验丰富的开发者&#xff0c;一个好的IDE都能极大地提高我们的编程效率。那么&#xff0c;什么是IDE呢&#xff1f;对于新手来说&#xff0c;又应该选择哪…

OpenGL-ES 学习(2)---- DepthTest

深度测试 OpenGL-ES 深度测试是指在片段着色器执行之后&#xff0c;利用深度缓冲区所保存的深度值决定当前片段是否被丢弃的过程 深度缓冲区通常和颜色缓冲区有着相同的宽度和高度&#xff0c;一般由窗口系统自动创建并将其深度值存储为 16、 24 或 32 位浮点数。(注意只保存…

红队笔记Day3-->隧道上线不出网机器

昨天讲了通过代理的形式&#xff08;端口转发&#xff09;实现了上线不出网的机器&#xff0c;那么今天就来讲一下如何通过隧道上线不出网机器 目录 1.网络拓扑 2.开始做隧道&#xff1f;No&#xff01;&#xff01;&#xff01; 3.icmp隧道 4.HTTP隧道 5.SSH隧道 1.什么…

HarmonyOS鸿蒙学习基础篇 - 自定义组件(一)

前言 在ArkUI中&#xff0c;UI显示的内容均为组件&#xff0c;由框架直接提供的称为系统组件&#xff0c;由开发者定义的称为自定义组件。在进行 UI 界面开发时&#xff0c;通常不是简单的将系统组件进行组合使用&#xff0c;而是需要考虑代码可复用性、业务逻辑与UI分离&#…