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

news2024/11/27 0:32:38

默认学过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;
        else
            this.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.coloradmin.cn/o/1448864.html

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

相关文章

腾讯云4核8G服务器3年600元?

腾讯云4核8G服务器3年600元&#xff1f;目前的价格是轻量应用服务器4核8G12M带宽一年446元、646元15个月&#xff0c;云服务器CVM标准型S5实例4核8G配置价格15个月1437.3元&#xff0c;5年6490.44元&#xff0c;标准型SA2服务器1444.8元一年&#xff0c;在txy.wiki可以查询详细…

4核16G服务器阿里云是怎么收费的?贵吗?

阿里云4核16G服务器优惠价格ECS云服务器经济型e实例26元1个月、149元半年、79元3个月&#xff0c;4核16G通用算力u1服务器、通用型g7、通用型g8i、AMD通用型g8a、性能增强通用型g8ae、高主频通用型hfg8i、AMD通用型g7a、内存型r7p等均提供4核16G配置。阿里云服务器网aliyunfuwu…

第一篇【传奇开心果系列】Python的pyttsx3库技术点案例示例:文本转换语言

传奇开心果短博文系列 系列短博文目录Python的pyttsx3库技术点案例示例系列 短博文目录前言一、pyttsx3主要特点和功能介绍二、pyttsx3文字转语音操作步骤介绍三、多平台支持介绍和示例代码四、多语言支持介绍和示例代码五、自定义语言引擎介绍和示例代码六、调整语速和音量介绍…

DNS出现问题了,怎么处理?-提供完整解决方案

DNS作用 将域名(网址)解析为IP地址 DNS的作用是将域名(网址)解析为IP地址,方便用户访问互联网。通过DNS,用户可以轻松地通过域名来获取对应的IP地址,无需记住复杂的数字串。 负载均衡 负载均衡是DNS的一种功能,它能够将访问请求转发到不同的服务器,从而实现负载均衡。…

OpenAI ChatGPT 记忆功能怎么实现?

你的聊天助手现在能“记住”你的对话了&#xff01; 2月14日凌晨&#xff0c;OpenAI宣布正在测试ChatGPT的新功能——记住用户提问内容&#xff0c;并自由控制内存。这意味着&#xff0c;ChatGPT能帮你记住那些重要的聊天内容&#xff0c;让你的对话更流畅、更自然。 想象一下…

一周学会Django5 Python Web开发-项目配置settings.py文件-基本配置

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计17条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

心法利器[107] onnx和tensorRT的bert加速方案记录

心法利器 本栏目主要和大家一起讨论近期自己学习的心得和体会&#xff0c;与大家一起成长。具体介绍&#xff1a;仓颉专项&#xff1a;飞机大炮我都会&#xff0c;利器心法我还有。 2023年新一版的文章合集已经发布&#xff0c;获取方式看这里&#xff1a;又添十万字-CS的陋室2…

智慧园区的可视化大屏,比你见过的更漂亮。

智慧园区云平台的建设旨在建立统一的工作流程&#xff0c;协同、调度和共享机制&#xff0c;以云平台为枢纽&#xff0c;形成一个紧密联系的整体&#xff0c;获得高效、协同、互动、整体的效益。

算法学习——LeetCode力扣贪心篇2

算法学习——LeetCode力扣贪心篇2 45. 跳跃游戏 II 45. 跳跃游戏 II - 力扣&#xff08;LeetCode&#xff09; 描述 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 num…

奇异递归模板模式应用1-对象计数

需求&#xff1a;有时遇到某些类特征相似而又没有共同的父类&#xff0c;希望能够知道这些类的创建数量之和。 思路&#xff1a;将这些类继承自同一个计数类&#xff0c;共享计数变量s_createCount信息&#xff0c;实现如下&#xff1a; class Counter { public:Counter() {s_…

幻兽帕鲁在腾讯云服务器中怎么修改配置?游戏难度、经验倍率等等

幻兽帕鲁的游戏配置文件应该是PalWorldSettings 找到这个文件&#xff0c;就可以修改里面的参数。 如果你是用腾讯云一键部署的幻兽帕鲁&#xff0c;则可以到轻量应用服务器管理界面&#xff0c;找到“应用管理”&#xff0c;里面有个可视化修改游戏参数的面板设置&#xff0…

Shell 学习笔记(三)-shell变量

Shell 语言是一种动态类型和弱类型语言, 因此,在Shell中无需显示地声明变量, 且变量的类型会根据不同的操作符而发生变化. 静态类型语言: 在程序编译期间就确定变量类型的语言, 如java, C等 动态类型语言: 在程序运行期间才确定变量类型的语言, 如PHP, Python等. 一 shell变量…

vue学习106-120

创建项目p106 router&#xff0c;store和app.vue不用删 清一下router里的路由配置 vant组件库p107 目标&#xff1a;认识第三方vue组件库vant-ui&#xff08;cv战士&#xff09; 封装好了的组件整合在一起就是组件库 http://vant-contrib.gitee.io/vant/v2/#/zh-CN/ vue2用va…

第四篇:数据库安装(命令行)

数据库命令行界面安装 mysql官网&#xff0c;下载解压 https://dev.mysql.com/downloads/mysql/ 在安装之前先去检查一下,本地计算机的用户合组 winr(输入lusrmgr.msc) -点击组-双击administrator 如果只有这两个,那么就添加一下,提高网络服务的权限(避免出现mysql启动失败) …

MATLAB知识点:randperm函数(★★★★★)将一个数字序列进行随机打乱

​讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 节选自第3章&#xff1a;课后习题讲解中拓展的函数 在讲解第…

十四、java 异常

文章目录 异常5.1 初识异常5.1.1 NullPointerException5.1.2 NumberFormatException 5.2 异常类5.2.1 Throwable5.2.2 异常类体系5.2.3 自定义异常 5.3 异常处理5.3.1 try/catch匹配5.3.2 重新抛出异常5.3.3 finally5.3.4 try-with-resources5.3.5 throws5.3.6 对比受检和未受检…

五、Mybatis复杂映射开发

1.一对一查询 1.1 一对一查询的模型 用户表和订单表的关系为&#xff0c;一个用户有多个订单&#xff0c;一个订单只从属于一个用户一对一查询的需求&#xff1a;查询一个订单&#xff0c;与此同时查询出该订单所属的用户SQL: DROP TABLE IF EXISTS user; CREATE TABLE user …

free pascal:fpwebview 组件通过JSBridge调用本机TTS

从 https://github.com/PierceNg/fpwebview 下载 fpwebview-master.zip 简单易用。 先请看 \fpwebview-master\README.md cd \lazarus\projects\fpwebview-master\demo\js_bidir 学习 js_bidir.lpr &#xff0c;编写 js_bind_speak.lpr 如下&#xff0c;通过JSBridge调用本机…

Java入门高频考查基础知识9(银盛15问万字参考答案)

JAVA刷题专栏&#xff1a;http://t.csdnimg.cn/9qscL 目录 一、Springcloud的工作原理 三、注册中心心跳是几秒 四、消费者是如何发现服务提供者的 五、多个消费者调⽤用同⼀接口&#xff0c;eruka默认的分配⽅式是什么 六、springboot常用注解&#xff0c;及其实现 七、…

pytorch常用激活函数笔记

1. relu函数&#xff1a; 公式&#xff1a; 深层网络内部激活函数常用这个 import matplotlib.pyplot as pltdef relu_fun(x):if x>0:return xelse:return 0x np.random.randn(10) y np.arange(10)plt.plot(y,x)for i ,t in enumerate(x):x[i] relu_fun(t) plt.p…