前端初学java二(类、多态、接口、内部类、泛型)

news2024/10/7 8:30:56

目录

种类

Javabean类

测试类

工具类

类的初始化

构照函数

新建对象的内存图

static

继承

This

Super

虚方法表

@Override

修饰符权限

构造代码块

静态代码块

多态

前提

优点

缺点

示例

抽象方法

抽象类

接口

implements

继承

内部类

成员内部类

静态内部类

局部内部类

匿名内部类

Lambda表达式

泛型

泛型类

泛型方法

泛型接口


种类

Javabean类

不写main方法的类

测试类

含有main方法的类,在该类中可以调用javabean类。

一个java文件中可以定义多个class类,但只能有一个类是public修饰,而且public修饰的类型必须成为代码文件名(实际开发中建议还是一个文件定义一个class类)。

工具类

私有化构造方法,不让外界新建它的对象,成员方法需要定义为静态方便调用。

类的初始化

下面name成员变量未赋值默认值,初始化为null,这一块初始化会和数组默认初始化规律一样。

public class Student {
    String name;
    public void study() {}
}

整数类型(byte、short、int、long):默认初始化值0。

小数类型(float、double):默认初始化值0.0。

字符类型(char):默认初始化值’\u0000’空格。

布尔类型(boolean):默认初始化值false。

引用类型(类、接口、数组、String):默认初始化值null。

构照函数

构造函数和js不同(js中固定名为constructor),它使用方法名和类名完全相同,没有返回值类型也没有void,不能带有return。

如果没有定义构造方法,系统将给出一个默认的无参数构造方法。已有构造方法则不会给出默认的构造方法。构造方法也支持重构。

新建对象的内存图

Student s = new Student();
s.study()

1.加载class文件(在方法区加载,只在该类被第一次new的时候加载,后面再new会直接读取方法区中的类)

2.申明局部变量 (栈内存)

3.在堆内存中开辟一个空间

4.默认初始化成员变量(属性名中未赋值的进行默认值的初始化),

5.显示初始化成员变量(属性名中有赋值的进行赋值初始化)

6.构造方法初始化

7.将堆内存中的地址值赋值给左边的局部变量(栈内存)

8.调用类的方法,调用的是指向方法区中Student类的方法。

static

可以修饰成员方法和成员变量。

被static修饰的成员变量叫静态变量,被该类所有对象共享,可以通过对象名和类名调用(js中只能通过类名调用)。

静态变量存储在静态区(堆内存中)是随类的加载而加载。因为可以通过类名调用,所以是优先于new 对象的出现。

静态方法中无this。

继承

Java只支持单继承(只有一个父类),但可以多层继承(父类也可以继续向上继承)。

Java中所有的类都直接或间接继承于Object(和js类似都继承与Object.prototype)。

子类只能访问父类中的非私有成员。

This

表示当前方法调用者的地址值,this()表示运行本类的构造方法

Super

父类存储空间,super()表示运行父类的构造方法

子类构造方法中未显式调用父类构造方法会默认调用父类中的无参构造方法(相当于第一行中插入了super()),再执行自己。

子类构造方法中未显式调用父类构造方法必须在第一行。

super不能连续调用( super.super错的)。

虚方法表

每个类都有自己的虚方法表,它为类中非private、非static、非final的方法,

每次继承时子类会将父类的虚方法表中的方法加入到自己的虚方法表中(Object类中有5个方法在自己的虚方法表中,由于继承关系所有的类虚方法表长度大于等于5)。

面向对象进阶-06-子类到底能继承父类中的哪些内容_哔哩哔哩_bilibili

当出现重名的成员变量

System.out.println(name)//从局部位置开始往上找
System.out.println(this.name)//从本类成员位置开始往上找
System.out.println(super.name)//从父类成员位置开始往上找

@Override

重写的注解(本质是覆盖了虚方法表中的方法)

子类重写父类方法时:

  1. 返回值类型子类必须小于等于父类
  2. 访问权限子类必须大于等于父类(public>protected>空)

修饰符权限

构造代码块

类中写在成员属性下的只用大括号括起来的语句(相当于没有方法名、修饰符、返回值),这部分代码块会在构造方法执行前默认先执行。

静态代码块

在构造代码块前加上static:static{//代码语句}。

这部分代码只在第一次new该类时执行,用于数据初始化。

多态

父类类型 对象名称 = 子类对象;

同一种类型的对象,在不同的情况下表现出不同的行为。它是面向对象编程中的一个核心概念,主要通过方法的重载和覆盖实现。

前提

1.有继承/实现关系

2.有父类引用指向子类对象

3.有方法重写

优点

方法中使用父类型作为参数,可以接受所有子类对象。

缺点

不能使用子类中特有的方法。

示例

public class Main {
    public static void main(String[] args) {
        Ye p = new Zi();
        System.out.println(p.age);//0
        p.a();//222
    }
}

class Ye{
    public int age=0;
    public void a(){
        System.out.println("000");
    }
}

class Fu extends Ye{
    public int age=1;
    public void a(){
        System.out.println("1111");
    }
}

class Zi extends Fu{
    public int age=2;
    public void a(){
        System.out.println("222");
    }
}

成员变量 编译看左运行看左

编译看左:p.age编译时会查看对p类型定义时的Ye中是否有可继承的age属性。

运行看左:p.age运行是会查看Ye中的age属性。

成员方法 编译看左运行看右

编译看左:p.a()编译时会查看Ye中是否有a方法,没有会报错,可以通过强制类型转换避免标错((Zi)p).a()。

运行看右:p.a()方法运行时,实际访问的是构造时Zi中的函数。

抽象方法

abstract修饰的方法,无方法体。

抽象类

abstract修饰的类,一般都会带有抽象方法。

抽象类不能实例化

抽象类的子类要么重写抽象类中的所有抽象方法,要么是抽象类。

抽象方法所在的类必须是抽象类

接口

Public Interface 接口名{}

接口的子类要么重写接口中的所有抽象方法,要么是抽象类。

接口中成员变量默认使用public static final

成员方法默认使用public abstract修饰。

implements

接口和类之间是实现关系,通过implements关键字表示。

1个类可以实现多个接口public class 类名 implements 接口名1,接口名2(接口可以有重名的,只用重写一次)

继承

接口和接口之间可以单继承也可以多继承,但是在实现类时需要实现该接口以及继承的所有父接口中定义的抽象方法。

JDK8以后接口中可以用default修饰有方法体中的方法,该方法在实现的类中不需要被重写(如果重写的话类中的该方法不能用default修饰)。

如果一个类实现了多个接口,多个接口中存在相同名字的默认方法,那么该类就必须对方法进行重写。

JDK8以后接口中可以用static修饰静态方法,静态方法使用接口名.静态方法名调用。不能重写。

JDK9新增了private修饰接口中的成员方法,如果修饰的为静态方法,表示只能在该接口中的静态方法中调用,如果修饰的为defautl方法,表示可以在default修饰方法中调用。在该接口外都无法调用

内部类

可以直接访问外部类的成员,包括私有的。

外部类访问内部类的成员必须创建内部类的对象。

成员内部类

public class Car {
    String carName;
    class Engine {
        String engineName;
    }
}

可以被private、空、protected、public、static修饰符所修饰。外部访问权限和修饰类方法相同。

JDK16之前成员内部类里不能定义静态变量。

外部创建内部类方式

外部类名.内部类名 对象名 = 外部类对象.内部类对象

public class Main {
    public static void main(String[] args) {
        Ye.Fu obj = new Ye().new Fu();
        System.out.println(obj.age);//1
        obj.a();//1111
    }
}
class Ye{
    public int age=0;
    class Fu {
        public int age=1;
        public void a(){
            System.out.println("1111");
        }
    }
}

在内部类的方法可以通过外部类名.this.成员变量名访问外部类中的成员变量。

public class Main {
    public static void main(String[] args) {
        Ye.Fu obj = new Ye().new Fu();
        obj.show();
    }
}
class Ye{
    public int age=0;
    class Fu {
        public int age=1;
        public void show(){
            int age = 2;
            System.out.println(Ye.this.age);//0
            System.out.println(this.age);//1
            System.out.println(age);//2
        }
    }
}

静态内部类

内部类中以static修饰,只能访问外部类中的静态变量和静态方法,如果想要访问非静态的需要创建对象。

创建内部内对象格式:外部类名.内部类名 对象名 = new 外部类名.内部类名()

局部内部类

将内部类定义在方法里面,类似于方法里面的局部变量。可以用final修饰不能用private等权限修饰符修饰。

外界无法直接使用局部内部类,需要在方法内部创建对象使用。

该类可以直接访问外部类的成员,也可以访问方法内的局部变量。

匿名内部类

New 类名或者接口名(){

       重写方法      

}

public class Main {
    public static void main(String[] args) {
        new Swim(){
            @Override
            public void swim() {
                System.out.println("重写了swim方法");
            }
        };
    }
}
interface Swim {
    public abstract void swim();
}

Lambda表达式

JDK8+

用于简化匿名内部类的书写方式,只能简化函数式接口的匿名内部类的写法。

函数式接口:有且仅有一个抽象方法的接口,接口上方可以加@FunctionalInterface注解。

Lambda的省略规则

  1. 参数类型可以省略不写,
  2. 如果只有一个参数,参数类型可以省略,同时()也可以省略
  3. 如果lambda表达式的方法体只有一行,大括号,分号,return可以省略不写,需要同时省略。
public class Main {
    public static void main(String[] args) {
        Integer[] arr = {2,3,6,1,4,7,8};
        Arrays.sort(arr, new Comparator<Integer>() {
            @Override
            public int compare(Integer a, Integer b) {
                return a-b;
            }
        });
        Arrays.sort(arr,(Integer a,Integer b)->{
            return a-b;
        });
        System.out.println(Arrays.toString(arr));//[1, 2, 3, 4, 6, 7, 8]

    }

}

泛型

可以在编译阶段约束数据类型,只能支持引用数据类型。

不写泛型默认是Object。

运行时是没有泛型的,编译后会进行运行擦除。

泛型类

public class Main {
    public static void main(String[] args) {
        MyArrayList<String> list = new MyArrayList<>();
    }
}
class MyArrayList<T>{}

上面的T对应到new 对象时候的String

泛型方法

public class Main {
    public static void main(String[] args) {
        MyArrayList.addAll(new ArrayList<Integer>(),1,2);
    }
}
class MyArrayList{
    public static <T> void addAll(ArrayList<T> list,T a,T b){
       list.add(a);
       list.add(b);
       System.out.println(list.toString());//[1, 2]
    }
}

泛型不具备继承性,但是数据具备继承性

指定泛型具体类型后,传递数据时,可以传入该类型和他的子类型。但调用方法参数不能是不同泛型变量。

class Ye{}
class Fu extends Ye{}
class Zi extends Fu{}
public class Main {
    public static void main(String args[]) {
        ArrayList<Ye> list1 = new ArrayList();
        ArrayList<Fu> list2 = new ArrayList();
        ArrayList<Zi> list3 = new ArrayList();
        method(list1);
        method(list2);//报错
        method(list3);//报错
        list1.add(new Ye());
        list1.add(new Zi());
        list1.add(new Fu());
    }
    public static void method(ArrayList<Ye> list){}
}

泛型接口

修饰符 interface 接口名<类型>{}

泛型通配符?

?extends T:表示可以传递T或者T的所有子类型

?super T:表示可以传递T或者T的所有父类型。

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

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

相关文章

windows@无密码的本地用户账户相关问题@仅用用户名免密登录远程桌面登录和控制@无密码用户访问共享文件夹以及挂载问题

文章目录 abstract此用户无法登录账户被禁用问题访问共享文件夹时带上凭据错误案例和解决 两类登录方式控制台登录与远程登录的区别为什么限制空密码账户只允许控制台登录相关安全策略如何修改该策略注意事项 启用允许被免密登录功能使用空密码进行远程桌面连接设置远程桌面链接…

巴图制自动化Profinet协议转Modbus协议模块连接PLC和电表通信

1、免编写Modbus轮询程序实现PLC与电表通信的方法 在智能化时代&#xff0c;工业自动控制中的PLC和电表之间的通信是一个常见的需求。传统上&#xff0c;为了使PLC与电表通信&#xff0c;通常需要编写Modbus查询程序来读取和控制数据。然而&#xff0c;使用 巴图制自动化Prof…

Vue项目打包上线

Nginx 是一个高性能的开源HTTP和反向代理服务器&#xff0c;也是一个IMAP/POP3/SMTP代理服务器。它在设计上旨在处理高并发的请求&#xff0c;是一个轻量级、高效能的Web服务器和反向代理服务器&#xff0c;广泛用于提供静态资源、负载均衡、反向代理等功能。 1、下载nginx 2、…

创建kobject

1、kobject介绍 kobject的全称是kernel object&#xff0c;即内核对象。每一个kobject都会对应系统/sys/下的一个目录。 2、相关结构体和api介绍 2.1 struct kobject // include/linux/kobject.h 2.2 kobject_create_and_add kobject_create_and_addkobject_createkobj…

卷积层里的填充和步幅

一、定义 1、对于卷积&#xff0c;我们另一个超参数是核的大小&#xff0c;通常使用的卷积核是33或者55&#xff0c;很少用偶数核 2、填充是为了让输出不变或者变大&#xff0c;是为了在输入不太大&#xff0c;又能使模型足够深的情况下使用 3、填充&#xff1a;在输入周围添…

Vite: 插件流水线之核心编译能力

概述 Vite 在开发阶段实现了一个按需加载的服务器&#xff0c;每一个文件请求进来都会经历一系列的编译流程&#xff0c;然后 Vite 会将编译结果响应给浏览器。在生产环境下&#xff0c;Vite 同样会执行一系列编译过程&#xff0c;将编译结果交给 Rollup 进行模块打包这一系列…

【Docker安装】OpenEuler系统下部署Docker环境

【Docker安装】OpenEuler系统下部署Docker环境 前言一、本次实践介绍1.1 本次实践规划1.2 本次实践简介二、检查本地环境2.1 检查操作系统版本2.2 检查内核版本2.3 检查yum仓库三、卸载Docker四、部署Docker环境4.1 配置yum仓库4.2 检查可用yum仓库4.3 安装Docker4.4 检查Docke…

Pointnet++改进即插即用系列:全网首发GLSA聚合和表示全局和局部空间特征|即插即用,提升特征提取模块性能

简介:1.该教程提供大量的首发改进的方式,降低上手难度,多种结构改进,助力寻找创新点!2.本篇文章对Pointnet++特征提取模块进行改进,加入GLSA,提升性能。3.专栏持续更新,紧随最新的研究内容。 目录 1.理论介绍 2.修改步骤 2.1 步骤一 2.2 步骤二 2.3 步骤三 1.理论介…

运维锅总浅析云原生DevOps工具

本文从Tekton与Kubevela、Jenkins、GitLab CI的区别与联系对常见的云原生DevOps工具进行对比分析&#xff0c;最后给出DevOps工具选型思路。希望对您有所帮助&#xff01; 一、DevOps简介 DevOps是一种结合了软件开发&#xff08;Development&#xff09;和IT运维&#xff08…

CesiumJS【Basic】- #057 绘制纹理填充多边形(Primitive方式)

文章目录 绘制纹理填充多边形(Primitive方式)1 目标2 代码2.1 main.ts绘制纹理填充多边形(Primitive方式) 1 目标 使用Primitive方式绘制绘制纹理填充多边形 2 代码 2.1 main.ts import * as Cesium from cesium;const viewer = new Cesium.Viewer

普元EOS学习笔记-低开实现图书的增删改查

前言 在前一篇《普元EOS学习笔记-创建精简应用》中&#xff0c;我已经创建了EOS精简应用。 我之前说过&#xff0c;EOS精简应用就是自己创建的EOS精简版&#xff0c;该项目中&#xff0c;开发者可以进行低代码开发&#xff0c;也可以进行高代码开发。 本文我就记录一下自己在…

Halcon支持向量机

一 支持向量机 1 支持向量机介绍&#xff1a; 支持向量机(Support Vector Machine&#xff0c;SVM)是Corinna Cortes和Vapnik于1995年首先提出的&#xff0c;它在解决小样本、非线性及高维模式识别表现出许多特有的优势。 2 支持向量机原理: 在n维空间中找到一个分类超平面…

配置Uptime Kuma固定前缀

在做ICT集成项目时&#xff0c;遇到需要对现网接口进行拨测的需求。搜索后尝试使用开源的Uptime Kuma组件完成现网接口拨测。 但该项目有个问题就是默认不支持配置固定前缀&#xff0c;这对现网进行请求转发会造成较大的影响。通过查看该项目的github后找到了问题的解决方案。S…

【C语言】指针经典例题

题1&#xff1a; #include <stdio.h>int main() {int a[5] { 1, 2, 3, 4, 5 };int* ptr (int*)(&a 1);printf("%d,%d", *(a 1), *(ptr - 1));return 0; } //程序的结果是什么&#xff1f; 解答如下&#xff1a; 题2&#xff1a; #include <std…

echarts-wordcloud:打造个性化词云库

前言 在当今信息爆炸的时代&#xff0c;如何从海量的文本数据中提取有用的信息成为了一项重要的任务。词云作为一种直观、易于理解的数据可视化方式&#xff0c;被广泛应用于文本分析和可视化领域。本文将介绍一种基于 echarts-wordcloud 实现的词云库&#xff0c;通过其丰富的…

嵌入式C语言中指针与链表的关系详解

假定给你一块非常小的内存,这块内存只有8字节,这里也没有高级语言,没有操作系统,你操作的数据单位是单个字节,你该怎样读写这块内存呢? 注意这里的限定,再读一遍,没有高级语言,没有操作系统,在这样的限制之下,你必须直面内存读写的本质。 这个本质是什么呢? 本质…

Java同步包装器

通过 Collections.synchronizedList() 方法将一个普通的 ArrayList 包装成了线程安全的 List&#xff1a; import java.util.*;public class SynchronizedWrapperExample {public static void main(String[] args) {// 创建一个非线程安全的 ArrayListList<String> list…

Redis理解【精细】【快速上手】

目录 1. 了解3V和3高 2.什么是redis 3. redis可以做什么 4. Windows安装 5. 使用redis客户端操作redis 5.1 redis基本命令 5.1.1 切换数据库 5.1.2 查看当前数据库的大小 5.1.3 查看当前数据库所有的key ​​​​​​​ 5.1.4 清空当前数据库所有key 5.1.5 清空所…

在Linux操作环境下搭建内网源

在修改配置文件之前都应该有备份。 比如在/目录下专门创建一个目录用来储存文件的备份。 1.安装vsftpd软件 首先使用命令yum search ftpd 来查看当前Linux操作系统下是否有ftpd软件。 随后使用yum install vsftpd&#xff0c;来安装vsftpd软件 2.修改vsftpd的配置文件&…

免费最好用的证件照制作软件,一键换底+老照片修复+图片动漫化,吊打付费!

这款软件真的是阿星用过的&#xff0c;最好用的证件照制作软件&#xff0c;没有之一&#xff01; 我是阿星&#xff0c;今天要给大家安利一款超实用的证件照工具&#xff0c;一键换底&#xff0c;自动排版&#xff0c;免费无广告&#xff0c;让你在家就能轻松搞定证件照&#…