1. 详细描述“继承”的概念。
继承是一种利用已有的类,快速的创建新的类的机制。
public class Animal extends Object {
public float weight;
public String color;
public void eat() {};
public void drink() {};
}
public class Cat extends Animal {
}
public class Dog extends Animal {
}
在实现继承关系以后,被继承的类称之为父类/超类/基类/SuperClass,得到继承的类称之为子类/派生类/SubClass。
在Java中,继承使用extends关键字。
Java是单继承的:在Java中,每个子类只能有1个直接父类,如果某个类没有继承自其它类,则默认继承自Object类,Object是每一个继承链的顶端的类,也是Java种所有类的直接或间接父类。
当实现了继承关系后,子类将得到父类所有的属性和方法,包括并不具备访问权限的,例如父类中私有的。
Object中的常用方法:
>> String toString() -> 通常用于显示对象的属性值及相关信息,在输出对象时,将默认调用该方法。
>> boolean equals(Object object) -> 判断2个对象是否是同一个对象。
>> int hashCode() -> 获取对象的hash码,没有被重写过的hashCode()的返回值,可以用于判断对象是否相等,即hash码相同,则是同一个对象,反之,则不是同一个对象。
>> Class> getClass() -> 获取对象所归属的类的信息
2. 详细描述“重写”的概念。
重写:Override / Overwrite
当实现继承关系后,父类中的某些方法可能不足以描述出子类的特性,则在子类中,可以定义在父类中已经存在的方法,自行描述自身的特征,即为重写。
当实现了重写后,只要调用方法的对象是子类的对象,则一定会执行子类重写的方法。
在重写时,必须与父类的方法的返回值、方法名、参数列表保持一致。
在重写时,不可以使用比父类的方法更严格的访问权限,例如父类的方法使用protected修饰,则在子类中重写时,可以使用protected、public,不可以使用private。
在重写时,不可以抛出比父类的方法更多,或者范围更大的异常,例如父类的方法抛出FileNotFoundException,则在子类中,如果也抛出了FileNotFoundException,是正确的,但是,在此基础上,抛出了其它非RuntimeException则是错误的,因为抛出了更多的异常,或者在子类中,不抛出FileNotFoundException,却抛出IOException也是错误的,因为抛出了范围更大的异常。简言之:子类重写时,抛出的异常相比父类只能少不能多,不能抛出父类中没有抛出的非RuntimeException。
3. 请解释String类的不变性
String的不变性表现为对象被创建之后,对象不可以发生变化。
例如存在String str = "hello",则"hello"不可以发生变化,注意:变量的引用依然可以指向其他位置,例如str = "morning"。
String的不变性是因为String数据的本质是数组,而数组的长度是不可变的。
4. 请解释String类如何判断是否相同或者相等
==表示是同一个对象,用于判断栈内存中的内容是否相等,即在内存中是同一个数据。
字符串常量池:用于存储字符串常量,在常量池中的字符串具有唯一性。
关于String类型的数据需要判断是否相同,应该使用String类的equals()方法进行判断,equlas()方法的判断标准是String的每一个字符是否相同,即内容相同的字符串的判断结果为true,内容不同则结果为false。
String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");
String str4 = new String("hello");
String str5 = "he" + "llo"; // 常量+常量->常量
String str6 = "he";
str6 = str6 + "llo"; // 变量+常量->变量
str1 == str2 T
str1 == str3 F
str1 == str4 F
str1 == str5 T
str1 == str6 F
String类型的数据在运算时的效率极低,在对性能有一定要求的情况下,应该使用StringBuffer或者StringBuilder进行运算。
Linux文件系统的权限
-------------------------------------
Linux系统中,文件/文件夹的权限使用10个字符表示,例如:drwxr--r--
权限字符串中:
第1位表示类型,可能为d,表示文件夹(directory),可能为l,表示链接(link),可能为-,表示文件
第2~4位表示文件的所有者(owner)的操作权限,其中,r表示read,即读取,w表示write,即写(增加、修改、删除),x表示execute,即执行,如果为-,表示无此权限。
第5~7位表示与所有者(owner)同组的用户的权限。
第8~10位表示其他用户的权限。
Linux系统中默认的管理员账号是root,该账号不受任何权限限制。
在APP中声明权限
-------------------------------------
当APP需要使用敏感操作(可能涉及隐私的、可能产生费用的、可能涉及安全的⋯⋯)时,必须声明权限。
声明权限:
打开项目的AndroidManifest.xml文件,在
访问SD卡需要声明的权限:
android.permission.MOUNT_UNMOUNT_FILESYSTEMS
android.permission.READ_EXTERNAL_STORAGE
MediaPlayer的常用方法
-------------------------------------
void reset() -> 重置
void setDataSource(String) -> 设置歌曲路径
void prepare() -> 准备歌曲数据/缓冲/将歌曲信息加载到内存
void start() -> 开始播放
void pause() -> 暂停播放
int getCurrentPosition() -> 获取当前播放到的位置,返回值为以毫秒为单位的数值
void seekTo(int) -> 快进到指定的位置,参数为以毫秒为单位的数值
boolean isPlaying() -> 是否正在播放,返回值为boolean值
void release() -> 释放播放器相关资源,通常在结束时调用
Environment类
-------------------------------------
Environment是访问扩展存储(sdcard)时的工具类,该类定义了一系列静态方法、静态常量用于访问扩展存储等。
String getExternalStorageState() -> 获取扩展存储设备的状态
File getExternalStorageDirectory() -> 获取sdcard的文件夹对应的File对象
File getExternalStoragePublicDirectory(String) -> 获取sdcard下的某个共有文件夹对应的File对象,例如Music文件夹对应的File对象,参数表示需要访问的文件夹,取值应该为Environment类的DIRECTORY_???常量