- 浏览: 84428 次
- 性别:
- 来自: 河南
-
文章分类
最新评论
-
halu126:
GeekDonie 写道引用所以得出结论:字符流使用了缓冲区, ...
java 字节流与字符流的区别 -
GeekDonie:
引用所以得出结论:字符流使用了缓冲区,而字节流没有使用缓冲区。 ...
java 字节流与字符流的区别
简单的说,内部(inner)类指那些类定义代码被置于其它类定义中的类;而对于一般的、类定义代码不嵌套在其它类定义中的类,称为顶层(top-level)类。对于一个内部类,包含其定义代码的类称为它的外部(outer)类。
<!--[if !supportLists]-->1 <!--[endif]-->Static member class(静态成员类)
类声明中包含“static”关键字的内部类。如以下示例代码,
Inner1/Inner2/Inner3/Inner4就是Outer的四个静态成员类。静态成员类的使用方式与一般顶层类的使用方式基本相同。
<!--[if !supportLists]-->1.1 <!--[endif]-->静态成员类特性
静态成员类可访问外部类的任一静态字段或静态方法
像静态方法或静态字段一样,静态成员类有public/private/default权限修饰符
<!--[if !supportLists]-->1.2 <!--[endif]-->静态成员类约束
静态成员类不能与外部类重名
像外部类的静态方法一样,不能直接访问外部类的实例字段和实例方法
静态成员类只能定义于外部类的顶层代码或外部类其它静态成员类的顶层代码中(嵌套定义);不能定义于外部类的某个函数中。
<!--[if !supportLists]-->1.3 <!--[endif]-->新增语法
如示例代码所示,可以以“OuterClass.InnerClass”的方式来引用某个内部类。
<!--[if !supportLists]-->1.4 <!--[endif]-->什么时候使用静态成员类
B为A的辅助类,且只为A所用时,可将B定义为A的静态成员类。例如JDK中的LinkedList类就有Entry静态成员类:
显然,Entry用来表示LinkedList中的一个结点,只被LinkedList自身使用。
<!--[if !supportLists]-->2 <!--[endif]-->Member class(成员类)
一个静态成员类,若去掉“static”关键字,就成为成员类。如下示例代码,Inner1/Inner2/Inner3/Inner4就是Outer的四个成员类
<!--[if !supportLists]-->2.1 <!--[endif]-->成员类特性
<!--[if !supportLists]-->· <!--[endif]-->类似于外部类的实例函数,成员类有public/private/default权限修饰符
<!--[if !supportLists]-->· <!--[endif]-->一个成员类实例必然所属一个外部类实例,成员类可访问外部类的任一个实例字段和实例函数。
<!--[if !supportLists]-->2.2 <!--[endif]-->成员类约束
成员类不能与外部类重名
不能在成员类中定义static字段、方法和类(static final形式的常量定义除外)。因为一个成员类实例必然与一个外部类实例关联,这个static定义完全可以移到其外部类中去
成员类不能是接口(interface)。因为成员类必须能被某个外部类实例实例化,而接口是不能实例化的。事实上,如示例代码所示,如果你以成员类的形式定义一个接口,该接口实际上是一个静态成员类,static关键字对inner interface是内含(implicit)的。
<!--[if !supportLists]-->2.3 <!--[endif]-->新增语法
一个成员类实例必然所属于其外部类的一个实例,那么如何在成员类内部获得其所属外部类实例呢?如示例代码所示,采用“OuterClass.this”的形式。
<!--[if !supportLists]-->2.4 <!--[endif]-->指定内部类实例所属的外部类实例
内部类实例可在其外部类的实例方法中创建,此新创建内部类实例所属的外
部类实例自然就是创建它的外部类实例方法对应的外部类实例。
另外,如示例代码所示,对于给定的一个外部类实例outerClass,可以直接创建其内部类实例,语法形式为:
<!--[if !supportLists]-->
2.5 <!--[endif]-->什么时候使用成员类
成员类的显著特性就是成员类能访问它的外部类实例的任意字段与方法。方便一个类对外提供一个公共接口的实现是成员类的典型应用。
以JDK Collection类库为例,每种Collection类必须提供一个与其对应的Iterator实现以便客户端能以统一的方式遍历任一Collection实例。每种Collection类的Iterator实现就被定义为该Collection类的成员类。例如JDK中AbstractList类的代码片断:
因为定义在AbstractList中的Itr可访问AbstractList中的任意字段和方法,所以很方便实现Iterator,无需AbstractList对外暴露更多的接口。
试想,如果没有成员类机制,只有在AbastractList源码之外定义一个实现Iterator的类Itr,该类有一个AbstractList实例成员list,为了Itr能获取list的内部信息以便实现遍历,AbstractList必然要向Itr开放额外的访问接口。
<!--[if !supportLists]-->3 <!--[endif]-->Local class(局部类)
对一个静态成员类,去掉其声明中的“static”关键字,将其定义移入其外部类
的静态方法或静态初始化代码段中就成为了局部静态成员类。
对一个成员类,将其定义移入其外部类的实例方法或实例初始化代码中就成为了局部成员类。
局部静态成员类与静态成员类的基本特性相同。例如,都只能访问外部类的静态字段或方法,但不能访问外部类的实例字段和实例方法等。
局部成员类与成员类的基本特性相同。例如,局部成员类实例必属于其外部类的一个实例,可通过OuterClass.this引用其外部类实例等。
另外,局部类也有其自己的特性,如以下代码所示:
<!--[if !supportLists]-->3.1 <!--[endif]-->局部类特性
如示例代码所示,局部类能且只能访问其所属代码段中的声明为final的局部
变量。为什么只能访问声明为final的局部变量呢?我们知道,局部变量在其所属的代码段(譬如某个函数)执行完毕后就会被回收,而一个局部类的实例却可以在其类定义所属代码段执行完毕后依然存在,如果它可操控非final的局部变量,用户就可以通过该实例修改已不存在的局部变量,无意义。
<!--[if !supportLists]-->3.2 <!--[endif]-->局部类约束
如示例代码所示,内部类只在定义它的代码段中可见,不能在它所属代码段之外的代码中使用;因此也就没有public/private/default权限修饰符(无意义)
不能以局部类形式定义一个接口。局部类只在其所属代码段中可见,定义这样的接口无意义
局部类类名不能与其外部类类名重复
<!--[if !supportLists]-->3.3 <!--[endif]-->什么时候使用局部类
局部类大部分以匿名类的形式使用。
<!--[if !supportLists]-->4 <!--[endif]-->Anonymous class(匿名类)
没有类名的局部类就是匿名类。用一条语句完成匿名类的定义与实例创建。例
如如下代码:
<!--[if !supportLists]-->4.1 <!--[endif]-->匿名类特性与约束
匿名类是一种特殊的局部类。局部类的特性与约束都适用与它。
<!--[if !supportLists]-->4.2 <!--[endif]-->新增语法
<!--[if !supportLists]-->4.2.1 <!--[endif]-->继承自某个基类的匿名类
new class-name ( [ argument-list ] ) { class-body }
创建匿名类实例时,“argument-list”将被传入其基类(即class-name)对应的构造函数。
<!--[if !supportLists]-->4.2.2 <!--[endif]-->实现某个接口的匿名类
new interface-name () { class-body }
<!--[if !supportLists]-->
4.3 <!--[endif]-->什么时候使用匿名类
该类定义代码段很短
只需要创建该类的一个实例
类的定义代码与类的使用代码紧邻
使用匿名不影响代码的易读性
譬如,如下实现类似与c的callback功能的代码就是匿名类的典型应用:
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fenglibing/archive/2007/08/21/1753549.aspx
<!--[if !supportLists]-->1 <!--[endif]-->Static member class(静态成员类)
类声明中包含“static”关键字的内部类。如以下示例代码,
Inner1/Inner2/Inner3/Inner4就是Outer的四个静态成员类。静态成员类的使用方式与一般顶层类的使用方式基本相同。
public class Outer{ //just like static method, static member class has public/private/default access privilege levels //access privilege level: public public static class Inner1 { public Inner1() { //Static member inner class can access static method of outer class staticMethod(); //Compile error: static member inner class can not access instance method of outer class //instanceMethod(); } } //access privilege level: default static class Inner2 { } //access privilege level: private private static class Inner3 { //define a nested inner class in another inner class public static class Inner4 { } } private static void staticMethod() { //cannot define an inner class in a method /*public static class Inner4() { }*/ } private void instanceMethod() { //private static member class can be accessed only in its outer class definition scope Inner3 inner3 = new Inner3(); //how to use nested inner class Inner3.Inner4 inner4 = new Inner3.Inner4(); } } class Test { Outer.Inner1 inner1 = new Outer.Inner1(); //Test and Outer are in the same package, so Inner2 can be accessed here Outer.Inner2 inner2 = new Outer.Inner2(); //Compile error: Inner3 cannot be accessed here //Outer.Inner3 inner3 = new Outer.Inner3(); }
<!--[if !supportLists]-->1.1 <!--[endif]-->静态成员类特性
静态成员类可访问外部类的任一静态字段或静态方法
像静态方法或静态字段一样,静态成员类有public/private/default权限修饰符
<!--[if !supportLists]-->1.2 <!--[endif]-->静态成员类约束
静态成员类不能与外部类重名
像外部类的静态方法一样,不能直接访问外部类的实例字段和实例方法
静态成员类只能定义于外部类的顶层代码或外部类其它静态成员类的顶层代码中(嵌套定义);不能定义于外部类的某个函数中。
<!--[if !supportLists]-->1.3 <!--[endif]-->新增语法
如示例代码所示,可以以“OuterClass.InnerClass”的方式来引用某个内部类。
<!--[if !supportLists]-->1.4 <!--[endif]-->什么时候使用静态成员类
B为A的辅助类,且只为A所用时,可将B定义为A的静态成员类。例如JDK中的LinkedList类就有Entry静态成员类:
public class LinkedList<E> extends AbstractSequentialList<E> …; private static class Entry<E> { E element; Entry<E> next; Entry<E> previous; Entry(E element, Entry<E> next, Entry<E> previous) { this.element = element; this.next = next; this.previous = previous; } } …; }
显然,Entry用来表示LinkedList中的一个结点,只被LinkedList自身使用。
<!--[if !supportLists]-->2 <!--[endif]-->Member class(成员类)
一个静态成员类,若去掉“static”关键字,就成为成员类。如下示例代码,Inner1/Inner2/Inner3/Inner4就是Outer的四个成员类
public class Outer { //just like instance method, member class has public/private/default access privilege levels private int data; //access privilege level: public public class Inner1 { private int data; private int data1; public Inner1() { //member class can access its outer class' instance field directly data1 = 1; //itself data field data = 1; //its outer class instance field Outer.this.data = 1; } } //access privilege level: default class Inner2 { //can not define static filed, method, class in member class //static int j = 1; //but, "static final" compound is allowed static final int CONSTANT = 1; } //access privilege level: private private class Inner3 { public class Inner4 { } } //in fact, Inner5 is not a member class but a static member class interface Inner5 { } private static void staticMethod() { //can not create a member class instance directly in outer class' static method //Inner1 inner1 = new Inner1(); } private void instanceMethod() { //can create a member class instance in outer class' instance method Inner1 inner1 = new Inner1(); } } class Test { public Test() { //cannot create member class instance directly in class other than outer class //Outer.Inner2 inner2 = new Outer.Inner2(); //create a member class instance outside it's outer class Outer outer = new Outer(); Outer.Inner1 inner1 = outer.new Inner1(); } }
<!--[if !supportLists]-->2.1 <!--[endif]-->成员类特性
<!--[if !supportLists]-->· <!--[endif]-->类似于外部类的实例函数,成员类有public/private/default权限修饰符
<!--[if !supportLists]-->· <!--[endif]-->一个成员类实例必然所属一个外部类实例,成员类可访问外部类的任一个实例字段和实例函数。
<!--[if !supportLists]-->2.2 <!--[endif]-->成员类约束
成员类不能与外部类重名
不能在成员类中定义static字段、方法和类(static final形式的常量定义除外)。因为一个成员类实例必然与一个外部类实例关联,这个static定义完全可以移到其外部类中去
成员类不能是接口(interface)。因为成员类必须能被某个外部类实例实例化,而接口是不能实例化的。事实上,如示例代码所示,如果你以成员类的形式定义一个接口,该接口实际上是一个静态成员类,static关键字对inner interface是内含(implicit)的。
<!--[if !supportLists]-->2.3 <!--[endif]-->新增语法
一个成员类实例必然所属于其外部类的一个实例,那么如何在成员类内部获得其所属外部类实例呢?如示例代码所示,采用“OuterClass.this”的形式。
<!--[if !supportLists]-->2.4 <!--[endif]-->指定内部类实例所属的外部类实例
内部类实例可在其外部类的实例方法中创建,此新创建内部类实例所属的外
部类实例自然就是创建它的外部类实例方法对应的外部类实例。
另外,如示例代码所示,对于给定的一个外部类实例outerClass,可以直接创建其内部类实例,语法形式为:
OuterClass.InnerClass innerClass = outerClass.new InnerClass();
<!--[if !supportLists]-->
2.5 <!--[endif]-->什么时候使用成员类
成员类的显著特性就是成员类能访问它的外部类实例的任意字段与方法。方便一个类对外提供一个公共接口的实现是成员类的典型应用。
以JDK Collection类库为例,每种Collection类必须提供一个与其对应的Iterator实现以便客户端能以统一的方式遍历任一Collection实例。每种Collection类的Iterator实现就被定义为该Collection类的成员类。例如JDK中AbstractList类的代码片断:
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> { private class Itr implements Iterator<E> { ………; } public Iterator<E> iterator() { return new Itr(); } }
因为定义在AbstractList中的Itr可访问AbstractList中的任意字段和方法,所以很方便实现Iterator,无需AbstractList对外暴露更多的接口。
试想,如果没有成员类机制,只有在AbastractList源码之外定义一个实现Iterator的类Itr,该类有一个AbstractList实例成员list,为了Itr能获取list的内部信息以便实现遍历,AbstractList必然要向Itr开放额外的访问接口。
<!--[if !supportLists]-->3 <!--[endif]-->Local class(局部类)
对一个静态成员类,去掉其声明中的“static”关键字,将其定义移入其外部类
的静态方法或静态初始化代码段中就成为了局部静态成员类。
对一个成员类,将其定义移入其外部类的实例方法或实例初始化代码中就成为了局部成员类。
局部静态成员类与静态成员类的基本特性相同。例如,都只能访问外部类的静态字段或方法,但不能访问外部类的实例字段和实例方法等。
局部成员类与成员类的基本特性相同。例如,局部成员类实例必属于其外部类的一个实例,可通过OuterClass.this引用其外部类实例等。
另外,局部类也有其自己的特性,如以下代码所示:
<!--[if !supportLists]-->3.1 <!--[endif]-->局部类特性
如示例代码所示,局部类能且只能访问其所属代码段中的声明为final的局部
变量。为什么只能访问声明为final的局部变量呢?我们知道,局部变量在其所属的代码段(譬如某个函数)执行完毕后就会被回收,而一个局部类的实例却可以在其类定义所属代码段执行完毕后依然存在,如果它可操控非final的局部变量,用户就可以通过该实例修改已不存在的局部变量,无意义。
<!--[if !supportLists]-->3.2 <!--[endif]-->局部类约束
如示例代码所示,内部类只在定义它的代码段中可见,不能在它所属代码段之外的代码中使用;因此也就没有public/private/default权限修饰符(无意义)
不能以局部类形式定义一个接口。局部类只在其所属代码段中可见,定义这样的接口无意义
局部类类名不能与其外部类类名重复
<!--[if !supportLists]-->3.3 <!--[endif]-->什么时候使用局部类
局部类大部分以匿名类的形式使用。
<!--[if !supportLists]-->4 <!--[endif]-->Anonymous class(匿名类)
没有类名的局部类就是匿名类。用一条语句完成匿名类的定义与实例创建。例
如如下代码:
public class Outer { public void instanceMethod() { //define a nonymous class which implements Action interface and creat an instance of it Action action = new Action() { public void doAction() { System.out.println("a simple anonymous class demo"); }}; action.doAction(); //define a nonoymous class which extends BaseClass and create an instance of it new BaseClass(5) { public void printData(){ System.out.println("data = " + getData()); } }.printData(); //"data = 5" will be outputed } } interface Action { void doAction(); } class BaseClass { private int data; public BaseClass (int data) { this.data = data; } public int getData() { return data; } }
<!--[if !supportLists]-->4.1 <!--[endif]-->匿名类特性与约束
匿名类是一种特殊的局部类。局部类的特性与约束都适用与它。
<!--[if !supportLists]-->4.2 <!--[endif]-->新增语法
<!--[if !supportLists]-->4.2.1 <!--[endif]-->继承自某个基类的匿名类
new class-name ( [ argument-list ] ) { class-body }
创建匿名类实例时,“argument-list”将被传入其基类(即class-name)对应的构造函数。
<!--[if !supportLists]-->4.2.2 <!--[endif]-->实现某个接口的匿名类
new interface-name () { class-body }
<!--[if !supportLists]-->
4.3 <!--[endif]-->什么时候使用匿名类
该类定义代码段很短
只需要创建该类的一个实例
类的定义代码与类的使用代码紧邻
使用匿名不影响代码的易读性
譬如,如下实现类似与c的callback功能的代码就是匿名类的典型应用:
File f = new File("/src"); // The directory to list // Now call the list() method with a single FilenameFilter argument // Define and instantiate an anonymous implementation of FilenameFilter // as part of the method invocation expression. String[] filelist = f.list(new FilenameFilter() { public boolean accept(File f, String s) { return s.endsWith(".java"); } }); // Don't forget the parenthesis and semicolon that end the method call! public class Outer { private int instanceField; private static int staticField; //define a local member class in instance code block { int localVirable1 = 0; final int localVirable2 = 1; class Inner1 { public Inner1() { //can access its outer class' field and method directly instanceField = 1; //use OuterClass.this to get its corresponding outer class instance Outer.this.instanceField = 1; //can not access the not final local virable in its containing code block //System.out.print(localVirable1); //can access the final local virable in its containing code block System.out.print(localVirable2); } } //local class can not have privilege modifier /*public class inner2 { }*/ } // define a local static member class in static code block static { class Inner2 { public Inner2() { staticField = 1; //can not access instance field and method in a local static member class //intanceField = 2; } } } public void intanceMethod() { //define a local class in its out class' instance method class Inner3 { } //local class is visible only in its containning code block //Outer.Inner2 inner2; } private static void staticMethod() { //define a local static member class in its out class' static method class Inner4 { public Inner4() { staticField = 2; } } //can not define a interface as a local class /*interface I { }*/ } }
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fenglibing/archive/2007/08/21/1753549.aspx
发表评论
-
java 开发环境搭建
2011-11-25 16:59 893文章来源http://topic.csdn.n ... -
读写cookies
2011-09-15 14:09 1077Cookie应该是一种应用较久的技术了。早在HTML刚刚 ... -
简单理解抽象工厂模式
2011-05-09 14:35 876定义: 抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般 ... -
接口和抽象类有什么区别
2011-05-09 14:29 878接口和抽象类有什么区别 你选择使用接口和抽象类的依据是什么 ... -
有两个关于内部类(Inner Class)的示例
2011-05-09 13:33 950第一个,演示一个简单的外部类使用内部类示例: public ... -
关于JAVA匿名内部类,回调,事件模式的一点讨论
2011-05-09 13:26 1267关于JAVA匿名内部类的一点讨论. 基本理论: ------- ... -
Java内部类实例测试及总结
2011-05-09 13:23 762这里没有讲解理论是怎么样的,我用实例说明,个人觉得比理论更来得 ... -
使用Synchronized关键字同步类方法
2011-05-07 14:36 941要想解决“脏数据”的 ... -
计算出距当前时间315天后的日期时间 并在程序运行10秒后启动计算器程序
2011-03-13 17:52 1172import java.util.*; import j ... -
打印出java虚拟机的所有属性 并在程序中启动记事本的程序 打开一个源文件 并在5秒后关闭
2011-03-13 12:41 1406import java.io.IOException; ... -
使用Properties 把程序的启动运行次数纪录在某个文件中,每次运行时打印出他的运行次数
2011-03-13 11:13 841import java.util.*; import j ...
相关推荐
55links友情链接网址跟踪器,放在桌面,每次直接打开就可以访问55links友情链接交易平台,方便快捷。
AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
moore_01_0909
FIBR English learning
AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
OIF_IEEE802.3_liaison_19OCt09
做网络安全FTP内容的实验必备
nagarajan_01_1107
AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
mellitz_3cd_01_0318
PyQt6实战派 配套代码
陕西省省级非物质文化遗产经纬度数据统计表 统计内容包含以下字段: 1. 项目名称 2. 遗产类别 3. 入选批次 4. 所属地区 5. 申报地区/单位 6. 地理经度 7. 地理纬度 该统计表系统记录了陕西省省级非物质文化遗产的地理空间信息,为文化遗产的数字化保护与研究工作提供了重要的数据支撑。
ran_3ck_02a_0918
毕业设计_基于springboot+vue开发的汽车租赁管理系统【源码+sql+可运行】【50308】.zip 全部代码均可运行,亲测可用,尽我所能,为你服务; 1.代码压缩包内容 代码:springboo后端代码+vue前端页面代码; 脚本:数据库SQL脚本 效果图:运行结果请看资源详情效果图 2.环境准备: - JDK1.8+ - maven3.6+ - nodejs14+ - mysql5.6+ - redis 3.技术栈 - 后台:springboot+mybatisPlus+Shiro - 前台:vue+iview+Vuex+Axios - 开发工具: idea、navicate 4.功能列表 - 系统设置:用户管理、角色管理、资源管理、系统日志 - 业务管理:汽车管理、客户管理、租赁订单 3.运行步骤: 步骤一:修改数据库连接信息(ip、port修改) 步骤二:找到启动类xxxApplication启动 4.若不会,可私信博主!!!
# Runcorder - 跑步训练管理系统 Runcorder 是一款专为跑步爱好者、马拉松运动员及高校体育生设计的本地化跑步训练管理工具,基于 Python 开发,结合 Tkinter 图形界面与强大的数据处理能力,为用户提供从训练记录到数据分析的全方位支持。无论是初学者还是专业跑者,Runcorder 都能帮助你科学规划训练、精准追踪进度,并通过可视化图表直观呈现训练成果,让你的跑步训练更智能、更高效! - **多用户管理**:支持创建、加载和删除用户档案,每个用户的数据独立存储,确保隐私与安全。 - **科学训练记录**:全维度记录跑步数据,包括日期、里程、配速、自评和晨跑标记,支持智能输入校验,避免数据错误。 - **多维数据分析**:通过动态可视化图表展示跑步里程趋势、平均配速曲线,支持自定义 Y 轴范围,帮助用户深入理解训练效果。 - **高阶功能**:提供 4 种科学训练模式(有氧/无氧/混合),支持历史记录修改与删除,数据以 JSON 格式持久化存储,跨平台兼容。
paatzsch_01_0708
AnythingLLM是一个全栈应用程序,您可以使用流行的开源大语言模型,再结合向量数据库解决方案构建个人本地AI大模型知识库
mellitz_3ck_02_0519
petrilla_01_0708
ran_3ck_01_0918