JavaSE总结(二)

简介: JavaSE总结

二维数组


二维数组本质上也就是一维数组, 只不过每个元素又是一个一维数组。

数据类型[][] 数组名称 = new 数据类型 [行数][列数] { 初始化数据 };

例如:

    public static void main(String[] args) {
        int[][] arr = {
                {1, 2, 3, 4},
                {5, 6, 7, 8},
                {9, 10, 11, 12}  
        };    //二维数组的每一行,相当于一维数组的每个元素
        for(int row = 0; row < arr.length; row++) {
            for (int col = 0; col < arr[row].length; col++) {
                System.out.printf("%d\t", arr[row][col]);
            }
            System.out.println("");
        }
    }

输出:

1 2 3 4

5 6 7 8

9 10 11 12

二维数组就类似于一个特殊的一维数组,每个元素相当于一个一维数组,每个一维数组的大小可以不同。


类和对象


什么是类?

类就是描述某个对象的一些属性和行为。


成员变量


成员变量定义在方法的外部,类的内部。

普通成员变量:

属于对象的,对象的引用与点号的结合进行访问,所占用的内存是在对象中的。

静态成员变量:

加static关键字,表面当前成员变量是属于类的变量。类变量是存放在方法区的。


成员方法


普通成员方法:属于对象的,对象的引用与点号的结合进行访问。

静态成员方法:不依赖于对象,直接可以通过类名点出来。

注意:不能在静态方法中使用非静态成员变量。(因为非静态成员变量依赖于对象


对象


通过描述,产生一个真正的实体对象,主要通过new关键字来实例化对象。

一个类可以实例化多个对象。


this 关键字


this是当前对象的引用,三种用法:

1.引用当前对象的变量:this.data

2.引用当前对象的方法:this.fun()

3.引用当前对象的构造方法:this()


构造方法


方法名与类名一样,没有返回值。

作用:实例化对象的时候调用,同时可以初始化我们的成员变量。

我们有两种初始化:

就地初始化:创建变量时赋值。

默认初始化:创建变量时不赋值。(变量是默认值,不同数据类型默认值是不同的)


当我们没有添加任何构造方法时,编译器会帮我们提供一个不带参数的构造方法,而当我们添加了构造方法时,编译器就不会再提供构造方法了。

注意:构造方法可以重载。


封装


含义:指将内部的实现细节进行了隐藏,不要让类外直接获取到我不想让它获取到的东西。从代码层面来讲,就是使用关键字private进行修饰。

我们可以使用get和set方法来对封装的数据进行访问。


代码块


普通代码块:定义在方法中的代码块。

构造代码块:定义在类中的代码块(加修饰符)。也叫:实例代码块。构造代码块一般用于初始化实例成员变量。

静态代码块:使用static定义的代码块称为静态代码块。一般用于初始化静态成员变量。


new对象时,静态代码块和非静态代码块与构造方法的执行顺序:先是静态的执行(只执行一次,下次就不执行了),然后是非静态的,最后是构造方法执行。


内部类


即在类里再定义一个类。


非静态内部类


public class OutClass {
    private int a;
    static int b;
    int c;
    public void methodA() {
        a = 10;
        System.out.println(a);
    }
    public static void methodB() {
        System.out.println(b);
    }
    // 实例内部类:未被static修饰
    class InnerClass {
        int c;
        public void methodInner() {
    // 在实例内部类中可以直接访问外部类中:任意访问限定符修饰的成员
            a = 100;
            b = 200;
            methodA();
            methodB();
    // 如果外部类和实例内部类中具有相同名称成员时,优先访问的是内部类自己的
            c = 300;
            System.out.println(c);
    // 如果要访问外部类同名成员时候,必须:外部类名称.this.同名成员名字
            OutClass.this.c = 400;
            System.out.println(OutClass.this.c);
        }
    }
    public static void main(String[] args) {
    // 外部类:对象创建 以及 成员访问
        OutClass outClass = new OutClass();
        System.out.println(outClass.a);
        System.out.println(OutClass.b);
        System.out.println(outClass.c);
        outClass.methodA();
        outClass.methodB();
        System.out.println("=============实例内部类的访问=============");
    // 要访问实例内部类中成员,必须要创建实例内部类的对象
    // 而普通内部类定义与外部类成员定义位置相同,因此创建实例内部类对象时必须借助外部类
    // 创建实例内部类对象
        OutClass.InnerClass innerClass1 = new OutClass().new InnerClass();
    // 上述语法比较怪异,也可以先将外部类对象先创建出来,然后再创建实例内部类对象
        OutClass.InnerClass innerClass2 = outClass.new InnerClass();
        innerClass2.methodInner();
    }
}


注意:


  1. 外部类中的任何成员都可以在实例内部类方法中直接访问
  2. 实例内部类所处的位置与外部类成员位置相同,因此也受public、private等访问限定符的约束
  3. 在实例内部类方法中访问同名的成员时,优先访问自己的,如果要访问外部类同名的成员,必须:外部类名称.this.同名成员 来访问
  4. 实例内部类对象必须在先有外部类对象前提下才能创建
  5. 实例内部类的非静态方法中包含了一个指向外部类对象的引用
  6. 外部类中,不能直接访问实例内部类中的成员,如果要访问必须先要创建内部类的对象。


静态内部类


被static修饰的内部成员类称为静态内部类。

public class OutClass {
    private int a;
    static int b;
    public void methodA(){
        a = 10;
        System.out.println(a);
    }
    public static void methodB(){
        System.out.println(b);
    } 
    // 静态内部类:被static修饰的成员内部类
    static class InnerClass{
        public void methodInner(){
        // 在内部类中只能访问外部类的静态成员
            // a = 100; // 编译失败,因为a不是静态变量
            b =200;
        // methodA(); // 编译失败,因为methodB()不是静态成员方法
            methodB();
        }
    }
    public static void main(String[] args) {
    // 静态内部类对象创建 & 成员访问
        OutClass.InnerClass innerClass = new OutClass.InnerClass();
        innerClass.methodInner();
    }
}


注意:

  1. 在静态内部类中只能访问外部类中的静态成员
  2. 创建静态内部类对象时,不需要先创建外部类对象


总结:如果设计的内部类依赖于外部类对象,那就设计成非静态的内部类,反之就设计成静态内部类。

还有一个匿名内部类,就是没有名字的内部类,多用于接口的实现。


继承和多态


继承


class A extends B {
}


为什么要继承呢?

继承是共性的抽取,从而达到对代码的复用。

子类继承父类的所有成员变量和方法(非静态的)。


super 关键字


该关键字主要作用:在子类方法中访问父类的成员。

super 的几种用法:

访问父类的成员变量:super.data

访问父类的方法:super.func()

调用父类的构造方法:super()


super 与 this 的区别


super和this都可以在成员方法中访问:成员变量和调用其他的成员函数,都可以作为构造方法的第一条语句,那它们之间有什么区别呢?

同:

  1. 都是Java中的关键字
  2. 只能在类的非静态方法中使用,用来访问非静态成员方法和字段
  3. 在构造方法中调用时,必须是构造方法中的第一条语句,并且不能同时存在


异:


  1. this是当前对象的引用,当前对象即调用实例方法的对象,super相当于是子类对象中从父类继承下来部分成员的引用
  2. 在非静态成员方法中,this用来访问本类的方法和属性,super用来访问父类继承下来的方法和属性
  3. 在构造方法中:this(…)用于调用本类构造方法,super(…)用于调用父类构造方法,两种调用不能同时在构造 方法中出现
  4. 构造方法中一定会存在super(…)的调用,用户没有写编译器也会增加,但是this(…)用户不写则没有


代码块执行顺序


class Person {
    public String name;
    public int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("Person:构造方法执行");
    }
    {
        System.out.println("Person:实例代码块执行");
    }
    static {
        System.out.println("Person:静态代码块执行");
    }
}
class Student extends Person{
    public Student(String name,int age) {
        super(name,age);
        System.out.println("Student:构造方法执行");
    }
    {
        System.out.println("Student:实例代码块执行");
    }
    static {
        System.out.println("Student:静态代码块执行");
    }
}
public class TestDemo4 {
    public static void main(String[] args) {
        Student student1 = new Student("张三", 15);
        System.out.println("===========================");
        Student student2 = new Student("李四", 35);
    }
}


输出:



1、父类静态代码块优先于子类静态代码块执行,且是最早执行

2、父类实例代码块和父类构造方法紧接着执行

3、子类的实例代码块和子类构造方法紧接着再执行

4、第二次实例化子类对象时,父类和子类的静态代码块都将不会再执行


访问修饰限定符



final 关键字


final关键可以用来修饰变量、成员方法以及类。

注意三个点:

  1. 修饰变量或字段,表示常量(即不能修改)
  2. 修饰类:表示此类不能被继承
  3. 修饰方法:表示该方法不能被重写


多态


啥是多态?

就是一个引用,引用的对象不一样, 所表现的行为不一样, 这种思想被称为多态.


向上转型


class Animal {
}
class Cat extends Animal {
}


父类类型引用子类对象, 这便是向上转型.

Animal animal = new Cat();

缺点 : 只能通过父类引用 访问父类自己的成员.

什么时候发生向上转型呢?

第一种就是直接赋值了 :

Animal animal = new Cat();

还有就是方法的传参 , 就是将子类对象传入父类类型参数里 :

public static void fun(Animal animal) {   //这里传入Cat类型参数,就是向上转型了
}

再就是方法的返回值了 :

public static Animal fun(Animal animal) {
  return new Cat();
}

关于动态绑定 : 通过父类引用 , 调用子类重写了的父类的方法.


相关文章
|
存储 监控 架构师
十年业务开发总结,如何做好高效高质量的价值交付
软件交付是一个非常复杂的过程和体系,需要保障好每个阶段的质量和效率才能保障最终的质量和效率。本文将尝试从需求交付的前、中、后三个环节来阐述一下如何做高效高质量的价值交付。
142722 3
算法导论(第三版)具体算法解析与理解
算法导论(第三版)具体算法解析与理解
|
4天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
15天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1312 5
|
2天前
|
监控 JavaScript Java
基于大模型技术的反欺诈知识问答系统
随着互联网与金融科技发展,网络欺诈频发,构建高效反欺诈平台成为迫切需求。本文基于Java、Vue.js、Spring Boot与MySQL技术,设计实现集欺诈识别、宣传教育、用户互动于一体的反欺诈系统,提升公众防范意识,助力企业合规与用户权益保护。
|
14天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1356 87
|
2天前
|
JavaScript Java 大数据
基于JavaWeb的销售管理系统设计系统
本系统基于Java、MySQL、Spring Boot与Vue.js技术,构建高效、可扩展的销售管理平台,实现客户、订单、数据可视化等全流程自动化管理,提升企业运营效率与决策能力。
|
3天前
|
弹性计算 安全 数据安全/隐私保护
2025年阿里云域名备案流程(新手图文详细流程)
本文图文详解阿里云账号注册、服务器租赁、域名购买及备案全流程,涵盖企业实名认证、信息模板创建、域名备案提交与管局审核等关键步骤,助您快速完成网站上线前的准备工作。
192 82
2025年阿里云域名备案流程(新手图文详细流程)