类和对象
对象的基本概念对象是存在的具体实体,具有明确定义的状态和行为。类的基本概念具有相同属性和方法的一组对象的集合。类是对象的模板/纸,可以规定对象的特征。
类和对象的关系
类是抽象的概念,仅仅是模板对象是一个你能够看得到、摸得着的具体实体
定义类
[类定义修饰符] class <类名>
{//类体
[成员变量声明]
[构造函数]
[成员方法]
}
例如
public class A{
//属性
public String a;
private int b;
public double c;
private char d;
//构造函数
A(){}
A(String a,int b,double c,char d){
this.a = a;
this.b = b;
this.c = c;
this.d = d;
}
//方法
public void get(){}
public void set(int a){}
}
可以重载构造函数。对象数组的创建和使用跟正常数组一样。
使用类描述类
用这个方法更直观、容易理解。参考工具:staruml
封装
使用封装解决设计上的缺陷:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读取和修改的访问级别。this表示指向当前对象
JAVA包
打包:package导包:import注意:包将类名空间划分为更加容易管理的块包既是命名机制也是可见度控制机制
包的作用
包允许将类组合成较小的单元,使其易于找到和使用相应的类文件有助于避免命名冲突。在使用许多类时,类和方法的名称很难决定。有时需要使用与其他类相同的名称。包基本上隐藏了类并避免了名称上的冲突包允许在更广的范围内保护类、数据和方法,可以在包内定义类,而在包外的代码不能访问该类
深入方法和类
成员变量和局部变量
public class Hero{
//成员变量
数据类型1 变量1;
数据类型2 变量2;
数据类型3 变量3;
public 返回值类型 方法1(){
数据类型4 变量4; //局部变量
}
public 返回值类型 方法2(){
数据类型5 变量5; //局部变量
}
}
成员变量的作用域在整个类都是可见的方法方法2都可以使用变量3局部变量的作用域仅限于定义它的方法变量5只能分别在方法2中使用成员变量有默认的初始值数字为0、对象为null局部变量默认没有初始值,需要赋初值再使用成员变量和局部变量重名时,局部变量优先级更高
对象的参数传递
引用传递
Book book;
book = new Book(参数);
在main方法的栈区,book存放的是JVM的堆内存中的地址。对象是引用类型。对象实际内存和引用可以理解成遥控器和电视机的关系。当使用引用传递来传递对象类型的话,是把对象的地址传递过去了。
包装类
将基本数据类型值作为对象处理
基本类型的值不是对象,可以使用JavaAPI中的包装类包装成对象javlang包
将Java基本类型打包成对象
装箱拆箱
public static void main(String[] args){
int num1 = 10;
//打包基本类型(装箱)
Integer iNum1 = new Integer(num1);
Integer iNum1_1 = Integer.valueOf(num1);
Integer iNum2 = num1; //自动装箱
int num2 = iNum2.intValue(); //拆箱
int num3 = iNum2; //自动拆箱
iNum1.compareTo(iNum2); //比较
}
如果直接比较iNum1和iNum2即iNum1==iNum2的话会出问题,因为这样比较的是这两个对象的哈希码。注意:包装类没有无参构造,所有包装类的实例都是不可变的。一旦创建对象后,它们的内部值就不能再改变每个基本类型包装类都有常量MAX_VALUE和MIN_VALUE
一些常用的方法
输入对话框和类型转化:
String name = JOptionPane.showInputDialog('请输入姓名:');
String age = JOptionPane.showInputDialog('请输入年龄:');
String score = JOptionPane.showInputDialog('请输入分数:');
//输入的数据类型为String
//可以使用Integer.parseInt()转换成int类型
int Age = Integer.parseInt(age);
//可以使用Double.parseDouble()转换为double类型
double Score = Double.parseDouble(score);
Character的一些工具方法Character.isDigit(c;判断字符是否为纯数字。Character.isLetter(c;判断字符是否为字母。Character.isLetterOrDigit(c;判断是否为数字和字母Character.isJavaIdentifierPart(c;判断除首字符外其他是否为合法字符Character.isJavaIdentifierStart(c;判断第一个字符是否为合法字符Character.isUpperCase(c;判断是否为大写字母等等等等
String类
String对象是不可变的,字符串一旦创建,内容不能再变。Java中为了效率考虑以“”包括的字符串,只要内容相同,顺序、大小写相同,无论在程序代码中出现几次,JVM都只会建立一个实例放在字符串池中维护。
在Java中String是引用类型,String是Java库中预定义的类:javlanString。正是因为他是引用类型,他的值其实是指向的一个地址
字符串常用方法
v1+=v2时候相当于用concat(),等价于v1=vconcat(v;
字符串的比较
获取子串的方法
字符串的拆分
split()方法:将一个字符串分割为子字符串,结果作为字符串数组返回。
split表达式,本质是是一个正则表达式。*^|等符号在正则表达式中属于一种有特殊含义的字符,如果使用此种字符作为分隔符,必须使用转义符即加以转义。split方法的反向操作是Strinjoin()方法
增强版的字符串
与String类不同的是,StringBuffer和StringBuilder类的对象能够被多次的修改,并且不产生新的未使用对象StringBuilder类在Java5中被提出,它和StringBuffer之间的最大不同在于StringBuilder的方法不是线程安全的
修改StringBuffer中的字符串
继承和多态
继承
继承就是子类继承父类的特征和行为。使用extends关键字实现类与类之间的继承。
优点
父类定义公共内容,方便统一修改整体减少了代码量添加新类方便
父类构造和子类构造
使用super关键字调用父类构造方法默认会先调用父类构造,再调用子类构造构造方法不可继承Java中只能继承一个父类父类私有属性在子类中不能直接访问继承关系-“是一种”is-a关系:父类和子类之间必须存在is-a关系
方法重写
重写:在子类中提供一个对方法的新的实现,和想要重写的父类中的方法的方法名、返回值类型等都相同使用注解:@Override,避免重写错误
注意:
方法重写发生在通过继承而相关的不同类中方法重写具有同样的方法签名和返回值类型@override称为重写标注,用来保证重写的方法与原方法的签名和返回值一致
//小知识点
//判断A是否是B类的实例
A instanceof B
多态
多态:同一个实体,同时具有多种形式。多实现于重写。
抽象方法、抽象类
抽象类:不能被实例化、不能直接创建
包含一个抽象方法的类必须是抽象类抽象类和抽象方法都是用abstract关键字声明抽象方法只需要声明而不需要实现抽象类必须被子类继承-子类不是抽象类时必须重写父类中的所有抽象方法-子类是抽象类时仍然可以继续声明成抽象方法抽象类不可使用new实例化
抽象方法:抽象方法必须放在抽象类中;子类必须实现抽象方法。子类实现抽象方法,完成实际操作;子类方法继续是抽象方法,“孙子”类去实现。抽象方法不能是静态的。
例子:
public abstract class Hero{
....
public abstract void fight();
....
}
public class Warrior extends Hero{
@Override
public void fight() {} //强制子类实现
}
public abstract class LongRange extends Hero{
//子类中也设置为抽象方法
public abstract void fight();
}
子类调用父类信息
使用super关键字可以调用父类的公有属性和方法可以调用父类protected属性和方法
final关键字
修饰成员变量:常量,不可更改修饰方法:不可被重写修饰类:不可被继承f
作用:放置扩展重写
单例模式
将构造函数定义为私有的,以便实现外部无法使用new进行实例化的效果。只能获得唯一的实例。通俗来说,访问的对象都是这一个,即唯一对象。这里也用到了static。
抽象类和接口
抽象类实例1
日期格式化类
用法
//日期格式化类
SimpleDateFormate formate = new SimpleDateFormate('yyyy-MM-dd HH:mm:ss:SSS');
//y是年,M是月,d是天,H、m、s、S是小时、分钟、秒、毫秒
String strDate = formate.format(date);
Sys.out.println(strDate);
//将字符串转化成Date类
Date newDate = formate.parse('2020-8-10 01:01:01:001');
Sys.out.println(newDate.toLocaleString());
//toGMTSting()是转化成格林尼治时间
接口
Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为。
接口是一种与类相似的结构,只包含常量和抽象方法目的是指明相关或不相关类的多个对象的共同行为
///定义接口(可攻击的)
public interface Assailable{
//常量及抽象方法声明。
}
为什么用接口:
接口被用来描述一种抽象。因为Java不像C++一样支持多继承,所以Java可以通过实现接口来弥补这个局限。接口也被用来实现解耦。接口被用来实现抽象,而抽象类也被用来实现抽象,为什么一定要用接口呢?接口和抽象类之间又有什么区别呢?原因是抽象类内部可能包含非final的变量,但是在接口中存在的变量一定是final,public,static的。
注意:
在Java中,接口被看做是一种特殊的类,与抽象类相似,不能使用new操作符直接创建接口的实例接口必须由其他类实现,实现类不能实现的方法可以继续标识为abstract接口中所有的数据域都是publicstaticfinal,所有方法都是publicabstract,默认情况可以省略这些关键字
接口与抽象类的比较:
文章为作者独立观点,不代表 股票程序化软件自动交易接口观点
Johnny2023-02-02
是表达还是理解的问题?说的是对造假,如果上市造假,业绩造假,信披造假怎么办?现在就是罚款退市,股民要自己去打官司赔偿。难道要股民对每个股去调查吗?考虑了股票成本吗?