Cloudyun

Yann Cheungの博客

接口

基本介绍

接口就是给出一些没有实现的方法,封装到一起,到某个类要使用的时候,在根据具体情况把这些方法写出来。语法:

1
2
3
4
5
6
7
8
9
10
interface 接口名{
//属性
//抽象方法、默认实现方法或静态方法。
}

class 类名 implements 接口{
自己属性,
自己方法:
必须实现的接口的抽象方法
}

小结:

  • 接口是更加抽象的抽象的类,抽象类里的方法可以有方法体,接口里的所有方法都没有方法体 【idk7.0之前】。接口体现了程序设计的多态和高内聚低偶合的设计思想.
  • 特别说明:Jdk8.0后接口类可以有静态方法,默认方法,也就是说接口中可以有方法的具体实现。
  • 在接口中,抽象方法可以省略abstact关键字。
Read more »

final关键字

基本介绍

final可以修饰类、属性、方法和局部变量

在某些情况下,可能有以下去修,就会使用到final:

  • 1、当不希望类被继承时,可以用final修饰
  • 2、当不希望父类的某个方法被子类覆盖/重写时,可以用final关键字修饰【访问修饰符 final 返回类型 方法名】
  • 3、当不希望类的某个属性的值被修改,可以用final修饰。【public final double TAX_RATE = 0.1】
  • 4、当不希望某个局部变量被修改,可以用final修饰
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package com.learn.static_.final_;

public class final01 {
public static void main(String[] args) {
E e = new E();
//e.AGE = 12;//加了final后就不可以修改
}
}

final class A{}

//class B extends A{}

class C{
public final void hi(){}
}

class D extends C{
// @Override
// public void hi() {
// super.hi();
// }
}

class E{
public final int AGE = 10;
}

class F{
public void cry(){
final double NUM = 0.0;
//NUM = 0.9;//final修饰的局部变量也不能修改
}
}
Read more »

代码块

基本介绍

代码化块又称为初始化块,属于类中的成员【即是类的一部分】,类似于方法,将逻辑语句封装在方法体中,通过{}包围起来。

但和方法不同,没有方法名,没有返回,没有参数,只有方法体,而且不用通过对象或类显示调用,而是加载类时,或创建对象时隐式调用。

基本语法

[修饰符] {代码};

说明注意:

  • 1、修饰符可选,要写的话,也只能写static
  • 2、代码块氛围两类,使用static修饰的叫静态代码块,没有static修饰的,叫普通代码块/非静态代码块。
  • 3、逻辑语句可以为任何逻辑语句(输入、输出、方法调用、循环、判断等)

代码块的好处和案例演示

  • 1、相当于另外一种形式的构造器(对构造器的补充机制),可以做初始化的操作
  • 2、场景:如果多个构造器中都有重复的语句,可以抽取到初始化块中,提高代码的复用性。
  • 3、代码块的快速入门
Read more »

前言

该部分已经进入面向对象高级部分知识,主要涉及到类变量、类方法、代码块等知识

类变量

引出

例子:有一群小孩在玩堆雪人,不时有新的小孩加入,请问如何知道现在共有多少小孩在玩?

思路:

  • 1、在main方法中定义一个变量count
  • 2、当一个小孩加入游戏后,count++,最后count就记录有多少个小孩玩游戏

问题:

  • 1、count是一个独立于对象/类的变量
  • 2、以后访问count比较麻烦,没有使用opp

解决:

  • 如果设计一个int count表示总人数,我们在创建一个小孩时,就把count+1,并且count是所有对象共享的就ok了

因此我们引出类变量(也叫静态变量)

Read more »

Object类详解

equals方法

==与equals对比

==是一个比较运算符,并不是一个方法。

  • ==:既可以判断基本类型,也可以判断引用类型
  • ==:如果判断基本类型,判断的是值是否相等。例:int i =10;double d = 10.0
  • ==:如果判断引用类型,判断的是地址是否相等,即判断是否为同一个对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.learn.object_;

public class Equals01 {
public static void main(String[] args) {
B b = new B();
B c = b;
B d = c;
System.out.println(b == c);//true
System.out.println(d == c);//true
A aObj = b;
System.out.println(aObj == d);//true,因为地址还是相同的
}
}

class A{}
class B extends A{}A a = new A();
  • equals:是Object类中的方法,只能判断引用类型 。查看源码
  • 默认判断的是地址是否相等,子类中往往重写该方法,用于判断是否值相等。比如Integer、String【查看两个类中的equals方法源码】
Read more »

多态

方法和对象具有多种形态。是面向对象的第三大特征,多态是建立在封装和继承基础之上的。

例子引出多态

假设有一个主人Master类,其中有一个feed(喂食)方法,可以完成主人给动物喂食的信息。假设Food类有两个子类:Fish和Bone,动物Animal类有两个子类Cat和Dog。根据前面知识可以写出代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//Animal类
package com.learn.poly_;

public class Animal {
private String name;

public Animal(String name) {
this.name = name;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}
Read more »

前言

该部分为面向对象编程(中级部分)中:继承部分的知识

继承

为什么需要继承?

继承可以解决代码复用,让我们的编程更加接近人类思维。当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的字类不需要重新定义这些属性和方法,只需要通过extends来声明继承父类即可。

  • 代码的复用性提高
  • 代码的扩展性和维护性提高

继承的基本语法

1
2
3
4
5
class 子类 extends 父类{
1)子类就会自动拥有父类定义的属性和方法
2)父类又叫超类、基类
3)子类又叫派生类
}

继承的细节

  • 1、子类继承了所有的属性和方法,非私有的属性和方法可以在子类直接访问,但是私有属性和方法不能在子类直接访问直接访问,要通过父类提供的公共方法去访问。(注意,如果是默认的属性和方法,如果在同包下也可访问,具体可以看访问修饰符的范围表)
  • 2、子类必须调用父类的构造器,完成父类的初始化。
Read more »

前言

记录一下leetcode栈与队列部分题目的刷题笔记,顺序参考代码随想录中,但不仅限于这些,可以扩展记录。

笔记记录

1、LinkedList

Java里的LinkedList可以同时作为堆栈和队列使用,因此在使用的时候总是会弄混他们的方法,这里简单总结一下作为不同数据结构时的用法:

作为队列:

(1)声明

任意两种方法:

  • 一是直接声明LinkedList:
    LinkedList<T> q = new LinkedList<T>();
  • 或者使用java.util.Queue接口,其底层关联到一个LinkedList实例。
    Queue<T> q = new LinkedList<T>();
    由于只暴露部分基于队列实现的接口,所以可以提供安全的队列实现。

(2)入队

void offer(T v)

(3)出队

  • T poll(), 如果队列为空,则返回null
  • T remove(), 如果队列为空,则抛出异常

(4)偷看

看看队首元素不移除它。

  • T peek(), 如果队列为空,则返回null
  • T element(), 如果队列为空,则抛出异常

(5)是否为空

  • boolean isEmpty(), 空返回true,否则返回false
Read more »

前言

记录一下leetcode双指针部分题目的刷题笔记,顺序参考代码随想录中,但不仅限于这些,可以扩展记录。

27. 移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

示例 1:

输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。

思路:双指针

快慢指针

1
2
3
4
5
6
7
8
9
10
11
12
class Solution {
public int removeElement(int[] nums, int val) {
int slowPtr = 0;
for(int fastPtr = 0 ; fastPtr < nums.length;fastPtr++){
if(nums[fastPtr] != val){
nums[slowPtr] = nums[fastPtr];
slowPtr++;
}
}
return slowPtr;
}
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)
Read more »

前言

记录一下最近看的一些入侵检测、态势感知相关论文,主要是针对AGV物流调度系统态势感知平台开发的相关学习。

论文总结

一、《Machine Learning for Intrusion Detection in Industrial Control Systems: Applications, Challenges, and Recommendations》

综述性论文

二、《Embedding Encryption and Machine Learning Intrusion Prevention Systems on Programmable Logic Controllers》

在可编程逻辑控制器上嵌入加密和机器学习入侵防御系统

1、Abstract

​ 由于PLC供应商不提供有关其硬件或软件的信息,研究人员很难将安全机制嵌入到设备中。本文描述了一种使用开源PLC的替代设计,该PLC经过修改后可以独立于所使用的协议对其通过网络发送的所有数据进行加密。此外,基于机器学习的IPS被添加到PLC网络堆栈中,提供了一种安全机制来抵御拒绝服务(DoS)等网络flood攻击。实验结果表明,加密层和IPS提高了PLC与监控软件之间链路的安全性,防止了拦截、注入和DoS攻击

​ 这项工作增强了具有AES-256加密和解密功能的开源PLC和基于机器学习的IPS,以创建嵌入式弹性系统。OpenPLC项目是根据IEC 61131-3标准创建的,该标准定义了plc的基本软件体系结构和编程语言。这意味着OpenPLC可以与其他遵循相同标准的plc兼容。

Read more »