显示标签为“JAVA”的博文。显示所有博文
显示标签为“JAVA”的博文。显示所有博文

2023年5月24日星期三

内部类

定义:写在一个类里面的类就是内部类
使用场景:

  • B类表示A类的事物是A类的一部分,且B单独存在没有意义
  • 内部类表示的事物是外部类的一部分
  • 内部类单独出现没有任何意义
    访问特点:
  • 内部类可以直接访问外部类的成员,包括私有
  • 外部类要访问内部类的成员,必须创建对象

成员内部类

什么是成员内部类?

  • 写在成员位置的,属于外部类的成员

成员内部类的格式?

  • 成员内部类写在成员位置,属于外部类的成员
  • 成员内部类可以被一些修饰符所修饰,比如private、缺省、protected、public、static等
  • JDK16之后,成员内部类里面可以定义静态变量

如何创建成员内类的对象?

  • 在外部类中编写方法,对外提供外部类的对象
    • 用private修饰内部类时一般用此方法
  • 直接创建格式:Outer.Inner oi = new Outer().new Inner();

成员内部类如何获取外部类的成员变量?
outer.this.变量名

静态内部类

什么是静态内部类?

  • 用static修饰的成员内部类的一种

如何创建静态内部类对象?
Outer.Inner oi = new Outer.Inner();

静态内部类方法的调用?

  • 非静态方法:先创建对象,用对象调用
  • 静态方法:Outer.Inner.method();

局部内部类

  • 将内部类定义在方法里面就叫做局部内部类,类似于方法里面的局部变量
  • 外界是无法直接使用,需要在方法内部创建对象并调用
  • 该类可以直接访问外部类的成员,也可以访问方法内的局部变量

匿名内部类

什么是匿名内部类?

  • 隐藏了名字的内部类(外部类名$序号),可以写在成员位置,也可以写在局部位置

匿名内部类的格式?

new 类名或者接口名() {
	@Override	
	重写方法;
};

格式的细节?

  • 包含了继承或实现,方法重写,创建对象
  • 整体就是一个类的子类对象或者接口的实现类对象对象

使用场景?

  • 当方法的参数是接口或者类时
    • 以接口为例,可以传递这个接口的实现类对象
    • 如果实现类只要使用一次,就可以用匿名内部类简化代码

2023年5月19日星期五

接口和适配器

接口与抽象类的区别

抽象类着重于继承体系

  • 多用于父类当中,抽象共性方法
  • 表示一类事物

接口着重于方法的解决

  • 是一种规则,是对行为的抽象
  • 表示一种行为

接口的定义和使用

  • 接口用关键字interface来定义
    public interface 接口名 {}
  • 接口不能实例化
  • 接口和类之间是实现关系,通过implements关键字表示
    public class 类名 implements 接口名 {}
  • 接口的子类(实现类)
    • 要么重写接口中的所有抽象方法(一般用此法)
    • 要么是抽象类

ps:

  • 接口和类的实现关系,可以单实现,也可以多实现
    public class 类名 implements 接口名1,接口名2 {}
  • 实现类还可以在继承一个类的同时实现多个接口
    public class 类名 extends 父类 implements 接口名1,接口名2 {}

接口中成员的特点

  • 成员变量

    • 只能是常量
    • 默认修饰符:public static final
      • IDEA(我用的是IDEA)默认添加,不写也有
  • 构造方法

    • 没有
  • 成员方法

    • 只能是抽象方法
    • 默认修饰符:public abstract

ps:

  • JDK7以前:接口中只能定义抽象方法
  • JDK8的新特性:接口中可以定义有方法体的方法
  • JDK9的新特性:接口中可以定义私有方法

接口和类之间的关系

  • 类和类的关系
    继承关系,只能单继承,不能多继承,但是可以多层继承
  • 类和接口的关系
    实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
  • 接口和接口的关系
    继承关系,可以单继承,也可以多继承

版本迭代

JDK8

  • 允许在接口中定义默认方法,需要使用关键字default修饰
    作用:解决接口升级问题

  • 接口中默认方法的定义格式

    • 格式:public default 返回值类型 方法名() {}
    • 范例:public default void show() {}
  • 默认方法的注意事项

    • 默认方法不是抽象方法,所以不强制被重写,重写的时候去掉default关键字
    • public可以省略,delault不能省略
    • 如果实现了多个接口,多个接口中存在相同名字的默认方法,子类就必须对该方法进行重写
  • 允许在接口中定义静态方法,需要用static修饰
  • 接口中静态方法的定义格式:
    • 格式:public static 返回值类型 方法名() {}
    • 范例:public static void show() {}
  • 静态方法的注意事项
    • 静态方法只能通过接口名调用,不能通过实现类名或者对象名调用
    • public可以省略,static不能省略

上面一大堆总结就是:
public abstract void 方法名();

  1. 抽象方法,必须被重写
    public default void 方法名() {}
  2. 默认方法,不强制被重写
    public static void 方法名() {}
  3. 静态方法,不能被重写,通过接口名调用
    private static void 方法名() {}
  4. 私有方法,不对外开放权限,只内部使用,用来存放重复代码

###JDK9

  • 允许在接口中定义私有方法
  • 接口中私有方法的定义格式:
    • 格式1:private 返回值类型 方法名() {}

    • 范例1:privete void show() {}

    • 格式2:private static 返回值类型 方法名() {}

    • 范例2:private static void method() {}

适配器

  • 当一个接口中抽象方法过多,但是我们只要使用其中一部分的时候,就可以用适配器设计模式

  • 书写步骤:

    1. 编写中间类XXXAdapter,实现对应的接口
    2. 对接口中的抽象方法进行空实现
    3. 让真正的实现类继承中间类,并重写需要用的方法
    4. 为了避免其他类创建适配器类的对象,中间的适配器类用abstract进行修饰
  • 小技巧:因为类只能单一继承,所以如果有多个“父类”接口,则全部给到XXXAdater去做一个中转就行了

2023年5月15日星期一

权限修饰符和代码块


title: 权限修饰符和代码块
categories:

  • 技术

tags:

  • JAVA

#权限修饰符
定义:是用来控制一个成员变量能够被访问的范围的

修饰符 同一个类中 同一个包中的其他类 不同包下的子类 不同包下的无关类
private × × ×
空着不写 × ×
protected ×
public

注:实际开发中,一般只用private和public

  • 成员变量私有
  • 方法公开

特例:如果方法中的代码是抽取其他方法中的共性代码,这个方法一般也私有


代码块

局部代码块

  • 特点:提前结束变量的生命周期,即使释放内存
public class Text {
	public static void main(String[] args) {  
		{
			int a = 10;
			System.out.println(a);
		}// 局部代码块
	}
}

构造代码块

  • 特点:抽取构造方法中的重复代码
  • 格式:写在成员位置
  • 执行时机:再创建本类对象的时候会先执行构造代码块再执行构造方法
public class Text {
	private String name;
	private int age;
	{
	System.out.println("看看我执行了吗")
	}
	public Text() {
	}
	public Text(String name, int age) {
		this.name = name;
		this.age = age;	
	}
}

静态代码块

  • 特点:通过static关键字修饰,随着类的加载而加载,并且自动触发、只执行一次
  • 格式:static{}
  • 使用场景:在类加载的时候,做一些数据初始化的时候使用

抽象方法和抽象类

抽象方法

  • 定义:将共性的行为(方法)抽取到父类之后。由于每一个子类执行的内容是不一样,所以,在父类中不能确定具体的方法体。该方法就可以定义为抽象方法
  • 格式:public abstract 返回值类型 方法名(参数列表);

抽象类

  • 定义:如果一个类中存在抽象方法,那么该类就必须声明为抽象类
  • 格式:public abtract class 类名{}

注意事项

  • 抽象类不能实例化
  • 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
  • 可以有构造方法
  • 抽象类的子类:要么重写抽象类中的所有抽象方法;要么是抽象类

2023年5月12日星期五

包和final

什么是包?

包就是文件夹。用来管理不同功能的java类,方便后期代码维护
命名规则:公司域名 + 包的作用,需要全部英文小写,见名知意。
如:com.companyname.domain

什么是全类名?

包名 + 类名,组成全类名(全限定名)。如:com.companyname.domain.Text

导包?

避免每次都写全类名,诞生了”导包“

  • 使用同一个包中的类时,不需要导包
  • 使用java.lang包中的类时,不需要导包
  • 其他情况都需要导包
  • 如果同时使用两个包中的同类名,需要用全类名

final修饰符?

修饰方法时:表示该方法是最终方法,不能被重写
修饰类时:表示该类是最终类,不能被继承
修饰变量时:叫做变量,只能被赋值一次


常量的意义:在实际开发中,常量一般作为系统的配置信息,方便维护,提高可读性
常量的命名规则:

  1. 单个单词:全部大写
  2. 多个单词:全部大写,单词之间用下划线隔开

小细节:

  • final修饰的变量基本类型:那么变量存储的地址值不能发生改变
  • final修饰的变量引用类型:那么变量存储的地址值不能发生改变,对象内部可以改变

自体防御系统故障报告

夜静风清 犬吠空庭 君子何往 死月独行 一潦西流水 已巳 七月 廿三 于沪