当前位置: 首页 > news >正文

Java面向对象

Java面向对象

静态 static

static修饰静态成员变量

/**在线人数。注意:static修饰的成员变量:静态成员变量,只在内存中有一份,可以被共享*/
public static int onlineNumber = 161;

在这里插入图片描述

static静态成员方法

/**静态成员方法: 有static修饰,归属于类,可以被共享访问,用类名或者对象名都可以访问。*/
public static int getMax(int age1, int age2){return age1 > age2 ? age1 : age2;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

单例模式

在这里插入图片描述

饿汉单例设计模式

在这里插入图片描述

/**使用饿汉单例实现单例类*/
public class SingleInstance {/**2、饿汉单例是在获取对象前,对象已经提前准备好了一个。这个对象只能是一个,所以定义静态成员变量记住。*/public static SingleInstance instance = new SingleInstance();/**1、必须把构造器私有化。*/private SingleInstance(){}
}

懒汉单例设计模式

在这里插入图片描述

/**懒汉单例*/
public class SingleInstance2 {/**2、定义一个静态的成员变量负责存储一个对象。只加载一次,只有一份。注意:最好私有化,这样可以避免给别人挖坑!*/private static SingleInstance2 instance;/**3、提供一个方法,对外返回单例对象。*/public static SingleInstance2 getInstance() {if(instance == null){// 第一次来拿对象 :此时需要创建对象。instance = new SingleInstance2();}return instance;}/**1、私有化构造器*/private SingleInstance2(){}
}

final

目标:记住final的语法。

  • 1、final修饰类,类不能被继承。
class Wolf extends Animal{
}final class Animal{
}
  • 2、final修饰方法,方法不能被重写
public final void eat(){System.out.println("人都要吃东西~~");
}
  • 3、final修饰变量,总规则:变量有且仅能被赋值一次。
private final String name = "猪刚鬣";

在这里插入图片描述

常量 public static final

常量:public static final 修饰的成员变量,注意:名称全部英文大写,多个单词下划线连接。

public static final String schoolName = "黑马";

在这里插入图片描述

枚举 enum

public enum Season {// 第一行罗列枚举的实例:对象的名称。SPRING,SUMMER,AUTUMN, WINTER;
}
public static void move(Constant orientation){// 控制玛丽移动switch (orientation) {case UP:System.out.println("玛丽往↑飞了一下~~");break;case DOWN:System.out.println("玛丽往↓蹲了一下~~");break;case LEFT:System.out.println("玛丽往←跑了一下~~");break;case RIGHT:System.out.println("玛丽往→跑了一下~~");break;}
}

在这里插入图片描述

抽象 abstract

/**抽象类:有abstract修饰*/
public abstract class Animal {private String name;/**抽象方法:有abstract修饰 不能写方法体代码*/public abstract void run();public String getName() {return name;}public void setName(String name) {this.name = name;}
}

在这里插入图片描述
在这里插入图片描述

模板方法模式

在这里插入图片描述

模板方法模式 写作文案例案例

  • 父类声明模板方法,并提供子类重写的抽象类
/*** @author* @create 2022-06-21 13:47*/
public abstract class Student {/*** 正式声明了模板方法模式**/public final void write(){// 标题System.out.println("\t\t\t\t《我的爸爸》");// 开头System.out.println("你的爸爸是啥样,来说说:");// 正文部分(每个子类都要写的,每个子类写的情况不一样//  因此。模板方法把正文部分定义成抽象方法,交给//  具体的子类来完成)System.out.println(writeMain());// 结尾System.out.println("我的爸爸简直太好了~~");}public abstract String writeMain();
}
  • 子类继承父类,重写父类的抽象类
/*** @author 小学生* @create 2022-06-21 13:46*/
public class StudentChild extends Student{@Overridepublic String writeMain() {return "的爸爸太牛b了,他总是买东西给我吃。。";}}
  • 最终实现
/*** @author* @create 2022-06-21 13:50*/
public class Test {public static void main(String[] args) {// 目标:理解模板方法模式的思想和使用步骤。StudentChild studentChild = new StudentChild();studentChild.write();}
}

在这里插入图片描述

接口 interface

在这里插入图片描述

  • 接口体现了一种规范,规范一定是公开的

在这里插入图片描述
在这里插入图片描述

接口的新增方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 接口
public interface SportMan {/**1、默认方法:其实就是实例方法。-- 必须用default修饰,默认会自带public-- 必须用接口的实现类的对象来调用*/default void run(){go();System.out.println("==跑的贼溜==");}/**2、静态方法-- 必须static修饰,默认会自带public-- 必须用接口名自己调用*/static void inAddr(){System.out.println("我们在黑马");}/**3、私有实例方法:-- 必须用private修饰-- 只能本接口中访问。-- 一般给接口中其他的默认方法或者私有实例方法使用的*/
//    private void go(){
//        System.out.println("开始跑~~");
//    }static void go(){System.out.println("开始跑~~");}
}
  • 实现接口但是不用实现方法
public class PingPongMan implements SportMan{
}
  • 测试:
public class Test {public static void main(String[] args) {// 目标:理解JDK 8开始接口新增的方法。PingPongMan p = new PingPongMan();p.run();SportMan.inAddr();}
}

在这里插入图片描述
在这里插入图片描述

多态

多态概述和好处

在这里插入图片描述
在这里插入图片描述

  • 创建父类动物对象
/**父类*/
public class Animal {public String name = "动物名称";public void run(){System.out.println("动物可以跑~~");}
}
  • 创建子类狗对象 继承父类对象
public class Dog extends Animal{public String name = "狗名称";@Overridepublic void run() {System.out.println("🐕跑的贼溜~~~~~");}
}
  • 测试
public class Test {public static void main(String[] args) {// 目标:先认识多态的形式// 父类  对象名称 = new 子类构造器();Animal a = new Dog();a.run(); // 方法调用:编译看左,运行看右System.out.println(a.name); // 方法调用:编译看左,运行也看左,动物名称}
}

多态下引用数据类型的类型装换

在这里插入图片描述
在这里插入图片描述

/**目标:学习多态形式下的类中转换机制。*/
public class Test {public static void main(String[] args) {// 自动类型转换Animal a = new Dog();a.run();
//        a.lookDoor(); // 多态下无法调用子类独有功能// 强制类型转换:可以实现调用子类独有功能的Dog d = (Dog) a;d.lookDoor();// 注意:多态下直接强制类型转换,可能出现类型转换异常// 规定:有继承或者实现关系的2个类型就可以强制类型转换,运行时可能出现问题。// Tortoise t1 = (Tortoise) a;// 建议强制转换前,先判断变量指向对象的真实类型,再强制类型转换。if(a instanceof Tortoise){Tortoise t = (Tortoise) a;t.layEggs();}else if(a instanceof Dog){Dog d1 = (Dog) a;d1.lookDoor();}System.out.println("---------------------");Animal a1 = new Dog();go(a1);}public static void go(Animal a){System.out.println("预备~~~");a.run();// 独有功能if(a instanceof Tortoise){Tortoise t = (Tortoise) a;t.layEggs();}else if(a instanceof Dog){Dog d1 = (Dog) a;d1.lookDoor();}System.out.println("结束~~~~");}
}

在这里插入图片描述

内部类

在这里插入图片描述

静态内部类

在这里插入图片描述

  • 创建静态内部类
/**外部类*/
public class Outer {public static int a = 100;private String hobby;/**学习静态成员内部类*/public static class Inner{private String name;private int age;public static String schoolName;public Inner(){}public Inner(String name, int age) {this.name = name;this.age = age;}public void show(){System.out.println("名称:" + name);System.out.println(a);// System.out.println(hobby); // 报错!
//            Outer o = new Outer();
//            System.out.println(o.hobby);}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;}}
}
  • 调用静态内部类
public class Test {public static void main(String[] args) {Outer.Inner in = new Outer.Inner();in.setName("张三");in.show();}
}

在这里插入图片描述
在这里插入图片描述

成员内部类

在这里插入图片描述

  • 创建成员内部类
/**外部类*/
public class Outer {public static int num = 111;private String hobby;public Outer() {}public Outer(String hobby) {this.hobby = hobby;}/**成员内部类:不能加static修饰 属于外部类对象的*/public class Inner{private String name;private int age;
//        public static int a = 100; // JDK 16开始支持静态成员了
//
//        public static void test(){
//            System.out.println(a);
//        }public void show(){System.out.println("名称:" + name);System.out.println("数量:" + num);System.out.println("爱好:" + hobby);}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;}}
}
  • 调用成员内部类
public class Test {public static void main(String[] args) {Outer.Inner in = new Outer().new Inner();in.setName("内部");in.show();
//        Outer.Inner.test();System.out.println("------------");Outer.Inner in1 = new Outer("爱听课").new Inner();in1.show();}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 案例
public class Test2 {public static void main(String[] args) {People.Heart heart = new People().new Heart();heart.show();}
}class People{private int heartbeat = 150;/**成员内部类*/public class Heart{private int heartbeat = 110;public void show(){int heartbeat = 78;System.out.println(heartbeat); // 78System.out.println(this.heartbeat); // 110System.out.println(People.this.heartbeat); // 150}}
}

局部内部类

在这里插入图片描述

匿名内部类

在这里插入图片描述
在这里插入图片描述

  • 匿名内部类案例
/**目标:学习匿名内部类的形式和特点。*/
public class Test {public static void main(String[] args) {Animal a = new Animal(){@Overridepublic void run() {System.out.println("老虎跑的块~~~");}};a.run();}
}abstract class Animal{public abstract void run();
}
  • 匿名内部类的常见使用形式
/**目标:掌握匿名内部类的使用形式(语法)*/
public class Test2 {public static void main(String[] args) {Swimming s = new Swimming() {@Overridepublic void swim() {System.out.println("学生快乐的自由泳🏊‍");}};go(s);System.out.println("--------------");Swimming s1 = new Swimming() {@Overridepublic void swim() {System.out.println("老师泳🏊的贼快~~~~~");}};go(s1);System.out.println("--------------");go(new Swimming() {@Overridepublic void swim() {System.out.println("运动员🏊的贼快啊~~~~~");}});}/**学生 老师 运动员可以一起参加游泳比赛*/public static void go(Swimming s){System.out.println("开始。。。");s.swim();System.out.println("结束。。。");}
}interface Swimming{void swim();
}

重写equals

  • equals默认是比较2个对象的地址是否相同,子类重写后会调用子类重写的来比较内容是否相同。
public class Student { //extends Object{private String name;private char sex;private int age;public Student() {}public Student(String name, char sex, int age) {this.name = name;this.sex = sex;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public char getSex() {return sex;}public void setSex(char sex) {this.sex = sex;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}/**定制相等规则。两个对象的内容一样就认为是相等的s1.equals(s2)比较者:s1 == this被比较者: s2 ==> o*/@Overridepublic boolean equals(Object o) {// 1、判断是否是同一个对象比较,如果是返回true。if (this == o) return true;// 2、如果o是null返回false  如果o不是学生类型返回false  ...Student !=  ..Pigif (o == null || this.getClass() != o.getClass()) return false;// 3、说明o一定是学生类型而且不为nullStudent student = (Student) o;return sex == student.sex && age == student.age && Objects.equals(name, student.name);}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", sex=" + sex +", age=" + age +'}';}
}
import java.util.Objects;/**目标:掌握Object类中equals方法的使用。*/
public class Test2 {public static void main(String[] args) {Student s1 = new Student("周雄", '男', 19);Student s2 = new Student("周雄", '男', 19);// equals默认是比较2个对象的地址是否相同,子类重写后会调用子类重写的来比较内容是否相同。System.out.println(s1.equals(s2));System.out.println(s1 == s2);System.out.println(Objects.equals(s1, s2));}
}

包装类

在这里插入图片描述
在这里插入图片描述

  • 1、可以赋值为空
Integer age1 = null;
  • 2、可以调用toString()方法得到字符串
Integer i3 = 23;
String rs = i3.toString();
System.out.println(rs + 1);
  • 3、可以把字符串类型的数值转换成真实的数据类型
String number = "23";
//转换成整数
int age = Integer.parseInt(number);
System.out.println(age + 1);
  • 4、扩展直接使用valueOf(),可以转任意类型的数值;
String number = "23";
//转换成整数
int age = Integer.valueOf(number);
System.out.println(age + 1);

在这里插入图片描述

Lambda表达式

在这里插入图片描述


/*** @author* @create 2022-06-22 9:55*/
public class LambdaDemo2_My {// 目标:学会使用Lambda的标准格式简化匿名内部类的代码形式// 注意:Lambda只能简化接口中只有一个抽象方法的匿名内部类形式(函数式接口)public static void main(String[] args) {// 第一种方式Pwimming pwimming = new Pwimming() {@Overridepublic void swim() {System.out.println("老师游泳");}};go(pwimming);System.out.println("===============");// 简化Pwimming pwimming1 = () ->{System.out.println("学生游泳");};go(pwimming1);System.out.println("=================");// 再简化go(() -> {System.out.println("运动员游泳");});// 再简化System.out.println("=================");go(() -> System.out.println("我游泳"));}public static void go(Pwimming pwimming){System.out.println("开始。。。");pwimming.swim();System.out.println("结束。。。");}}@FunctionalInterface // 一旦加上这个注解必须是函数式接口,里面只能有一个抽象方法
interface Pwimming{void swim();
}

在这里插入图片描述
在这里插入图片描述

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;
import java.util.Comparator;public class LambdaDemo3 {public static void main(String[] args) {Integer[] ages1 = {34, 12, 42, 23};/**参数一:被排序的数组 必须是引用类型的元素参数二:匿名内部类对象,代表了一个比较器对象。*/
//        Arrays.sort(ages1, new Comparator<Integer>() {
//            @Override
//            public int compare(Integer o1, Integer o2) {
//                return o2 - o1; //  降序
//            }
//        });//        Arrays.sort(ages1, (Integer o1, Integer o2) -> {
//                return o2 - o1; //  降序
//        });//        Arrays.sort(ages1, ( o1,  o2) -> {
//            return o2 - o1; //  降序
//        });Arrays.sort(ages1, ( o1,  o2 ) ->  o2 - o1 );System.out.println(Arrays.toString(ages1));System.out.println("---------------------------");JFrame win = new JFrame("登录界面");JButton btn = new JButton("我是一个很大的按钮");
//        btn.addActionListener(new ActionListener() {
//            @Override
//            public void actionPerformed(ActionEvent e) {
//                System.out.println("有人点我,点我,点我!!");
//            }
//        });//        btn.addActionListener((ActionEvent e) -> {
//                System.out.println("有人点我,点我,点我!!");
//        });//        btn.addActionListener(( e) -> {
//            System.out.println("有人点我,点我,点我!!");
//        });//        btn.addActionListener( e -> {
//            System.out.println("有人点我,点我,点我!!");
//        });btn.addActionListener( e -> System.out.println("有人点我,点我,点我!!") );win.add(btn);win.setSize(400, 300);win.setVisible(true);}
}

Stream流

在这里插入图片描述
在这里插入图片描述

  • 获取Stream流方式
public class StreamDemo02 {public static void main(String[] args) {/** --------------------Collection集合获取流-------------------------------   */Collection<String> list = new ArrayList<>();Stream<String> s =  list.stream();/** --------------------Map集合获取流-------------------------------   */Map<String, Integer> maps = new HashMap<>();// 键流Stream<String> keyStream = maps.keySet().stream();// 值流Stream<Integer> valueStream = maps.values().stream();// 键值对流(拿整体)Stream<Map.Entry<String,Integer>> keyAndValueStream =  maps.entrySet().stream();/** ---------------------数组获取流------------------------------   */String[] names = {"赵敏","小昭","灭绝","周芷若"};Stream<String> nameStream = Arrays.stream(names);Stream<String> nameStream2 = Stream.of(names);}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

/**目标:Stream流的常用APIforEach : 逐一处理(遍历)count:统计个数-- long count();filter : 过滤元素-- Stream<T> filter(Predicate<? super T> predicate)limit : 取前几个元素skip : 跳过前几个map : 加工方法concat : 合并流。*/
public class StreamDemo03_My {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("张无忌");list.add("周芷若");list.add("赵敏");list.add("张强");list.add("张三丰");list.add("张三丰");list.stream().filter(s -> s.startsWith("张")).forEach(System.out::println);long count = list.stream().filter(s -> s.length() == 3).count();System.out.println(count);list.stream().filter(s -> s.startsWith("张")).limit(2).forEach(System.out::println);list.stream().filter(s -> s.startsWith("张")).skip(2).forEach(System.out::println);// map加工方法: 第一个参数原材料  -> 第二个参数是加工后的结果。// 给集合元素的前面都加上一个:黑马的:list.stream().map(s -> "黑马的:"+s).forEach(System.out::println);List<Student> collect = list.stream().map(s -> {Student student = new Student(s);return student;}).collect(Collectors.toList());System.out.println(collect);// 合并流。Stream<String> stream = list.stream().filter(s -> s.startsWith("张"));Stream<String> java1 = Stream.of("java1", "java2");Stream<String> concat = Stream.concat(stream,java1);System.out.println(concat);}}
/**目标:收集Stream流的数据到 集合或者数组中去。*/
public class StreamDemo05 {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("张无忌");list.add("周芷若");list.add("赵敏");list.add("张强");list.add("张三丰");list.add("张三丰");Stream<String> s1 = list.stream().filter(s -> s.startsWith("张"));List<String> zhangList = s1.collect(Collectors.toList()); // 可变集合zhangList.add("java1");System.out.println(zhangList);//       List<String> list1 = s1.toList(); // 得到不可变集合
//       list1.add("java");
//       System.out.println(list1);// 注意注意注意:“流只能使用一次”Stream<String> s2 = list.stream().filter(s -> s.startsWith("张"));Set<String> zhangSet = s2.collect(Collectors.toSet());System.out.println(zhangSet);Stream<String> s3 = list.stream().filter(s -> s.startsWith("张"));
//         Object[] arrs = s3.toArray();
//        String[] arrs = s3.toArray(s -> new String[s]); // 可以不管,拓展一下思维!!String[] arrs1 = s3.toArray(String[]::new); // 可以不管,拓展一下思维!!System.out.println("Arrays数组内容:" + Arrays.toString(arrs1));}
}

反射

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 反射的第一步:获取Class对象
/**目标:反射的第一步:获取Class对象*/
public class Test {public static void main(String[] args) throws Exception {// 1、Class类中的一个静态方法:forName(全限名:包名 + 类名)Class c = Class.forName("com.itheima.d2_reflect_class.Student");System.out.println(c); // Student.class// 2、类名.classClass c1 = Student.class;System.out.println(c1);// 3、对象.getClass() 获取对象对应类的Class对象。Student s = new Student();Class c2 = s.getClass();System.out.println(c2);}
}
  • 使用反射获取构造器对象
    在这里插入图片描述
/**目标:反射_获取Constructor构造器对象.反射的第一步是先得到Class类对象。(Class文件)反射中Class类型获取构造器提供了很多的API:1. Constructor getConstructor(Class... parameterTypes)根据参数匹配获取某个构造器,只能拿public修饰的构造器,几乎不用!2. Constructor getDeclaredConstructor(Class... parameterTypes)根据参数匹配获取某个构造器,只要申明就可以定位,不关心权限修饰符,建议使用!3. Constructor[] getConstructors()获取所有的构造器,只能拿public修饰的构造器。几乎不用!!太弱了!4. Constructor[] getDeclaredConstructors()获取所有申明的构造器,只要你写我就能拿到,无所谓权限。建议使用!!小结:获取类的全部构造器对象: Constructor[] getDeclaredConstructors()-- 获取所有申明的构造器,只要你写我就能拿到,无所谓权限。建议使用!!获取类的某个构造器对象:Constructor getDeclaredConstructor(Class... parameterTypes)-- 根据参数匹配获取某个构造器,只要申明就可以定位,不关心权限修饰符,建议使用!*/
public class TestStudent01 {// 1. getConstructors:// 获取全部的构造器:只能获取public修饰的构造器。// Constructor[] getConstructors()@Testpublic void getConstructors(){// a.第一步:获取类对象Class c = Student.class;// b.提取类中的全部的构造器对象(这里只能拿public修饰)Constructor[] constructors = c.getConstructors();// c.遍历构造器for (Constructor constructor : constructors) {System.out.println(constructor.getName() + "===>" + constructor.getParameterCount());}}// 2.getDeclaredConstructors():// 获取全部的构造器:只要你敢写,这里就能拿到,无所谓权限是否可及。@Testpublic void getDeclaredConstructors(){// a.第一步:获取类对象Class c = Student.class;// b.提取类中的全部的构造器对象Constructor[] constructors = c.getDeclaredConstructors();// c.遍历构造器for (Constructor constructor : constructors) {System.out.println(constructor.getName() + "===>" + constructor.getParameterCount());}}// 3.getConstructor(Class... parameterTypes)// 获取某个构造器:只能拿public修饰的某个构造器@Testpublic void getConstructor() throws Exception {// a.第一步:获取类对象Class c = Student.class;// b.定位单个构造器对象 (按照参数定位无参数构造器 只能拿public修饰的某个构造器)Constructor cons = c.getConstructor();System.out.println(cons.getName() + "===>" + cons.getParameterCount());}// 4.getConstructor(Class... parameterTypes)// 获取某个构造器:只要你敢写,这里就能拿到,无所谓权限是否可及。@Testpublic void getDeclaredConstructor() throws Exception {// a.第一步:获取类对象Class c = Student.class;// b.定位单个构造器对象 (按照参数定位无参数构造器)Constructor cons = c.getDeclaredConstructor();System.out.println(cons.getName() + "===>" + cons.getParameterCount());// c.定位某个有参构造器Constructor cons1 = c.getDeclaredConstructor(String.class, int.class);System.out.println(cons1.getName() + "===>" + cons1.getParameterCount());}}

在这里插入图片描述

/**目标: 反射_获取Constructor构造器然后通过这个构造器初始化对象。反射获取Class中的构造器对象Constructor作用:也是初始化并得到类的一个对象返回。Constructor的API:1. T newInstance(Object... initargs)创建对象,注入构造器需要的数据。2. void setAccessible(true)修改访问权限,true代表暴力攻破权限,false表示保留不可访问权限(暴力反射)小结:可以通过定位类的构造器对象。如果构造器对象没有访问权限可以通过:void setAccessible(true)打开权限构造器可以通过T newInstance(Object... initargs)调用自己,传入参数!*/
public class TestStudent02 {// 1.调用构造器得到一个类的对象返回。@Testpublic void getDeclaredConstructor() throws Exception {// a.第一步:获取类对象Class c = Student.class;// b.定位单个构造器对象 (按照参数定位无参数构造器)Constructor cons = c.getDeclaredConstructor();System.out.println(cons.getName() + "===>" + cons.getParameterCount());// 如果遇到了私有的构造器,可以暴力反射cons.setAccessible(true); // 权限被打开Student s = (Student) cons.newInstance();System.out.println(s);System.out.println("-------------------");// c.定位某个有参构造器Constructor cons1 = c.getDeclaredConstructor(String.class, int.class);System.out.println(cons1.getName() + "===>" + cons1.getParameterCount());Student s1 = (Student) cons1.newInstance("孙悟空", 1000);System.out.println(s1);}}

在这里插入图片描述
在这里插入图片描述

/**目标:反射获取成员变量: 取值和赋值。Field的方法:给成员变量赋值和取值void set(Object obj, Object value):给对象注入某个成员变量数据Object get(Object obj):获取对象的成员变量的值。void setAccessible(true);暴力反射,设置为可以直接访问私有类型的属性。Class getType(); 获取属性的类型,返回Class对象。String getName(); 获取属性的名称。*/
public class FieldDemo02 {@Testpublic void setField() throws Exception {// a.反射第一步,获取类对象Class c = Student.class;// b.提取某个成员变量Field ageF = c.getDeclaredField("age");ageF.setAccessible(true); // 暴力打开权限// c.赋值Student s = new Student();ageF.set(s , 18);  // s.setAge(18);System.out.println(s);// d、取值int age = (int) ageF.get(s);System.out.println(age);}
}

在这里插入图片描述
在这里插入图片描述

/**目标:反射——获取Method方法对象反射获取类的Method方法对象:1、Method getMethod(String name,Class...args);根据方法名和参数类型获得对应的方法对象,只能获得public的2、Method getDeclaredMethod(String name,Class...args);根据方法名和参数类型获得对应的方法对象,包括private的3、Method[] getMethods();获得类中的所有成员方法对象,返回数组,只能获得public修饰的且包含父类的4、Method[] getDeclaredMethods();获得类中的所有成员方法对象,返回数组,只获得本类申明的方法。Method的方法执行:Object invoke(Object obj, Object... args)参数一:触发的是哪个对象的方法执行。参数二: args:调用方法时传递的实际参数*/
public class MethodDemo01 {/*** 1.获得类中的所有成员方法对象*/@Testpublic void getDeclaredMethods(){// a.获取类对象Class c = Dog.class;// b.提取全部方法;包括私有的Method[] methods = c.getDeclaredMethods();// c.遍历全部方法for (Method method : methods) {System.out.println(method.getName() +" 返回值类型:" + method.getReturnType() + " 参数个数:" + method.getParameterCount());}}/*** 2. 获取某个方法对象*/@Testpublic void getDeclardMethod() throws Exception {// a.获取类对象Class c = Dog.class;// b.提取单个方法对象Method m = c.getDeclaredMethod("eat");Method m2 = c.getDeclaredMethod("eat", String.class);// 暴力打开权限了m.setAccessible(true);m2.setAccessible(true);// c.触发方法的执行Dog d = new Dog();// 注意:方法如果是没有结果回来的,那么返回的是null.Object result = m.invoke(d);System.out.println(result);Object result2 = m2.invoke(d, "骨头");System.out.println(result2);}
}

注解

在这里插入图片描述

public @interface Book {String value(); // 特殊属性double price() ;//double price() default 9.9;
}
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Bookk {String value();double price() default 100;String[] author();
}
/**目标:学会自定义注解。掌握其定义格式和语法。*/
@MyBook(name="《精通JavaSE》",authors = {"黑马", "dlei"} , price = 199.5)
//@Book(value = "/delete")
// @Book("/delete")
@Book(value = "/delete", price = 23.5)
//@Book("/delete")
public class AnnotationDemo1 {@MyBook(name="《精通JavaSE2》",authors = {"黑马", "dlei"} , price = 199.5)private AnnotationDemo1(){}@MyBook(name="《精通JavaSE1》",authors = {"黑马", "dlei"} , price = 199.5)public static void main(String[] args) {@MyBook(name="《精通JavaSE2》",authors = {"黑马", "dlei"} , price = 199.5)int age = 21;}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target({ElementType.METHOD,ElementType.FIELD}) // 元注解
@Retention(RetentionPolicy.RUNTIME) // 一直活着,在运行阶段这个注解也不消失
public @interface MyTest {
}
/**目标:认识元注解*/
//@MyTest // 只能注解方法和成员变量
public class AnnotationDemo2 {@MyTestprivate String name;@MyTestpublic void test(){}public static void main(String[] args) {}
}

在这里插入图片描述
在这里插入图片描述

/**目标:完成注解的解析*/
public class AnnotationDemo3 {@Testpublic void parseClass(){// a.先得到类对象Class c = BookStore.class;// b.判断这个类上面是否存在这个注解if(c.isAnnotationPresent(Bookk.class)){//c.直接获取该注解对象Bookk book = (Bookk) c.getDeclaredAnnotation(Bookk.class);System.out.println(book.value());System.out.println(book.price());System.out.println(Arrays.toString(book.author()));}}@Testpublic void parseMethod() throws NoSuchMethodException {// a.先得到类对象Class c = BookStore.class;Method m = c.getDeclaredMethod("test");// b.判断这个类上面是否存在这个注解if(m.isAnnotationPresent(Bookk.class)){//c.直接获取该注解对象Bookk book = (Bookk) m.getDeclaredAnnotation(Bookk.class);System.out.println(book.value());System.out.println(book.price());System.out.println(Arrays.toString(book.author()));}}
}@Bookk(value = "《情深深雨濛濛》", price = 99.9, author = {"琼瑶", "dlei"})
class BookStore{@Bookk(value = "《三少爷的剑》", price = 399.9, author = {"古龙", "熊耀华"})public void test(){}
}

动态代理

在这里插入图片描述

  • 定义一个需要代理的接口
/*** @author* @create 2022-06-23 9:24*/
public interface Skill {void jump(); // 唱歌void sing(); // 跳舞}
  • 实现该接口
/*** @author* @create 2022-06-23 9:25*/
public class Star implements Skill{private String name;public Star(String name) {this.name = name;}@Overridepublic void jump() {System.out.println(name+"开始跳舞,条的好看");}@Overridepublic void sing() {System.out.println(name+"开始唱歌,喵喵喵");}
}
  • 设计一个方法来返回对象的代理对象
/*** @author* @create 2022-06-23 9:28*/
public class StarAgentProxy {/*** 设计一个方法来返回对象的代理对象*/public static Skill getProxy(Star obj){// 为杨超越这个对象,生成一个代理对象return (Skill) Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 参数一:代理对象本身。一般不管// 参数二:正在被代理的方法// 参数三:被代理方法,应该传入的参数System.out.println("收首付款");// 真正让杨超越调用的方法对象Object invoke = method.invoke(obj, args);System.out.println("经纪人,收尾款");return invoke;}});}
}
  • 测试动态代理模式
/*** @author* @create 2022-06-23 9:26*/
public class Test {public static void main(String[] args) {// 目标:学习开发一个动态代理的对象,理解动态代理的执行流程// 1.创建一个对象,对象的类必须实现接口Star s = new Star("杨超越");// 为杨超越生成一个代理对象(经纪人)Skill proxy = StarAgentProxy.getProxy(s);proxy.jump();proxy.sing();}
}

相关文章:

Java面向对象

Java面向对象 静态 static static修饰静态成员变量 /**在线人数。注意&#xff1a;static修饰的成员变量&#xff1a;静态成员变量&#xff0c;只在内存中有一份&#xff0c;可以被共享*/ public static int onlineNumber 161;static静态成员方法 /**静态成员方法: 有stat…...

Redis —缓存常见异常

文章目录缓存雪崩解决办法缓存击穿解决办法缓存穿透缓存穿透的两种常见情况解决办法布隆过滤器工作原理缓存雪崩 大量缓存数据在同一时间过期&#xff08;失效&#xff09;或者 Redis 故障宕机时&#xff0c;如果此时有大量的用户请求&#xff0c;都无法在 Redis 中处理&#…...

JavaEE企业级应用开发教程——第十二章 Spring MVC数据绑定和相应(黑马程序员第二版)(SSM)

第十二章 Spring MVC数据绑定和相应 12.1 数据绑定 在 Spring MVC 中&#xff0c;当接收到客户端的请求时&#xff0c;会根据请求参数和请求头等信息&#xff0c;将参数以特定的方式转换并绑定到处理器的形参中&#xff0c;这个过程称为数据绑定。数据绑定的流程大致如下&…...

银行数字化转型导师坚鹏:金融数据治理、数据安全政策解读

金融数据治理、数据安全政策解读及大数据应用课程背景&#xff1a; 很多银行存在以下问题&#xff1a;不知道如何准确理解金融数据治理及数据安全相关政策不清楚金融数据治理及数据安全相关政策对银行有什么影响&#xff1f;不清楚如何有效应用金融数据治理及数据安全相关…...

Vue动图数据表格,根据字段是否为空,控制表格列的隐藏和显示

所在前面的话&#xff0c;我是个前端小白&#xff0c;大佬请绕行&#xff0c;可能大佬觉得很简单&#xff0c;但是我真的花了好几个小时去解决&#xff0c;所以记录一下&#xff0c;下次也可以作为参考。 我主要是以第二种方式进行修改的 开门见山 简述问题&#xff1a;大家…...

带你们偷瞄编程绕不开的C语言(二)

&#x1f929;&#xff1a;大家好&#xff0c;我是paperjie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;&#xff1a;这里是C专栏&#xff0c;笔者用重金(时间和精力)打造&#xff0c;基础知识一网打尽&#xff0c;希望可以帮到读者们哦。 &#x1f…...

TCP三次握手和四次挥手

文章目录TCP三次握手TCP四次挥手TCP三次握手 序列号&#xff1a;建立连接时计算机随机生成的随机数作为初始值&#xff0c;通过SYN包传给接收端主机&#xff0c;每发送一次数据就累加一次该数据字节数的大小。用来解决网络包乱序问题。 确认应答号&#xff1a;指下一次期望收到…...

L1-016 查验身份证

L1-016 查验身份证 题目链接 题意 判断18位身份证号码&#xff08;17位数字&#xff0b;1位校验码&#xff09;是否合法&#xff0c;对于不合法的身份证号码进行输出&#xff0c;若全都符合&#xff0c;则输出“All passed”&#xff0c;判断是否合法的规则如下&#xff1a; …...

强大到让人无法想象的ChatGPT-5即将发布,上千名人士却紧急叫停

目录 【ChatGPT 5简介】 【ChatGPT 5的潜在应用】 【ChatGPT 5的潜在危险】 ChatGPT4还没有好好体验&#xff0c;比GPT4强大1000倍的ChatGPT5又即将发布&#xff01;届时将彻底改变人工智能领域&#xff0c;并改变我们现有的世界 【ChatGPT 5简介】 OpenAI计划在2023年12月发…...

C++中的功能 及 用法

参考资料&#xff1a; C中&的功能 及 用法 - konglingbin - 博客园 (cnblogs.com) 对于习惯使用C进行开发的朋友们&#xff0c;在看到c中出现的&符号&#xff0c;可能会犯迷糊&#xff0c;因为在C语言中这个符号表示了取地址符&#xff0c;但是在C中它却有着不同的用途…...

Linux解除指定端口占用进程教程

Linux 解除指定端口占用进程教程 在 Linux 系统中&#xff0c;经常会遇到某个端口被占用的情况&#xff0c;这会导致某些服务无法正常运行。为了解决这个问题&#xff0c;我们需要找到占用该端口的进程&#xff0c;并将其停止。本文将介绍 Linux 中如何解除指定端口占用进程的方…...

雪花算法简介

一&#xff1a;概述 - SnowFlake 算法 - 是 Twitter 开源的分布式 id 生成算法。 - 应用场景 - 高性能的产生不重复 ID&#xff0c;支持集群的横向扩展。 二&#xff1a;原理 - 其核心思想就是&#xff1a; - 使用一个 64 bit 的 long 型的数字作为全局唯一 id。 - 在分布…...

人口普查数据集独热编码转换

人口普查数据集独热编码转换 描述 在机器学习中&#xff0c;数据的表示方式对于模型算法的性能影响很大&#xff0c;寻找数据最佳表示的过程被称为“特征工程”&#xff0c;在实际应用中许多特征并非连续的数值&#xff0c;比如国籍、学历、性别、肤色等&#xff0c;这些特征…...

牛客过第二遍

1、spring事务管理 1.1 Spring事务管理 声明式事务&#xff1a; 1 通过XML配置&#xff0c;声明某方法的事务特征 2、通过注解&#xff0c;声明某方法的事务特征&#xff0c;注解Transactional 1.2 Transactional 注解参数讲解 隔离级别传播行为回滚规则是否只读事务超时…...

科普:java与JavaScript的区别

Java和JavaScript是两种非常流行的编程语言&#xff0c;它们都有自己独特的特点和用途。尽管它们的名称相似&#xff0c;但实际上它们之间存在很多差异。在本文中&#xff0c;我们将详细介绍Java和JavaScript之间的区别。 一、Java和JavaScript的历史 Java是由Sun Microsyste…...

【教程】Unity 与 Simence PLC 联动通讯

开发平台&#xff1a;Unity 2021 依赖DLL&#xff1a;S7.NET 编程语言&#xff1a;CSharp 6.0 以上   一、前言 Unity 涉及应用行业广泛。在工业方向有着一定方向的涉足与深入。除构建数据看板等内容&#xff0c;也会有模拟物理设备进行虚拟孪生的需求需要解决。而 SIMATIC&a…...

视频编解码(一)之virtio-gpu环境搭建

一、基础概念 VA-API Video Acceleration API 是一组开源应用API接口&#xff0c;赋能应用&#xff08;比如VLC播放器、GStreamer等&#xff09;使用hardware video acceleration&#xff08;一般是GPU提供硬件视频加速功能&#xff09;&#xff0c;VA-API主要由开源库libva和…...

JDBC概述三(批处理+事务操作+数据库连接池)

一&#xff08;批处理&#xff09; 1.1 批处理简介 批处理&#xff0c;简而言之就是一次性执行多条SQL语句&#xff0c;在一定程度上可以提升执行SQL语句的速率。批处理可以通过使用Java的Statement和PreparedStatement来完成&#xff0c;因为这两个语句提供了用于处理批处理…...

MappedByteBuffer 详解(图解+秒懂+史上最全)

背景&#xff1a; 在尼恩视频版本里&#xff0c;从架构师视角&#xff0c;尼恩为大家彻底介绍 rocketmq 高可用、高并发中间件的原理与实操。 给大家底层的解读清楚 rocketmq 架构设计、源码设计、工业级高可用实操&#xff0c;含好多复杂度非常高、又非常核心的概念&#xff…...

顶点程序经典案例——树木生长

树木生长Shader一、介绍 大家好&#xff0c;我是阿赵。这次来做一个树木生长的Shader。 顶点程序作为整个渲染管线里面和片段程序并列的两大可控过程之一&#xff0c;一直存在感都比较低。我们平时制作的效果&#xff0c;很多都是在片段程序里面实现的计算&#xff0c;顶点程序…...

在云计算环境下保护Java应用程序的有效措施

云计算&#xff08;Cloud&#xff09;技术是近年来计算机科学的一个重要突破。大多数组织已经通过将自己的应用程序移入云平台而获益。不过&#xff0c;如何保证应用程序在第三方服务器上的安全性&#xff0c;是一项艰巨的挑战。 在本文中&#xff0c;我们将重点讨论Java&…...

vscode-markdown-代码片段及快捷键设置

代码片段及快捷键设置 主要为了插入表格和图片标签节约一点输入时间 代码片段设置 ctrlshiftp 打开面板输入 configure user snippets选择markdowncopy如下设置放入{}中 "tb4*4": {"prefix": "tb4*4","body": ["| $1 | $2 | $…...

ModelNet40数据集

跑PointNet,modelnet40数据集时; 有些人直接用.off文件;——【CAD模型】普林斯顿形状Banchmark中的.off文件遵循以下标准&#xff1a; OFF文件全是以OFF关键字开始的ASCII文件。下一行说明顶点的数量、面片的数量、边的数量。 边的数量可以安全地省略。对模型不会有影响(可以为…...

【都2023年了,还在问网络安全怎么入门】

前言 【都2023年了&#xff0c;还在问网络安全怎么入门】所以这一期就出一一个怎么学习网络安全的学习路线和方法&#xff0c;觉得有用的话点赞收藏下 首先咱们聊聊&#xff0c;学习网络安全方向通常会有哪些问题 1、打基础时间太长 学基础花费很长时间&#xff0c;光语言都有…...

Apple Xcode 14.3 (14E222b) 正式版发布下载

Command Line Tools for Xcode 14, tvOS 16 & watchOS 9 Simulator Runtime 请访问原文链接&#xff1a;https://sysin.org/blog/apple-xcode-14/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org Xcode 14 包含了在所有 Ap…...

【Linux】sar常用选项介绍

sar 使用 安装sysstat apt-get install sysstat -y #或 yum install sysstat -y选项 用法: sar [ 选项 ] [ <时间间隔> [ <次数> ] ] 选项&#xff1a; [ -A ] [ -B ] [ -b ] [ -C ] [ -D ] [ -d ] [ -F [ MOUNT ] ] [ -H ] [ -h ] [ -p ] [ -q ] [ -r [ ALL ] ]…...

PHP 单笔转账到支付宝账户,支付宝公钥证书实现版本

支付宝某些业务只能使用公钥证书方式来验签 如&#xff1a;即使转账 红包等 笔者就要实现这样一个功能&#xff0c;【单笔转账到支付宝账户】&#xff0c;采用支付宝公钥证书签名来实现。 话不多说&#xff0c;流程先走起 第一步&#xff1a;下载支付宝秘钥生成器 由于我们使…...

第十四届蓝桥杯大赛软件赛省赛 C/C++ 大学 A 组 E 题

颜色平衡树问题描述格式输入格式输出样例输入样例输出评测用例规模与约定解析参考程序问题描述 格式输入 输入的第一行包含一个整数 n &#xff0c;表示树的结点数。 接下来 n 行&#xff0c;每行包含两个整数 Ci , Fi&#xff0c;用一个空格分隔&#xff0c;表示第 i 个结点 …...

Python 小型项目大全 21~25

二十一、DNA 可视化 原文&#xff1a;http://inventwithpython.com/bigbookpython/project21.html 脱氧核糖核酸是一种微小的分子&#xff0c;存在于我们身体的每个细胞中&#xff0c;包含着我们身体如何生长的蓝图。它看起来像一对核苷酸分子的双螺旋结构&#xff1a;鸟嘌呤、…...

MinIO从信息泄漏到RCE

文章目录信息泄露漏洞利用漏洞分析漏洞修复RCE漏洞分析参考文章信息泄露 漏洞利用 如果MinIO以集群方式部署&#xff0c;存在信息泄露漏洞&#xff0c;攻击者可以通过HTTP请求获取目标进程的所有环境变量&#xff0c;包括MINIO_SECRET_KEY和MINIO_ROOT_PASSWORD. vulhub有环…...