面向对象
1、对象:
自我介绍:
特点/特征/属性:姓名 性别 年龄 职业 籍贯 联系方式 年薪
功能/能力:爱好 特长 开车
此模板能适合任何人
corejava29
package edu.itstudy.j06Object;
public class People {
// 属性: 姓名 年龄 性别 身高
String name; // JDK
int age;
String sex;
int height;
// 构造方法
public People(String a){
name = a;
System.out.println("-==-=-=-People(String a)-=-=-=-=-=");
}
public People(String name,int age,String sex,int height){
this(name);
System.out.println("-==-=-=-People(String,int,String,int)-=-=-=-=-=");
this.name = name;
this.age = age;
this.sex = sex;
this.height = height;
}
public People(String name_,String sex_,int height_){
System.out.println("-==-=-=-People(String,String,int)-=-=-=-=-=");
name = name_;
sex = sex_;
height = height_;
}
public People(){
System.out.println("-==-=-=-People()-=-=-=-=-=");
}
// 功能:吃饭 睡觉 学习 赚钱
public void eat(){
String name = "";
System.out.println(name+"---能吃----");
}
// 饿了才吃
public void eat(boolean hunger){
if(hunger){
System.out.println("---吃饭----boolean");
}else{
System.out.println("---不吃饭---");
}
}
// 饿了才吃
public void eat(String hunger){
if("饿了".equals(hunger)){
System.out.println("---吃饭----String");
}else{
System.out.println("---不吃饭---");
}
}
// 饿了然后要点菜
public void eat(boolean hunger,String type){
if(hunger){
System.out.println("---吃饭----吃"+type);
}else{
System.out.println("---不吃饭---");
}
}
// 饿了然后要点菜
public void eat(String type,boolean hunger){
if(hunger){
System.out.println("---吃饭----吃"+type);
}else{
System.out.println("---不吃饭---");
}
}
public void sleep(){
System.out.println("----睡7个小时----");
}
public void study(){
System.out.println("----会学习----");
}
public int money(){
System.out.println("----会赚钱----");
return 1000;
}
}
package edu.itstudy.j06Object;
public class PeopleTest {
public static void main(String[] args){
// 创建一个People类的对象,对象名是zhangsan
People zhangsan = new People();
// 给对象zhangsan的属性赋值
zhangsan.name = "张三";
zhangsan.age = 22;
zhangsan.height = 187;
zhangsan.sex = "男";
// zhangsan.People(); // 不能够手动调用
zhangsan.study();
zhangsan.eat(true);
System.out.println("姓名:"+zhangsan.name+" 年龄:"+zhangsan.age+" 身高:"+zhangsan.height+" 性别:"+zhangsan.sex);
System.out.println("-=-=-=-=-=-=-=-=");
People lisi = new People();
lisi.name = "李四";
lisi.age = 23;
lisi.height = 168;
lisi.sex = "女";
lisi.study();
lisi.eat();
lisi.eat(true, "海鲜");
System.out.println("姓名:"+lisi.name+" 年龄:"+lisi.age+" 身高:"+lisi.height+" 性别:"+lisi.sex);
System.out.println("-=-=-=-=-++++++++++++++++=-=-=-=");
People wangw = new People();
System.out.println("姓名:"+wangw.name+" 年龄:"+wangw.age+" 身高:"+wangw.height+" 性别:"+wangw.sex);
System.out.println("-=-=-=-=-=-=-=-=");
People zhaol = new People("赵六",23,"男",175);
System.out.println("姓名:"+zhaol.name+" 年龄:"+zhaol.age+" 身高:"+zhaol.height+" 性别:"+zhaol.sex);
System.out.println("-=-=-=-=-=-=-=-=");
People xiaohua = new People("小花","女",165);
System.out.println("姓名:"+xiaohua.name+" 年龄:"+xiaohua.age+" 身高:"+xiaohua.height+" 性别:"+xiaohua.sex);
}
}
对空调进行描述:
属性:类型 厂家 颜色 价格 功率 性能 大小 品牌 型号
功能:制冷or制热 制冷速度
任何事物都可以从属性和功能两方面去进行描述或定义
任何存在的或者是不存在的事物都可以从属性和功能两方面去定义
描述某一类别的事物的属性和功能的模板
可以用这个模板来具体的描述此类别中的特定的一个事物
如何用java语言去描述事物?
去定义一个描述所有人的模板
用类去描述某个类别的模板:
属性(变量)
函数
分析人:
属性:姓名 年龄 性别 身高
功能:吃饭 睡觉 学习 赚钱
张三 20 男 178
李四 19 女 168
class:
类是任何事物共同拥有的属性和功能的抽象(类形成的过程叫抽象)
类是创建对象的模板
2、通过类如何去定义当前类中具体的某一个对象???
如何去描述张三? People zhangsan; int i = 10;定义个具体的类的对象
People zhangsan;
People lisi = new People();
3、全局变量[属性---实例变量]
写在类中的变量3.1 全局变量全类公有
3.2 全局变量有默认值 都是"0"。和数组一样
3.2 全局变量可以和局部变量发生命名冲突,局部变量优先使用[就近原则]
4、重载方法/方法重载
4.1 在同类中的同名函数如果参数个数 或 类型 或 顺序不同则为重载方法但:
只是返回值类型不同 不是 重载方法
只是形式参数的名字不一样也 不是 重载方法
重载方法的调用:根据形式参数的类别及顺序调用
public void eat(){
String name = "";
System.out.println(name+"---能吃----");
}
// 饿了才吃
public void eat(boolean hunger){
if(hunger){
System.out.println("---吃饭----boolean");
}else{
System.out.println("---不吃饭---");
}
}
// 饿了才吃
public void eat(String hunger){
if("饿了".equals(hunger)){
System.out.println("---吃饭----String");
}else{
System.out.println("---不吃饭---");
}
}
5、构造方法
5.1 在一个类中,方法名和类名一致,无返回值类型5.2 在一个类中,会隐含存在一个无参的构造方法---隐式构造方法
当手动显示定义构造方法时,隐式构造方法失效
5.3 构造方法的调用:
在创建对象(new)的时候 "自动" 调用构造方法,只会被调用一次
构造方法不能通过对象手动调用
构造方法的重载
构造方法的作用:可以在创建对象的时候进行属性的初始化
public class People {
// 属性: 姓名 年龄 性别 身高
String name; // JDK
int age;
String sex;
int height;
// 构造方法
public People(String a){
name = a;
System.out.println("-==-=-=-People(String a)-=-=-=-=-=");
}
public People(String name,int age,String sex,int height){
this(name);
System.out.println("-==-=-=-People(String,int,String,int)-=-=-=-=-=");
this.name = name;
this.age = age;
this.sex = sex;
this.height = height;
}
public People(String name_,String sex_,int height_){
System.out.println("-==-=-=-People(String,String,int)-=-=-=-=-=");
name = name_;
sex = sex_;
height = height_;
}
public People(){
System.out.println("-==-=-=-People()-=-=-=-=-=");
}
6、值传递和引用传递
值:基本数据类型的 字面值/变量值 int i = 10;引用:是一个首地址 对象的创建 数组 类的对象 String s;
传递:copy
java只支持值传递,不支持引用传递
7、this
类中的普通的属性和方法是属于具体的某一个对象的类只是构建对象的一个模板
this代表当前对象
对象拥有特定的运算符 "." this.
this调用构造方法
this(name);
this只能放在构造方法的首行
8、String
String是一个对象类型,不是基本数据类型==:
比较对象:比较内存地址
比较基本数据类型:比较值
equals():比较的是对象的值是否相等
串池
问题:String s = new String("abc");创建了几个对象?
***String的方法
StringBuffer
一 五 六
面向对象的特点
1、抽象2、封装(private)
语法:
通过某个手段[private]来使特定的属性或方法对外[另外一个类]不可见
方法一般不会进行封装,一般封装的是属性
通过private封装的属性不能在非本类中进行调用
书写类的约定:
1、类中的属性无特殊情况时都是private
2、对于封装的属性都要生成对应的get/set方法
3、所有的属性的前两个字母不能大写
4、get/set方法的命名:get+属性名称(首字母大写)
开发:
函数
3、继承(extends)
父类 子类----同类型才能继承
3.1 子类能够继承父类中除了私有属性和方法以及构造方法之外的内容
3.2 子类能够扩展独有一些属性和方法
3.3 只能实现单一继承,不能实现多重继承,支持多层次继承
创建对象的过程:new C()
ClassLoader
1、会把继承关系中的对象的空间从父类开始依次初始化,并且初始化对象的属性
2、依次“自动”调用顶级父类的构造方法
3、最后调用的本类的构造方法
super:
代表父类的对象,调用父类构造方式时只能放在构造方法的首行
调用父类的属性和方法
访问修饰符:
private default protected public
4、多态
方法的重写(覆盖 overwriting)
在继承关系中,方法的声明一致[返回值类型、方法的名称、参数列表]但方法的实现不同
访问修饰符:子类的访问修饰符要大于或等于父类
多态:对重写方法而言,属性无多态说法
1、语法
创建子类的对象赋值给父类的引用
2、多态方法调用时,父类调用的是子类的重写方法
3、分类
编译时的多态
普通类的对象的创建
运行时的多态
多态中的对象的创建
4、instanceof
1 3 6
面向对象的关键字
static:修饰属性:
1、只能够修饰全局变量,不能修饰局部变量
2、用static修饰的属性叫静态属性(类变量)
3、static属性是属于类的并不是属于单个对象的,是全类共有的属性
所有对象共同拥有此属性
4、static在classloader(类加载)的时候就已经初始化了
可以直接通过类名进行访问 User.name
修饰方法:
1、用static修饰的方法叫静态方法(类方法)
2、是属于类的,是在类加载的时候进行初始化。所有对象共同拥有此方法
可以直接通过类名进行访问
3、静态方法中不能调用非静态方法和非静态属性
静态方法中只能调用静态的方法和属性
4、静态方法只能重写静态方法,但没有多态的概念
5、static方法中不能使用this、super关键字
5.1 语法
5.2 内存结构
修饰代码块:
1、static在classloader(类加载)的时候就已经初始化了
2、理解多层次继承关系中的输出顺序
***static修饰的对象只在类加载的时候加载一次***
final:
修饰变量:
1、该变量[全局、局部]为最终变量(常量),值不能发生改变
2、修饰属性时一定要初始化(直接赋值、构造方法赋值)
3、修饰对象时指的是对象的引用地址不能改变
4、final和static一起使用的好处
5、final变量名称一般全大写
修饰方法:
1、修饰方法时是最终方法,不能被重写,可以被重载
修饰类:
1、修饰类时是最终类,不能被继承,但是可以继承其他类
abstract:
修饰类:
1、修饰类时此类不能被实例化(不能创建对象),叫做抽象类
2、一般通过多态的思想进行实现
修饰方法:
1、抽象方法
2、抽象方法只有方法的声明,没有实现
3、抽象方法只能定义在抽象类中
含有抽象方法的类一定是抽象类
抽象类不一定含有抽象方法
4、一个类继承一个抽象类
要么去实现抽象类中的所有抽象方法
要么把自己定义为抽象类
作用:
Interface
接口:实质是一个抽象类,对抽象类具有更加严格的定义
接口中所有的方法默认是公开的抽象方法,abstract关键字可以省略
接口中的所有的变量都是公开的静态的常量
接口的实现类 implements
一个类去实现接口要实现接口中的所有的抽象方法
接口、类之间的关系:
1、接口在不发生功能定义冲突时可以继承多个接口
2、接口不能实现接口
3、一个类可以去实现多个接口
4、一个类可以同时[继承一个类和实现多个接口](先继承后实现)
接口解决了java中的单一继承问题,实现了java的"多重继承"
Object类、包装类、内部类
1、Object类是所有类的直接或者间接的父类
方法:
getClass():返回对象运行时的实际对象类型 instanceof
toString():在对象中默认是输出当前对象在内存中的内存地址(16进制表示)
可以通过对象调用执行(直接打印对象的时候自动调用)
直接输出对象时会自动调用toString()方法
一般子类重写此方法
equals():
基本数据类型:
==:比较的是值是否相等,相等返回true
对象类型/引用类型:
复合类型:自定义的一些对象类型
1、==
比较的是两个对象的内存地址,两个对象的哈希码相等返回true
2、equals
2.1:对String对象,比较的是String对象的值
2.2:对复合引用对象,Object类中的equals方法默认是==号(this == obj)
比较的对象需要去重写equals方法实现自定义的业务比较逻辑
2、包装类
作用:把八种基本数据类型转换成对象类型,实现java的完全面向对象
类型:基本数据类型 对象类型(包装类) String
valueOf() parse***() 构造方法
***int和String之间的转换使用比较频繁
3、内部类
3.1 成员内部类
3.2 静态内部类
3.3 局部内部类
3.4 匿名内部类 ***
集合
1、集合的概念下周课表:周六日全天
周六:上午9点
周日:下午两点
2、集合类型:
List(***有序、重复) Set(无序、不可重复) Map(key-value:key不可重复)
List:
初始化的方式
***API方法
***遍历的三种方式
泛型(JDK1.5)
***底层是使用对象数组实现,初始大小为10
快捷键:代码补充键
JavaBean:
排序:
1、Collections.sort(list); 自然顺序
只能对基本数据类型排序以及String
2、对复合类型排序
根据实际业务需求进行排序
2.1 javabean implements Comparable<Animal>
实现compareTo
2.2 自定义排序类 implements Comparator<Animal>
实现 compare(Animal o1, Animal o2)
***ArrayList和 LinkedLIst Vector的区别
Set:
不可重复(丢弃)
HashSet
set的add方法和list的add方法返回值的区别
api:和list使用方法一致
遍历:for...each Iterator
set判断是否是重复项的原理:
hashCode():通过哈希算法计算当前对象的哈希码(内存地址)并返回
equals():判断当前增加的对象的内容是否和集合中的内容相等
add时:
先调用hashCode,再判断是否调用equals方法
两个自定义对象的引用一致时其内容一定相同
SortedSet
TreeSet
Map:
key-value 键值对 key不可以重复(会覆盖)
api
map的遍历
异常
程序出错的情况:内存溢出 数组越界 类型转换 作用域 空指针 断电了 硬件坏了开发工程师不能通过程序屏蔽出错的情况:错误 error
开发工程师能够通过代码进行控制出错的情况: 异常 Exception
提高代码的复用性
异常(Exception)
***《异常的排查》***
1、运行时异常(未检查异常)
在程序运行的时候才会出现的异常情况
如:
java.lang.ArrayIndexOutOfBoundsException
java.lang.IndexOutOfBoundsException
java.lang.ArithmeticException
java.lang.NullPointerException
java.lang.ClassCastException
出现此异常时一定要进行修正,项目中不允许出现运行时异常
2、编译时异常(已检查异常)
在程序编译的时候就已经知道当前代码有可能会产生异常情况
编译时异常一定要捕获处理
处理:并不是把异常规避掉,而是当程序运行时如果出现了此异常后程序如何处理此异常并不 影响程序的运行
异常类结构:
Throwable
Error Exception(编译时异常)
ClassNotFoundException... RuntimeException(运行时异常)
异常是可以向上传递 / 异常会传递给调用者
throw new ClassNotFoundException():可以产生一个异常对象
异常处理的方式:
运行时异常:直接改正错误(程序写错了)
编译时异常:
throws:写在方法的声明中,可以抛出多个异常对象,也可以引用异常父类处理异常
开发过程中不允许此种方式处理异常
try catch finally
方法重写时子类方法抛出的异常要小于等于父类抛出的异常,和访问修饰符相反
自定义异常:
编译时异常 extends Exception
运行时异常 extends RuntimException
文件与IO流
一、文件File表示一个文件或文件夹
文件路径分隔符
创建File对象的方式
File提供的常用方法
二、IO流
传输单位是字节(字节流),输入输出是相对于jvm而言
IO流的分类:
传输单位:字节流、字符流
传输方向:输入流、输出流
功能:节点流、过滤流
字节流:
InputStream OutputStream ---> 抽象类
FileInputStream FileOutputStream
节点流、过滤流:
数据过滤流
DataInputStream DataOutputStream
缓冲过滤流
BufferedOutputStream BufferedInputStream
对象过滤流
ObjectInputStream ObjectOutputStream
***对象序列化:把对象转换成一组字节的过程
让某个对象实现serializable即可让此对象拥有序列化功能
序列化是对象的状态,并不包括类的内容(如:static)
transient
不能对dat文件进行append添加对象
***对象的反序列化:把一组字节恢复成对象的过程
字符流:
编码:将文字转换成计算机可识别的数字(1010101)
解码:
编码格式:
iso-8859-1:西欧国家的文字(英语)
gb2312、gbk:中国大陆(简体中文)
utf-8:繁体中文
乱码:由于编码格式的不同
getBytes(Charset charset)
new String(byte[] b,Charset charset)
Reader Writer --->抽象类
FileReader FileWriter --->间接实现类
桥接流:把字节流转换成字符流进行操作
InputStreamReader OutputStreamWriter --->类
过滤流:
BufferedReader PrintWriter
使用总结:
字节流:缓冲过滤流
字符流:过滤流BufferedReader PrintWriter
线程
面试Android
下馆子吃饭:
服务员:A B
厨师:C
顾客:S1 S2
假设:
A C
S1 A接待中 菜单S1 交给C
S2 等待A 菜单S2 交给C
C处理菜单:1、先把S1全部炒完,再炒S2
2、S1--S2---S1---S2 交替进行 抢占式调度执行
A B
把下馆子吃饭看做是一个应用程序
厨师 看做是 CPU
A B是相互不影响的在同一个应用程序中的独立流程:线程
***一个应用程序至少包含一个进程,一个进程中至少包含一个线程
时间片:抢占式调度执行
并发:线程的并发,而是由于cpu的执行时间对客户而言可以是忽略不计,表象上是并发,实际上是由cpu 通过时间片的调用分配执行的
程序 进程 线程 cpu时间片 调度执行 线程并发
1、线程开发
继承Thread,重写run方法
线程启动的方法
线程运行的特点
实现Runnable接口,实现run方法
2、线程状态
初始化状态 可运行状态 运行状态 终止状态
阻塞状态 锁池状态 等待状态
sleep(long):让线程暂停执行多少毫秒
当线程调用此方法后会立即进入到阻塞状态,此线程暂停执行,当sleep时间到达后,此线程进入
可运行状态,等待cpu的调度执行
sleep阻塞状态中的线程不会释放掉当前线程所占用的对象资源(对象锁),所以当再次抢到cpu时 间片后会直接进入运行状态
join():在当前线程中调用另外一个线程的join方法,就会让另外一个线程全部执行完后再执行当前线程
join(long):指定等待对方的时间
1200
女朋友给你钱,一百一百的给,你就一百一百的数
对象:女朋友 你
操作:女朋友一百一百的给钱
你一百一百的拿
女朋友开始给钱
你拿100 200 300 400
女朋友给钱结束
3、线程安全
临界资源:多个线程共同访问的对象
原子操作:完成某一个业务的不可分隔的代码
线程不安全:多线程并发访问某一个对象有可能会产生数据不一致的情况
线程安全:让原子操作不被分隔
4、线程同步
同步和异步的概念
synchronized
修饰:
方法:在方法的声明中进行修饰
代码块:synchronized(this){原子操作代码}
对象锁/互斥标记锁
锁池状态:假设线程A拥有了某个对象的对象锁,而其他的线程B想要调用当前这个对象被 Synchronized标记的方法或者语句块,而线程要执行synchronized同步语句块之前必须 要获取到当前对象的互斥标记锁(对象锁),但是该对象的对象锁已经被A线程占用,所以线程B就会进入到锁池状态,等待获取当前对象的对象锁
5、死锁
产生死锁的场景
解决死锁:
Object中提供的方法:wait() notify()/notifyAll()[通信机制]
需定义在synchronized同步对象中
假设线程A调用了某个对象的wait(),线程A就会释放掉该对象的对象锁(wait方法是需要定义在同步对象中),同时线程A就进入到了该对象的等待池中。如果另外的一个线程调用了当前对象的notify()/notifyAll()方法,那么出去该对象的等待池中的某个对象或者全部对象就会进入到当前对象的锁池状态,准备抢占当前对象的对象锁,如果某个线程抢到了对象锁,则进入到可运行状态。
生产者和消费者问题
java大纲
============网络编程==================
服务器:一台高性能的电脑
客户端:通过IP地址寻找网络中的唯一的一台机器
IP:能唯一标识网络中的一台计算机
ipv4:点分10进制
ipv6:点(冒号)分16进制
域名:唯一
DNS 域名解析器
www.baidu.com ===> 10.6.2.13
代表本机的IP地址:
实际IP地址
127.0.0.1
localhost
端口:port
一个端口代表计算机中的一个程序
查看计算机中的端口:cmd/netstat -a
协议:计算机网络中进行数据传送的网络模型
1、TCP
特点:有连接、可靠
在网络中客户端要传送数据给服务端
客户端:建立发送到服务端的数据通道
服务端IP、服务端port
java.net.Socket
服务端:确定应用程序的端口号
java.net.ServerSocket
***TCP编程:
创建客户端
创建服务端
客户端和服务端的相互通信
要让服务端7x24运行?
多个客户端可以同时请求服务端,服务端要处理请求(线程)?
UDP
URL
=================反射======================
创建一个对象(类的对象)
Student stu = new Student();
首先知道具体的类
类:抽象某一类事物所共有的属性和方法
类对象:描述类本身的属性
类的对象:
class A{
int age;
String name;
}
class B{
}
String str = "edu.itsltudy.Student";
edu.itstudy.j02grammar.JavaDocTest
静态(编程)语言:
java\c\c++\C#
动态(编程)语言:
在运行期间能够通过程序改变原有的结构(检查或改变数据类型)
javascript\python\vb
反射是让java拥有动态语言的特点
类对象创建的三种方式:
Class
反射包:
java.lang.reflect.*;
Field:
如何获取一个Field,设置和获取属性的值,修改属性的访问级别
Method:
如何获取一个方法对象并去调用此方法(注意被调用方法的返回值)
Constructor:
获取一个构造方法对象并创建类的对象
构造一个方法:能够调用任意类中的任意方法
===========JDK新特性==============
1、自动装箱出箱
Integer a = 10;
int c = a;
2、静态引入
import static java.lang.Math.*
3、for...each
4、可变长参数
一个方法中形参最多有一个可变长参数
可变长参数必须作为最后一个参数
Class...
5、泛型
6、泛型通配符
7、toString方法
8、枚举 Enum
String创建对象的理解
String strs = "xyz";
String str = new String("abc"); // 创建了几个对象? 2个对象
String StringBuffer StringBuilder的区别
如何精确小数位数?
Math
Random
Date
SimpleDateFormate
Calendar
BeanUtils
G
M
T
Detect languageAfrikaansAlbanianArabicArmenianAzerbaijaniBasqueBelarusianBengaliBosnianBulgarianCatalanCebuanoChichewaChinese (Simplified)Chinese (Traditional)CroatianCzechDanishDutchEnglishEsperantoEstonianFilipinoFinnishFrenchGalicianGeorgianGermanGreekGujaratiHaitian CreoleHausaHebrewHindiHmongHungarianIcelandicIgboIndonesianIrishItalianJapaneseJavaneseKannadaKazakhKhmerKoreanLaoLatinLatvianLithuanianMacedonianMalagasyMalayMalayalamMalteseMaoriMarathiMongolianMyanmar (Burmese)NepaliNorwegianPersianPolishPortuguesePunjabiRomanianRussianSerbianSesothoSinhalaSlovakSlovenianSomaliSpanishSundaneseSwahiliSwedishTajikTamilTeluguThaiTurkishUkrainianUrduUzbekVietnameseWelshYiddishYorubaZulu | AfrikaansAlbanianArabicArmenianAzerbaijaniBasqueBelarusianBengaliBosnianBulgarianCatalanCebuanoChichewaChinese (Simplified)Chinese (Traditional)CroatianCzechDanishDutchEnglishEsperantoEstonianFilipinoFinnishFrenchGalicianGeorgianGermanGreekGujaratiHaitian CreoleHausaHebrewHindiHmongHungarianIcelandicIgboIndonesianIrishItalianJapaneseJavaneseKannadaKazakhKhmerKoreanLaoLatinLatvianLithuanianMacedonianMalagasyMalayMalayalamMalteseMaoriMarathiMongolianMyanmar (Burmese)NepaliNorwegianPersianPolishPortuguesePunjabiRomanianRussianSerbianSesothoSinhalaSlovakSlovenianSomaliSpanishSundaneseSwahiliSwedishTajikTamilTeluguThaiTurkishUkrainianUrduUzbekVietnameseWelshYiddishYorubaZulu |
Text-to-speech function is limited to 200 characters
G
M
T
Detect languageAfrikaansAlbanianArabicArmenianAzerbaijaniBasqueBelarusianBengaliBosnianBulgarianCatalanCebuanoChichewaChinese (Simplified)Chinese (Traditional)CroatianCzechDanishDutchEnglishEsperantoEstonianFilipinoFinnishFrenchGalicianGeorgianGermanGreekGujaratiHaitian CreoleHausaHebrewHindiHmongHungarianIcelandicIgboIndonesianIrishItalianJapaneseJavaneseKannadaKazakhKhmerKoreanLaoLatinLatvianLithuanianMacedonianMalagasyMalayMalayalamMalteseMaoriMarathiMongolianMyanmar (Burmese)NepaliNorwegianPersianPolishPortuguesePunjabiRomanianRussianSerbianSesothoSinhalaSlovakSlovenianSomaliSpanishSundaneseSwahiliSwedishTajikTamilTeluguThaiTurkishUkrainianUrduUzbekVietnameseWelshYiddishYorubaZulu | AfrikaansAlbanianArabicArmenianAzerbaijaniBasqueBelarusianBengaliBosnianBulgarianCatalanCebuanoChichewaChinese (Simplified)Chinese (Traditional)CroatianCzechDanishDutchEnglishEsperantoEstonianFilipinoFinnishFrenchGalicianGeorgianGermanGreekGujaratiHaitian CreoleHausaHebrewHindiHmongHungarianIcelandicIgboIndonesianIrishItalianJapaneseJavaneseKannadaKazakhKhmerKoreanLaoLatinLatvianLithuanianMacedonianMalagasyMalayMalayalamMalteseMaoriMarathiMongolianMyanmar (Burmese)NepaliNorwegianPersianPolishPortuguesePunjabiRomanianRussianSerbianSesothoSinhalaSlovakSlovenianSomaliSpanishSundaneseSwahiliSwedishTajikTamilTeluguThaiTurkishUkrainianUrduUzbekVietnameseWelshYiddishYorubaZulu |
Text-to-speech function is limited to 200 characters