Java基础:基础加强巩固,2024年最新java面试经验技巧

本文作者为浙江大学毕业生,有着华为、字节跳动、阿里等大厂经验,分享了《2024年最新Java开发全套学习资料》。资料覆盖了Java开发的各个知识点,包括单元测试、反射、框架设计等,并提供了获取完整资料的方式。此外,文章还介绍了注解的概念和自定义注解的格式。

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

  • 用于资源申请,所有测试方法在执行之前都会先执行该方法

*/

@Before

public void init(){

System.out.println(“init…”);

}

/**

  • 释放资源方法:

  • 在所有测试方法执行完后,都会自动执行该方法

*/

@After

public void close(){

System.out.println(“close…”);

}

/**

  • 测试add方法

*/

@Test

public void testAdd(){

// System.out.println(“我被执行了”);

//1.创建计算器对象

System.out.println(“testAdd…”);

Calculator c = new Calculator();

//2.调用add方法

int result = c.add(1, 2);

//System.out.println(result);

//3.断言 我断言这个结果是3

Assert.assertEquals(3,result);

}

@Test

public void testSub(){

//1.创建计算器对象

Calculator c = new Calculator();

int result = c.sub(1, 2);

System.out.println(“testSub…”);

Assert.assertEquals(-1,result);

}

}

2. 反射:框架设计的灵魂

=========================================================================

在这里插入图片描述

  • 框架:半成品软件。可以在框架的基础上进行软件开发,简化编码

  • 反射:将类的各个组成部分封装为其他对象,这就是反射机制

  • 好处:

  1. 可以在程序运行过程中,操作这些对象。(比如调用String中的方法时,其实是调用内存中的Class类对象的Method成员方法数组中的方法)

  2. 可以解耦,提高程序的可扩展性。

  • 获取Class对象的方式:
  1. Class.forName(“全类名”):将字节码文件加载进内存,返回Class对象(对应Source源代码阶段,代码仍在硬盘中)
  • 多用于配置文件,将类名定义在配置文件中。读取文件,加载类
  1. 类名.class:通过类名的属性class获取>(对应Class类对象阶段,代码已经在内存中了)
  • 多用于参数的传递
  1. 对象.getClass():getClass()方法在Object类中定义着。(对应Runtime运行时阶段,已经产生具体对象了)
  • 多用于对象的获取字节码的方式

  • 结论:

同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个。

  • Class对象功能:

  • 获取功能:

  1. 获取成员变量们
  • Field[] getFields() :获取所有public修饰的成员变量

  • Field getField(String name) 获取指定名称的public修饰的成员变量

  • Field[] getDeclaredFields() 获取所有的成员变量,不考虑修饰符

  • Field getDeclaredField(String name)

  1. 获取构造方法们
  • Constructor<?>[] getConstructors()

  • Constructor getConstructor(类<?>… parameterTypes)

  • Constructor getDeclaredConstructor(类<?>… parameterTypes)

  • Constructor<?>[] getDeclaredConstructors()

  1. 获取成员方法们:
  • Method[] getMethods()

  • Method getMethod(String name, 类<?>… parameterTypes)

  • Method[] getDeclaredMethods()

  • Method getDeclaredMethod(String name, 类<?>… parameterTypes)

  1. 获取全类名
  • String getName()

  • Field:成员变量

  • 操作:

  1. 设置值
  • void set(Object obj, Object value)
  1. 获取值
  • get(Object obj)
  1. 忽略访问权限修饰符的安全检查
  • setAccessible(true):暴力反射

package cn.itcast.reflect;

import cn.itcast.domain.Person;

import java.lang.reflect.Field;

public class ReflectDemo2 {

/**

Class对象功能:

  • 获取功能:
  1. 获取成员变量们
  • Field[] getFields()

  • Field getField(String name)

  • Field[] getDeclaredFields()

  • Field getDeclaredField(String name)

*/

public static void main(String[] args) throws Exception {

//0.获取Person的Class对象

Class personClass = Person.class;

/*

  1. 获取成员变量们
  • Field[] getFields()

  • Field getField(String name)

  • Field[] getDeclaredFields()

  • Field getDeclaredField(String name)

*/

//1.Field[] getFields()获取所有public修饰的成员变量

Field[] fields = personClass.getFields();

for (Field field : fields) {

System.out.println(field);

}

System.out.println(“------------”);

//2.Field getField(String name)

Field a = personClass.getField(“a”);

//获取成员变量a 的值

Person p = new Person();

Object value = a.get§;

System.out.println(value);

//设置a的值

a.set(p,“张三”);

System.out.println§;

System.out.println(“===================”);

//Field[] getDeclaredFields():获取所有的成员变量,不考虑修饰符

Field[] declaredFields = personClass.getDeclaredFields();

for (Field declaredField : declaredFields) {

System.out.println(declaredField);

}

//Field getDeclaredField(String name)

Field d = personClass.getDeclaredField(“d”);

//忽略访问权限修饰符的安全检查

d.setAccessible(true);//暴力反射

Object value2 = d.get§;

System.out.println(value2);

}

}

  • Constructor:构造方法

  • 创建对象:

  • T newInstance(Object… initargs)

  • 如果使用空参数构造方法创建对象,操作可以简化:Class对象的newInstance方法

package cn.itcast.reflect;

import cn.itcast.domain.Person;

import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

public class ReflectDemo3 {

/**

Class对象功能:

  • 获取功能:
  1. 获取构造方法们
  • Constructor<?>[] getConstructors()

  • Constructor getConstructor(类<?>… parameterTypes)

  • Constructor getDeclaredConstructor(类<?>… parameterTypes)

  • Constructor<?>[] getDeclaredConstructors()

*/

public static void main(String[] args) throws Exception {

//0.获取Person的Class对象

Class personClass = Person.class;

/*

  1. 获取构造方法们
  • Constructor<?>[] getConstructors()

  • Constructor getConstructor(类<?>… parameterTypes)

  • Constructor getDeclaredConstructor(类<?>… parameterTypes)

  • Constructor<?>[] getDeclaredConstructors()

*/

//Constructor getConstructor(类<?>… parameterTypes)

Constructor constructor = personClass.getConstructor(String.class, int.class);

System.out.println(constructor);

//创建对象

Object person = constructor.newInstance(“张三”, 23);

System.out.println(person);

System.out.println(“----------”);

Constructor constructor1 = personClass.getConstructor();

System.out.println(constructor1);

//创建对象

Object person1 = constructor1.newInstance();

System.out.println(person1);

Object o = personClass.newInstance();

System.out.println(o);

//constructor1.setAccessible(true);

}

}

  • Method:方法对象

  • 执行方法:

  • Object invoke(Object obj, Object… args)

  • 获取方法名称:

  • String getName:获取方法名

package cn.itcast.reflect;

import cn.itcast.domain.Person;

import java.lang.reflect.Constructor;

import java.lang.reflect.Method;

public class ReflectDemo4 {

/**

Class对象功能:

  • 获取功能:
  1. 获取成员方法们:
  • Method[] getMethods()

  • Method getMethod(String name, 类<?>… parameterTypes)

  • Method[] getDeclaredMethods()

  • Method getDeclaredMethod(String name, 类<?>… parameterTypes)

  1. 获取类名
  • String getName()

*/

public static void main(String[] args) throws Exception {

//0.获取Person的Class对象

Class personClass = Person.class;

/*

  1. 获取成员方法们:
  • Method[] getMethods()

  • Method getMethod(String name, 类<?>… parameterTypes)

  • Method[] getDeclaredMethods()

  • Method getDeclaredMethod(String name, 类<?>… parameterTypes)

*/

//获取指定名称的方法

Method eat_method = personClass.getMethod(“eat”);

Person p = new Person();

//执行方法

eat_method.invoke§;

// 获取带参数的方法,传递函数名以及指定参数的class

Method eat_method2 = personClass.getMethod(“eat”, String.class);

//执行方法

eat_method2.invoke(p,“饭”);

System.out.println(“-----------------”);

//获取所有public修饰的方法

Method[] methods = personClass.getMethods();

for (Method method : methods) {

System.out.println(method);

String name = method.getName();

System.out.println(name);

//method.setAccessible(true);

}

//获取类名

String className = personClass.getName();

System.out.println(className);//cn.itcast.domain.Person

}

}

  • 案例:

  • 需求:写一个"框架",不能改变该类的任何代码的前提下,可以帮我们创建任意类的对象,并且执行其中任意方法

  • 实现:

  1. 配置文件

  2. 反射

  • 步骤:
  1. 将需要创建的对象的全类名和需要执行的方法定义在配置文件中

  2. 在程序中加载读取配置文件

  3. 使用反射技术来加载类文件进内存

  4. 创建对象

  5. 执行方法

  • 实现

在这里插入图片描述

配置文件pro.properties

后续如果要更改,只需要更改配置文件,即可执行对应文件

className=cn.itcast.domain.Student

methodName=sleep

className=cn.itcast.domain.Person

methodName=eat

Person类Person.class

package cn.itcast.domain;

public class Person {

private String name;

private int age;

public String a;

protected String b;

String c;

private String d;

public Person() {

}

public Person(String name, int age) {

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@Override

public String toString() {

return “Person{” +

“name='” + name + ‘’’ +

“, age=” + age +

“, a='” + a + ‘’’ +

“, b='” + b + ‘’’ +

“, c='” + c + ‘’’ +

“, d='” + d + ‘’’ +

‘}’;

}

public void eat() {

System.out.println(“eat…”);

}

public void eat(String food) {

System.out.println(“eat…” + food);

}

}

Studelt类Student.java

package cn.itcast.domain;

public class Student {

public void sleep(){

System.out.println(“sleep…”);

}

}

实现类ReflectText.java

package cn.itcast.reflect;

import cn.itcast.domain.Person;

import cn.itcast.domain.Student;

import java.io.IOException;

import java.io.InputStream;

import java.lang.reflect.Method;

import java.util.Properties;

/**

  • 框架类

*/

public class ReflectTest {

public static void main(String[] args) throws Exception {

//可以创建任意类的对象,可以执行任意方法

/*

前提:不能改变该类的任何代码。可以创建任意类的对象,可以执行任意方法

*/

/* Person p = new Person();

p.eat();*/

/*

Student stu = new Student();

stu.sleep();*/

//1.加载配置文件

//1.1创建Properties对象

Properties pro = new Properties();

//1.2加载配置文件,转换为一个集合

//1.2.1获取class目录下的配置文件

ClassLoader classLoader = ReflectTest.class.getClassLoader();

InputStream is = classLoader.getResourceAsStream(“pro.properties”);

pro.load(is);

//2.获取配置文件中定义的数据

String className = pro.getProperty(“className”);

String methodName = pro.getProperty(“methodName”);

//3.加载该类进内存

Class cls = Class.forName(className);

//4.创建对象

Object obj = cls.newInstance();

//5.获取方法对象

Method method = cls.getMethod(methodName);

//6.执行方法

method.invoke(obj);

}

}

3. 注解

=================================================================

  • 概念:说明程序的。给计算机看的

  • 注释:用文字描述程序的。给程序员看的

  • 定义:注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。

  • 概念描述:

  • JDK1.5之后的新特性

  • 说明程序的

  • 使用注解:@注解名称

  • 作用分类:

①编写文档:通过代码里标识的注解生成文档【生成文档doc文档】

②代码分析:通过代码里标识的注解对代码进行分析【使用反射】

③编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查【Override】

  • JDK中预定义的一些注解

  • @Override :检测被该注解标注的方法是否是继承自父类(接口)的

  • @Deprecated:该注解标注的内容,表示已过时

  • @SuppressWarnings:压制警告

  • 一般传递参数all @SuppressWarnings(“all”)

  • 自定义注解

  • 格式:

元注解

public @interface 注解名称{

属性列表;

}

  • 本质:注解本质上就是一个接口,该接口默认继承Annotation接口

public interface MyAnno extends java.lang.annotation.Annotation {}

  • 属性:接口中的抽象方法

  • 要求:

  1. 属性的返回值类型有下列取值
  • 基本数据类型

  • String

  • 枚举

  • 注解

  • 以上类型的数组

package cn.itcast.annotation;

//import com.sun.corba.se.spi.orbutil.threadpool.Work;

public @interface MyAnno {

int value();

Person per();

MyAnno2 anno2();

String[] strs();

/String name() default “张三”;/

最后

终极手撕架构师的学习笔记:分布式+微服务+开源框架+性能优化

image

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

注解让编译器能够实现基本的编译检查【Override】

  • JDK中预定义的一些注解

  • @Override :检测被该注解标注的方法是否是继承自父类(接口)的

  • @Deprecated:该注解标注的内容,表示已过时

  • @SuppressWarnings:压制警告

  • 一般传递参数all @SuppressWarnings(“all”)

  • 自定义注解

  • 格式:

元注解

public @interface 注解名称{

属性列表;

}

  • 本质:注解本质上就是一个接口,该接口默认继承Annotation接口

public interface MyAnno extends java.lang.annotation.Annotation {}

  • 属性:接口中的抽象方法

  • 要求:

  1. 属性的返回值类型有下列取值
  • 基本数据类型

  • String

  • 枚举

  • 注解

  • 以上类型的数组

package cn.itcast.annotation;

//import com.sun.corba.se.spi.orbutil.threadpool.Work;

public @interface MyAnno {

int value();

Person per();

MyAnno2 anno2();

String[] strs();

/String name() default “张三”;/

最后

终极手撕架构师的学习笔记:分布式+微服务+开源框架+性能优化

[外链图片转存中…(img-EZy1ncd9-1713620480842)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-vKR2tCL7-1713620480842)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值