201771010102 常惠琢《面向对象程序设计(java)》第八周学习总结

1、实验目的与要求

(1) 掌握接口定义方法;

(2) 掌握实现接口类的定义要求;

(3) 掌握实现了接口类的使用要求;

(4) 掌握程序回调设计模式;

(5) 掌握Comparator接口用法;

(6) 掌握对象浅层拷贝与深层拷贝方法;

(7) 掌握Lambda表达式语法;

(8) 了解内部类的用途及语法要求。

2、实验内容和步骤

实验1: 导入第6章示例程序,测试程序并进行代码注释。

测试程序1:

编辑、编译、调试运行阅读教材214页-215页程序6-1、6-2,理解程序并分析程序运行结果;

在程序中相关代码处添加新知识的注释。

掌握接口的实现用法;

掌握内置接口Compareable的用法。

 

package interfaces;import java.util.*;/*** 这个程序演示了可比接口的使用。* @version 1.30 2004-02-27* @author Cay Horstmann*/
public class EmployeeSortTest
{public static void main(String[] args){//new 新建一个Employee 数组对象 给staff所引用Employee[] staff = new Employee[3];staff[0] = new Employee("Harry Hacker", 35000);staff[1] = new Employee("Carl Cracker", 75000);staff[2] = new Employee("Tony Tester", 38000);//对staff进行排序的方法
      Arrays.sort(staff);// 打印所有员工对象的信息for (Employee e : staff)System.out.println("name=" + e.getName() + ",salary=" + e.getSalary());}
}

 

package interfaces;//将Employee类声明为实现Comparable接口
public class Employee implements Comparable<Employee>
{private String name;//某个类定义了一个只能在该类内部才能访问的,名叫name的字符串变量private double salary;//某个类定义了一个只能在该类内部才能访问的,名叫salary的字符串变量//利用构造方法初始化各个域public Employee(String name, double salary){this.name = name;this.salary = salary;}//Name访问器
   public String getName(){return name;}//Salary访问器public double getSalary(){return salary;}//调用方法,改写工资数据public void raiseSalary(double byPercent){double raise = salary * byPercent / 100;salary += raise;}/*** 用工资比较员工* @一个雇员对象参数 * @如果雇员工资较低,则返回负值* otherObject, 0 if the salaries are the same, a positive value otherwise * 如果工资相同,则以正值计算*///用这个对象与other进行比较。如果这个对象小于other,则返回负值;如果相等则返回0;否则返回正值public int compareTo(Employee other){return Double.compare(salary, other.salary);}
}

测试程序2:

编辑、编译、调试以下程序,

interface  A

{

  double g=9.8;

  void show( );

}

class C implements A

{

  public void show( )

  {System.out.println("g="+g);}

}

 

class InterfaceTest

{

  public static void main(String[ ] args)

  {

       A a=new C( );

       a.show( );

       System.out.println("g="+C.g);

  }

}

 

//创建一个接口A
interface  A
{//给g赋值一个双精度型值double g=9.8;//一个用户自定义函数名,完成输出操作void show( );
}
//C是类名,implements是实现A与java之间的接口
class C implements A
{//展示信息public void show( ) //输出g的值 {System.out.println("g="+g);} }

 

class InterfaceTest
{    public static void main(String[ ] args){//C是A的子类,实例化一个子类对象aA a=new C( ); //显示子类对象a  a.show( ); //输出C中输出的结果 System.out.println("g="+C.g); } }

测试程序3:

elipse IDE中调试运行教材223页6-3,结合程序运行结果理解程序;

26行、36行代码参阅224页,详细内容涉及教材12章。

在程序中相关代码处添加新知识的注释。

掌握回调程序设计模式;

 

package timer;/**@version 1.01 2015-05-12@author Cay Horstmann
*/
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.Timer; // 用JavaUTIL计时器解决冲突 
public class TimerTest
{  public static void main(String[] args){  //TimePrinter实现了ActionListerActionListener listener = new TimePrinter();//构建一个调用侦听器的计时器// 每10秒一次 Timer t = new Timer(10000, listener);//t对象调用start方法
      t.start();//显示包含一条消息和OK按钮的对话框JOptionPane.showMessageDialog(null, "Quit program?");//结束程序System.exit(0);}
}
class TimePrinter implements ActionListener
{  public void actionPerformed(ActionEvent event){  System.out.println("At the tone, the time is " + new Date());//发出哔一声
      Toolkit.getDefaultToolkit().beep();}
}

测试程序4:

 调试运行教材229页-231页程序6-4、6-5,结合程序运行结果理解程序;

在程序中相关代码处添加新知识的注释。

掌握对象克隆实现技术;

掌握浅拷贝和深拷贝的差别。

package clone;import java.util.Date;
import java.util.GregorianCalendar;public class Employee implements Cloneable
{private String name;private double salary;private Date hireDay;public Employee(String name, double salary){this.name = name;this.salary = salary;hireDay = new Date();}

//定义一个克隆方法public Employee clone() throws CloneNotSupportedException{
// call Object.clone()//任何Object都是可以执行克隆(clone)方法的Employee cloned = (Employee) super.clone();
// 继承object类
// 克隆可变字段 cloned.hireDay = (Date) hireDay.clone();//string没有克隆功能return cloned;}/*** 把雇佣日定在指定的日期* @param year the year of the hire day //租年的一年 * @param month the month of the hire day //每月租用月份 * @param day the day of the hire day //雇佣日的一天 */public void setHireDay(int year, int month, int day){Date newHireDay = new GregorianCalendar(year, month - 1, day).getTime();// 实例字段突变示例 hireDay.setTime(newHireDay.getTime());}public void raiseSalary(double byPercent){double raise = salary * byPercent / 100;salary += raise;}public String toString(){return "Employee[name=" + name + ",salary=" + salary + ",hireDay=" + hireDay + "]";} }
package clone;/*** This program demonstrates cloning.* @version 1.10 2002-07-01* @author Cay Horstmann*/
public class CloneTest
{public static void main(String[] args){try//放入try,配合后面的语句捕获异常
      {Employee original = new Employee("John Q. Public", 50000);original.setHireDay(2000, 1, 1);Employee copy = original.clone();copy.raiseSalary(10);copy.setHireDay(2002, 12, 31);System.out.println("original=" + original);System.out.println("copy=" + copy);}catch (CloneNotSupportedException e)//捕获异常
      {e.printStackTrace();}}
}

 

实验2: 导入第6章示例程序6-6,学习Lambda表达式用法。

调试运行教材233页-234页程序6-6,结合程序运行结果理解程序;

在程序中相关代码处添加新知识的注释。

27-29行代码与教材223页程序对比,将27-29行代码与此程序对比,体会Lambda表达式的优点。

代码如下:

 

package lambda;import java.util.*;import javax.swing.*;
import javax.swing.Timer;/*** This program demonstrates the use of lambda expressions.* //这个程序演示了lambda表达式的用法。* @version 1.0 2015-05-12* @author Cay Horstmann*/
public class LambdaTest
{public static void main(String[] args){//初始化一个数组String[] planetsString[] planets = new String[] { "Mercury", "Venus", "Earth", "Mars","Jupiter", "Saturn", "Uranus", "Neptune" };System.out.println(Arrays.toString(planets));System.out.println("Sorted in dictionary order:");Arrays.sort(planets);System.out.println(Arrays.toString(planets));//打印出Arrays.toString方法System.out.println("Sorted by length:");Arrays.sort(planets, (first, second) -> first.length() - second.length());System.out.println(Arrays.toString(planets));Timer t = new Timer(1000, event ->System.out.println("The time is " + new Date()));t.start();   //保持程序运行直到用户选择“OK”JOptionPane.showMessageDialog(null, "Quit program?");System.exit(0);         }}

 

 

}注:以下实验课后完成

实验3: 编程练习

编制一个程序,将身份证号.txt 中的信息读入到内存中;

按姓名字典序输出人员信息;

查询最大年龄的人员信息;

查询最小年龄人员信息;

输入你的年龄,查询身份证号.txt中年龄与你最近人的姓名、身份证号、年龄、性别和出生地;

查询人员中是否有你的同乡。

 

public class Student implements Comparable<Student> {private String name;private String number ;private String sex ;private int age;private String province;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getnumber() {return number;}public void setnumber(String number) {this.number = number;}public String getsex() {return sex ;}public void setsex(String sex ) {this.sex =sex ;}public int getage() {return age;}public void setage(int age) {// int a = Integer.parseInt(age);this.age= age;}public String getprovince() {return province;}public void setprovince(String province) {this.province=province ;}public int compareTo(Student o) {return this.name.compareTo(o.getName());}public String toString() {return  name+"\t"+sex+"\t"+age+"\t"+number+"\t"+province+"\n";}    
}

 

    import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.Arrays;import java.util.Collections;import java.util.Scanner;public class Test {private static ArrayList<Student> studentlist;public static void main(String[] args) {studentlist = new ArrayList<>();Scanner scanner = new Scanner(System.in);File file = new File("F:\\java\\身份证号.txt");try {FileInputStream fis = new FileInputStream(file);BufferedReader in = new BufferedReader(new InputStreamReader(fis));String temp = null;while ((temp = in.readLine()) != null) {Scanner linescanner = new Scanner(temp);linescanner.useDelimiter(" ");    String name = linescanner.next();String number = linescanner.next();String sex = linescanner.next();String age = linescanner.next();String province =linescanner.nextLine();Student student = new Student();student.setName(name);student.setnumber(number);student.setsex(sex);int a = Integer.parseInt(age);student.setage(a);student.setprovince(province);studentlist.add(student);}} catch (FileNotFoundException e) {System.out.println("找不到学生的信息文件");e.printStackTrace();} catch (IOException e) {System.out.println("学生信息文件读取错误");e.printStackTrace();}boolean isTrue = true;while (isTrue) {System.out.println("选择你的操作, ");System.out.println("1.字典排序  ");System.out.println("2.输出年龄最大和年龄最小的人  ");System.out.println("3.寻找同乡  ");System.out.println("4.寻找年龄相近的人  ");System.out.println("5.退出 ");String m = scanner.next();switch (m) {case "1":Collections.sort(studentlist);              System.out.println(studentlist.toString());break;case "2":int max=0,min=100;int j,k1 = 0,k2=0;for(int i=1;i<studentlist.size();i++){j=studentlist.get(i).getage();if(j>max){max=j; k1=i;}if(j<min){min=j; k2=i;}}  System.out.println("年龄最大:"+studentlist.get(k1));System.out.println("年龄最小:"+studentlist.get(k2));break;case "3":System.out.println("地址?");String find = scanner.next();        String place=find.substring(0,3);for (int i = 0; i <studentlist.size(); i++) {if(studentlist.get(i).getprovince().substring(1,4).equals(place)) System.out.println("同乡"+studentlist.get(i));}             break;case "4":System.out.println("年龄:");int yourage = scanner.nextInt();int near=agenear(yourage);int value=yourage-studentlist.get(near).getage();System.out.println(""+studentlist.get(near));break;case "5 ":isTrue = false;System.out.println("退出程序!");break;default:System.out.println("输入有误");}}}public static int agenear(int age) {      int j=0,min=53,value=0,ok=0;for (int i = 0; i < studentlist.size(); i++){value=studentlist.get(i).getage()-age;if(value<0) value=-value; if (value<min) {min=value;ok=i;} }    return ok;         }}

 

实验4:内部类语法验证实验

实验程序1:

编辑、调试运行教材246页-247页程序6-7,结合程序运行结果理解程序;

了解内部类的基本用法。

package innerClass;import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.Timer;
/*** 这个程序演示了内部类的使用。 * @version 1.11 2015-05-12* @author Cay Horstmann*/
public class InnerClassTest
{public static void main(String[] args){TalkingClock clock = new TalkingClock(1000, true);clock.start();//保持程序运行直到用户选择“OK” JOptionPane.showMessageDialog(null, "Quit program?");System.exit(0);}
}/*** 按规定时间打印时间的钟*/
class TalkingClock
{private int interval;private boolean beep;/*** 构造一个会说话的钟 * PARAM间隔消息间的间隔(毫秒)* 如果时钟应该发出嘟嘟声 */public TalkingClock(int interval, boolean beep){this.interval = interval;this.beep = beep;}/*** Starts the clock.  //启动时钟 */public void start(){ActionListener listener = new TimePrinter();Timer t = new Timer(interval, listener);t.start();}public class TimePrinter implements ActionListener{public void actionPerformed(ActionEvent event){System.out.println("At the tone, the time is " + new Date());if (beep) Toolkit.getDefaultToolkit().beep();}}
}

 

实验程序2:

编辑、调试运行教材254页程序6-8,结合程序运行结果理解程序;

了解匿名内部类的用法。

 

package anonymousInnerClass;import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.Timer;/***这个程序演示匿名内部类。 * @version 1.11 2015-05-12* @author Cay Horstmann*/
public class AnonymousInnerClassTest
{public static void main(String[] args){TalkingClock clock = new TalkingClock();clock.start(1000, true);// keep program running until user selects "Ok"JOptionPane.showMessageDialog(null, "Quit program?");System.exit(0);}
}/***按规定时间打印时间的钟 */
class TalkingClock
{/*** Starts the clock.  //启动时钟 * @param interval the interval between messages (in milliseconds)  //PARAM间隔消息间的间隔(毫秒) * @param beep true if the clock should beep  //如果时钟应该发出嘟嘟声 */public void start(int interval, boolean beep){ActionListener listener = new ActionListener(){public void actionPerformed(ActionEvent event){System.out.println("At the tone, the time is " + new Date());if (beep) Toolkit.getDefaultToolkit().beep();}};Timer t = new Timer(interval, listener);t.start();}
}

 

 

实验程序3:

elipse IDE中调试运行教材257页-258页程序6-9,结合程序运行结果理解程序;

了解静态内部类的用法。

 

package staticInnerClass;/*** This program demonstrates the use of static inner classes.  //这个程序演示了使用静态内部类* @version 1.02 2015-05-12* @author Cay Horstmann*/
public class StaticInnerClassTest
{public static void main(String[] args){double[] d = new double[20];for (int i = 0; i < d.length; i++)d[i] = 100 * Math.random();ArrayAlg.Pair p = ArrayAlg.minmax(d);System.out.println("min = " + p.getFirst());System.out.println("max = " + p.getSecond());}
}class ArrayAlg
{/*** A pair of floating-point numbers  //一对浮点数 */public static class Pair{private double first;private double second;/*** Constructs a pair from two floating-point numbers  //用两个浮点数构造一对 * @param f the first number  //第一个数字 * @param s the second number  //第二个数字 */public Pair(double f, double s){first = f;second = s;}/*** Returns the first number of the pair  //返回对的第一个数 * @return the first number  //返回第一个数字 */public double getFirst(){return first;}/*** Returns the second number of the pair  //返回对的第二个数 * @return the second number  //返回第二个数*/public double getSecond(){return second;}}/*** Computes both the minimum and the maximum of an array  //计算数组的最小值和最大值。* @param values an array of floating-point numbers   //PARAM值的浮点数数组 * @return a pair whose first element is the minimum and whose second element  //返回第一元素为最小的一对和第二个元素* is the maximum  //是最大值 */public static Pair minmax(double[] values){double min = Double.POSITIVE_INFINITY;double max = Double.NEGATIVE_INFINITY;for (double v : values){if (min > v) min = v;if (max < v) max = v;}return new Pair(min, max);}
}

 

总结:

 一、接口:
Java为了克服单继承的缺点,Java使用了接口, 一个类可以实现一个或多个接口。 

   在Java程序设计语言中,接口不是类,而是对类 的一组需求描述,由常量和一组抽象方法组成。 接口中不包括变量和有具体实现的方法。 

   只要类实现了接口,则该类要遵从接口描述的统 一格式进行定义,并且可以在任何需要该接口的 地方使用这个类的对象。

   类似建立类的继承关系,接口也可以扩展。 

   接口的扩展技术使得从具有较高通用性的接口存在多条链延伸到具有较高专用性的接口。

 (1)通常接口的名字以able或ible结尾;

   (2)可以使用extends来继承接口的常量和抽象方 法,扩展形成新的接口;

 (3)接口中的所有常量必须是public static final,方法必须是public abstract,这是 系统默认的,不管你在定义接口时,写不写 修饰符都是一样的。

接口与抽象类的区别:

(1)接口不能实现任何方法,而抽象类可以。

(2)类可以实现许多接口,但只有一个父类。

(3)接口不是类分级结构的一部分,无任何联 系的类可以实现相同的接口

二、回调(callback):

一种程序设计模式,在这种模 式中,可指出某个特定事件发生时程序应该采取 的动作。

三、Object类的Clone方法:
当拷贝一个对象变量时,原始变量与拷贝变量 引用同一个对象。这样,改变一个变量所引用 的对象会对另一个变量产生影响。

四、 浅层拷贝与深层拷贝:
浅层拷贝:被拷贝对象的所有常量成员和基本类 型属性都有与原来对象相同的拷贝值,而若成员 域是一个对象,则被拷贝对象该对象域的对象引 用仍然指向原来的对象。 深层拷贝:被拷贝对象的所有成员域都含有与原 来对象相同的值,且对象域将指向被复制过的新对 象,而不是原有对象被引用的对象。换言之,深 层拷贝将拷贝对象内引用的对象也拷贝一遍。

五、 Java中对象克隆的实现:
在子类中实现Cloneable接口。 

    为了获取对象的一份拷贝,可以利用Object类 的clone方法。

在子类中覆盖超类的clone方法,声明为 public。

在子类的clone方法中,调用super.clone()。

       对象克隆要点:
–在类中实现Cloneable接口。

–为了获取对象的一份拷贝,使用Object类的clone 方法。

–在类中覆盖超类的clone方法,声明为public。

–在类的clone方法中,调用super.clone()。

六、Lambda表达式:
Java Lambda 表达式是Java 8 引入的一个新的功能,主要用途是提供一个函数化的语法来简化编码。

 

转载于:https://www.cnblogs.com/hongyanohongyan/p/9820092.html

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

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

相关文章

新版 Android 已支持 FIDO2 标准,免密登录应用或网站

谷歌刚刚宣布了与 FIDO 联盟达成的最新合作&#xff0c;为 Android 用户带来了无需密码、即可登录网站或应用的便捷选项。 这项服务基于 FIDO2 标准实现&#xff0c;任何运行 Android 7.0 及后续版本的设备&#xff0c;都可以在升级最新版 Google Play 服务后&#xff0c;通过指…

t-sne原理解释_T-SNE解释-数学与直觉

t-sne原理解释The method of t-distributed Stochastic Neighbor Embedding (t-SNE) is a method for dimensionality reduction, used mainly for visualization of data in 2D and 3D maps. This method can find non-linear connections in the data and therefore it is hi…

oracle操作

imp kfqrlcs/kfqrlcshx fileC:\kfqrlcs.dmp fully //创建临时表空间 create temporary tablespace kfqrlcs_temp tempfile C:\oracledata\kfqrlcs_temp.dbf size 32m autoextend on next 32m maxsize 8048m extent management local; //tempfile参数必须有 //创建数据表…

strust2自定义拦截器

1.创建一个拦截器类&#xff0c;继承MethodFilterInterceptor类&#xff0c;实现doIntercept方法 package com.yqg.bos.web.interceptor;import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor; import com.y…

Android Studio如何减小APK体积

最近在用AndroidStudio开发一个小计算器&#xff0c;代码加起来还不到200行。但是遇到一个问题&#xff0c;导出的APK文件大小竟然达到了1034K。这不科学&#xff0c;于是就自己动手精简APK。下面我们大家一起学习怎么缩小一个APK的大小&#xff0c;以hello world为例。 新建工…

js合并同类数组里面的对象_通过同类群组保留估算客户生命周期价值

js合并同类数组里面的对象This is Part I of the two-part series dedicated to estimating customer lifetime value. In this post, I will describe how to estimate LTV, on a conceptual level, in order to explain what we’re going to be doing in Part II with the P…

C#解析HTML

第一种方法&#xff1a;用正则表达式来分析 [csharp] view plaincopy 转自网上的一个实例&#xff1a;所有的href都抽取出来&#xff1a; using System; using System.Net; using System.Text; using System.Text.RegularExpressions; namespace HttpGet { c…

帮助开发人员学习

在浏览器中使用真实环境学习新技术 https://www.katacoda.com/ 转载于:https://www.cnblogs.com/zuxing/p/9829143.html

【转】SASS用法指南

SASS用法指南 阮一峰的&#xff0c;偏sass用法教程sass入门 偏实战的基础用法

com编程创建快捷方式中文_如何以编程方式为博客创建wordcloud?

com编程创建快捷方式中文Recently, I was in need of an image for our blog and wanted it to have some wow effect or at least a better fit than anything typical we’ve been using. Pondering over ideas for a while, word cloud flashed in my mind. &#x1f4a1;Us…

ETL技术入门之ETL初认识

ETL技术入门之ETL初认识 分类&#xff1a; etl2014-07-10 23:11 3021人阅读 评论(2) 收藏 举报数据仓库商业价值etlbi目录(?)[-] ETL是什么先说下背景知识下面给下ETL的详细解释定义现在来看下kettle的transformation文件一个最简单的E过程例子windows环境 上图左边的是打开表…

ActiveSupport::Concern 和 gem 'name_of_person'(300✨) 的内部运行机制分析

理解ActiveRecord::Concern&#xff1a; 参考:include和extend的区别&#xff1a; https://www.cnblogs.com/chentianwei/p/9408963.html 传统的模块看起来像&#xff1a; module Mdef self.included(base)# base(一个类)扩展了一个模块"ClassMethods"&#xff0c; b…

Python 3.8.0a2 发布,面向对象编程语言

百度智能云 云生态狂欢季 热门云产品1折起>>> Python 3.8.0a2 发布了&#xff0c;这是 3.8 系列计划中 4 个 alpha 版本的第 2 个。 alpha 版本旨在更加易于测试新功能和 bug 修复状态&#xff0c;以及发布流程。在 alpha 阶段会添加新功能&#xff0c;直到 beta 阶…

基于plotly数据可视化_如何使用Plotly进行数据可视化

基于plotly数据可视化The amount of data in the world is growing every second. From sending a text to clicking a link, you are creating data points for companies to use. Insights that can be drawn from this collection of data can be extremely valuable. Every…

关于Oracle实时数据库的优化思路

关于实时数据库的优化思路 背景 大概168个换热站机组&#xff0c;每套机组将近400个点&#xff0c;整体有6万多个点需要进行实时更新。数据库里其中有一个监控参数表(yxjk_jkcs)&#xff0c;每一个点位属性都在里面存放&#xff0c;其中有一个字段CS_VALUE 是存放被更新的实时…

【转】使用 lsof 查找打开的文件

在 UNIX 环境中&#xff0c;文件无处不在&#xff0c;这便产生了一句格言&#xff1a;“任何事物都是文件”。通过文件不仅仅可以访问常规数据&#xff0c;通常还可以访问网络连接和硬件。在有些情况下&#xff0c;当您使用 ls 请求目录清单时&#xff0c;将出现相应的条目。在…

ESLint简介

ESLint简介 ESLint是一个用来识别 ECMAScript 并且按照规则给出报告的代码检测工具&#xff0c;使用它可以避免低级错误和统一代码的风格。如果每次在代码提交之前都进行一次eslint代码检查&#xff0c;就不会因为某个字段未定义为undefined或null这样的错误而导致服务崩溃&…

数据科学与大数据是什么意思_什么是数据科学?

数据科学与大数据是什么意思Data Science is an interdisciplinary field that uses a combination of code, statistical analysis, and algorithms to gain insights from structured and unstructured data.数据科学是一个跨学科领域&#xff0c;它结合使用代码&#xff0c;…

C#制作、打包、签名、发布Activex全过程

一、前言 最近有这样一个需求&#xff0c;需要在网页上面启动客户端的软件&#xff0c;软件之间的通信、调用&#xff0c;单单依靠HTML是无法实现了&#xff0c;因此必须借用Activex来实现。由于本人主要擅长C#&#xff0c;自然本文给出了用C#实现的范例&#xff0c;本文的预期…

用Python创建漂亮的交互式可视化效果

Plotly is an interactive Python library that provides a wide range of visualisations accessible through a simple interface.Plotly是一个交互式Python库&#xff0c;通过简单的界面即可提供广泛的可视化效果。 There are many different visualisation libraries avai…