首先,java中的一个char的确是2个字节。java采用unicode,2个字节来表示一个字符。 一个数字或英文或汉字都是一个字符,只不过数字和英文时,存储的2个字节的第一个字节都为0,就是浪费了点空间。存汉字就占满了2个字节
提问:char类型能不能存储一个汉字?
答:不一定, char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在 unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。
* 说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。
提问:String类特点?
答:1.String类对象的相等判断使用equals() 方法完成,“==”实现的是地址数值的比较。
2.String被声明为fanil类无法被继承,所以不能在有子类。字符串内容一旦声明则不可改变,String类对象内容的改变是依靠引用关系的变更实现的。
3.String类有两种实例化方式,使用直接赋值可以不产生垃圾空间,并且可以自动入池,不要使用构造方法完成
提问:Object是所有类的父类,任何类都默认继承Object。Object类到底实现了哪些方法?
1.clone方法
保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。
2.getClass方法
final方法,获得运行时类型。
3.toString方法
该方法用得比较多,一般子类都有覆盖。
4.finalize方法
该方法用于释放资源。因为无法确定该方法什么时候被调用,很少使用。
5.equals方法
该方法是非常重要的一个方法。一般equals和==是不一样的,但是在Object中两者是一样的。子类一般都要重写这个方法。
6.hashCode方法
该方法用于哈希查找,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。
一般必须满足obj1.equals(obj2)==true。可以推出obj1.hash- Code()==obj2.hashCode(),但是hashCode相等不一定就满足equals。不过为了提高效率,应该尽量使上面两个条件接近等价。
7.wait方法
wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。
调用该方法后当前线程进入睡眠状态,直到以下事件发生。
(1)其他线程调用了该对象的notify方法。
(2)其他线程调用了该对象的notifyAll方法。
(3)其他线程调用了interrupt中断该线程。
(4)时间间隔到了。
此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。
8.notify方法
该方法唤醒在该对象上等待的某个线程。
9.notifyAll方法
该方法唤醒在该对象上等待的所有线程。
编程题:随机输出a~z的任意字母。
ASCALL码(A~Z):65~90
ASCALL码(a~z):97~122
ArrayList list =
new
ArrayList();
for
(
char
c =
'a'
; c <=
'z'
; c++) {
list.add(c);
}
String str =
""
;
for
(
int
i =
0
; i <
26
; i++) {
int
num = (
int
) (Math.random() *
26); //
math.random()*26代表返回一个[0,26)的浮点数。
str = str + list.get(num);
}
System.out.println(str);
----------------------------------------------------
提问:抽象类能不能继承‘?
答:抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。
在Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。
----------------------------------------------------------------
继承的两种形式:
特点:
1.单继承,多实现。
2.static方法可以被继承,但是不可以重写。【通过类直接调用的,因为在创建对象的时候已经存在了】
3.final修饰的类不可以被继承,final修饰的方法可以继承,但是不可以重写。
----------------------------------------------------------------------------
面向对象特征--多态
定义:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。
两种表现形式:
1.重写
2.重载
方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。
重载Overloading是一个类中多态性的一种表现。
Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。
调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。
重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。
重写方法的规则:
1)、参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载。
2)、返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载。
3)、访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)
4)、重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。例如:
父类的一个方法申明了一个检查异常IOException,在重写这个方法是就不能抛出Exception,只能抛出IOException的子类异常,可以抛出非检查异常。
---------------------------------------------------------
面对对象特征--抽象
定义:对某一类对象的同意特征的抽取。
两种形式:
1.接口:只有方法声明,没有方法实现。
2.抽象类:有抽象方法的类
提问:为什么java中要有抽象类和接口?
1.接口不是类,为什么?
接口如果是类,那就失去了java引入接口的意义了。
java之所以引入接口,就是为了弥补不能多继承的缺点,在java中每个类只能有一个超类,但却可以实现多个接口。
2.接口可以有静态常量(一定是静态的,无论写没写static),但是不能含有实例域,为什么?
接口就类似一个说明文档,定义继承接口的类应该必须有什么方法以及该方法的输入输出。
接口的思想不允许出现变量,接口只是对一类事物的属性和行为更高层次的抽象。对修改关闭,对扩展(不同的实现 implements)开放。所以接口中的属性必然是常量,只能读不能改,这样才能为实现接口的对象提供一个统一的属性。
3.接口中可以有静态方法,为什么?
JAVA SE 8中可以定义带有方法体的静态方法,以保证“源代码兼容”。
4.接口可以有静态常量,并且这个常量一定是静态的,为什么?
因为static是所有对象可以访问,而且可以直接通过类名访问。接口没有对象,必须通过类名来访问所以是要静态的。
5.内部接口默认是静态的,为什么?
接口不能被实例化,所以内部接口只有在静态时才有意义。 因此,默认情况下,无论是否手动添加静态,内部接口都是静态的。
想清楚这些,再想想接口和抽象类有什么不一样,什么时候用接口,什么时候用抽象类?
1.抽象类是类,但接口不是。
2.接口中的方法都是抽象方法,而抽象类必须有抽象方法,但也可以有普通方法。
3.接口定义的方法以及常量都是public,而抽象类是可以有私有方法或私有变量的。
4.实现接口需要实现接口中的每一个方法,而继承抽象类则可以选择实现抽象类中的一部分抽象方法,但此时这个子类仍然是一个抽象类。
5.接口可以实现多继承,但是一个类只能实现一个超类。
6.接口中定义的变量默认是public static final 型,必须给其初值,所以实现类中不能重新定义,也不能改变其值。抽象类中的变量默认是default 型,其值可以在子类中重新定义,也可以重新赋值。
接口更像是一种协议,实现接口的子类需要按照这种协议来编写自己的代码,但抽象类就更像一个不能实例化的普通类,只不过为了子类更加灵活多变,将一部分方法留给子类去实现,这也体现了java的多态。
提问:抽象类和接口为什么不能创建对象?
答:比如说对于我们人类,从中可以区分中国人,美国人等,中国人还可以分为汉族与其他少数民族.一个人,必然属于世界上的某个国家和某个民族.
人类就好比一个抽象类,是我们创造的一个高度抽象的概念,并不存在人类本身的实例.
他的唯一用途就是被继承,产生一个可以实在存在的人.
提问:静态变量和final变量
答:final变量:只能赋值一次的变量,或常量。
静态变量:又叫类变量,由类的所有对象共享。对于静态成员,所有对象共享一个变量,可以在本类或其他类中使用“类名.静态成员”来调用静态成员。
ps:非静态变量: 只能使用对象去调用。
提问:数组是引用类型还是基本数据类型
答:引用类型。存储相同的数据类型变量的集合。