一、Java中访问修饰符作用范围由大到小是?
在Java语言中,类的权限访问修饰符有以下几种:1)private 2)default (package) 3)protected 4)public
。下面对这几种分别简单介绍一下:
(1)私有权限
private: 可以修饰数据成员、构造方法以及成员变量,不可以修饰类(此处指外部类,不考虑内部类),被private修饰的成员,只能在其本类中使用,在其他类中不能调用。()
(2)默认权限
default:类、数据成员、构造方法以及成员变量都能使用默认权限,即不被其他修饰符修饰。默认权限即同包权限,同包权限的元素只能在他们的类中或者其他一个包下面的类中被调用。
(3)受保护权限
protected:可以修饰数据成员、构造方法以及成员变量,不可以修饰类(此处指外部类,不考虑内部类)。被protected修饰的元素,可以在它们的类中以及同包的类中被调用,如果有不同包的类想要调用它,那个类必须是本类的子类。
(4)公共权限
public:可以修饰类、数据成员、构造方法以及成员变量。被public修饰的成员,可以在任何一个类中调用,不管同包还是不同包,是访问权限最大的访问修饰符。
范围 | private | default | protected | public |
同一类 | √ | √ | √ | √ |
同一包的类 | × | √ | √ | √ |
不同包的子类 | × | × | √ | √ |
所有 | × | × | × | √ |
2.接口和抽象类有什么区别?
接口与抽象类的相同点如下:
1)都不能被实例化。
2)接口的实现类或抽象类的子类都只有实现接口或抽象类中的方法后才能被实例化
接口和抽象类的区别如下:
1)接口只有定义,不能有方法的具体实现,而抽象类可以有定义与实现,即方法可以在抽象类中被实现。
2)实现接口的关键字为implements,继承抽象类的关键字为extends。一个类可以实现多个接口,但是一个类只能继承一个父类,因此,使用接口可以间接的达到多继承的目的。
3)接口强调特定功能的实现,其设计理念是“like-a”关系,而抽象类强调所属关系,其设计理念为“is-a”关系。
4)接口中定义的成员变量默认为public static final,只能够有静态的不能修改的被初始化的数据成员,其所有的成员方法都是public、abstract的,而且只能被这两个关键字修饰。而抽象类可以有自己的数据成员变量,也可以有非抽象的成员方法,而且,抽象类中的成员变量默认为default,当然也可以定义为private、protected和public,这些成员变量可以在子类中被重新定义,业可以被重新赋值。抽象类中的抽象方法不能用private、static、synchronized和native等访问修饰符修饰,同时方法必须以分号结尾,并且不带花括号{}。所以当功能需要累积时,使用抽象类;不需要累积时,使用接口。
5)接口被运用于实现比较常用的功能,便于日后维护或者添加删除方法,而抽象类更倾向于充当公共类的角色,不适用于日后重新对里面的代码进行修改。
3.实现多线程的方法有几种?
一般有以下三种方法:
1)实现Runnable接口,并实现该接口的run()方法。
2)继承Thread类,重写run方法()。
3)实现Callable接口,并重写其中的call()方法。
前面两种是比较常用的,Callable接口与Runnable接口类似,但是提供比Runnable更强大的功能。
4.Java中的八大基本数据类型?及对相关数据类型知识的理解。
byte:
- byte数据类型是8位、有符号的,以二进制补码表示的整数;(256个数字),占1字节
- 最小值是-128(-2^7);
- 最大值是127(2^7-1);
- 默认值是0;
- byte类型用在大型数组中节约空间,主要代替整数,因为byte变量占用的空间只有int类型的四分之一;
- 例子:byte a = 100,byte b = -50。
short:
- short数据类型是16位、有符号的以二进制补码表示的整数,占2字节
- 最小值是-32768(-2^15);
- 最大值是32767(2^15 - 1);
- Short数据类型也可以像byte那样节省空间。一个short变量是int型变量所占空间的二分之一;
- 默认值是0;
- 例子:short s = 1000,short r = -20000。
int:
- int数据类型是32位、有符号的以二进制补码表示的整数;占4字节
- 最小值是-2,147,483,648(-2^31);
- 最大值是2,147,485,647(2^31 - 1);
- 一般地整型变量默认为int类型;
- 默认值是0;
- 例子:int a = 100000, int b = -200000。
long:
- long数据类型是64位、有符号的以二进制补码表示的整数;占8字节
- 最小值是-9,223,372,036,854,775,808(-2^63);
- 最大值是9,223,372,036,854,775,807(2^63 -1);
- 这种类型主要使用在需要比较大整数的系统上;
- 默认值是0L;
- 例子: long a = 100000L,int b = -200000L。
long a=111111111111111111111111(错误,整数型变量默认是int型)
long a=111111111111111111111111L(正确,强制转换)
float:
- float数据类型是单精度、32位、符合IEEE 754标准的浮点数;占4字节 -3.4*E38- 3.4*E38。。。浮点数是有舍入误差的
- float在储存大型浮点数组的时候可节省内存空间;
- 默认值是0.0f;
- 浮点数不能用来表示精确的值,如货币;
- 例子:float f1 = 234.5f。
- float f=6.26(错误 浮点数默认类型是double类型)
- float f=6.26F(转换正确,强制)
- double d=4.55(正确)
double:
- double数据类型是双精度、64位、符合IEEE 754标准的浮点数,占8字节 ;
- 浮点数的默认类型为double类型;
- double类型同样不能表示精确的值,如货币;
- 默认值是0.0d;
- 例子:double d1 = 123.4。
boolean:
- boolean数据类型表示一位的信息,占1字节 ;
- 只有两个取值:true和false;
- 这种类型只作为一种标志来记录true/false情况;
- 默认值是false;
- 例子:boolean one = true。
char:
- char类型是一个单一的16位Unicode字符;用 ‘’表示一个字符。。java 内部使用Unicode字符集。。他有一些转义字符 ,2字节
- 最小值是’\u0000’(即为0);
- 最大值是’\uffff’(即为65,535);可以当整数来用,它的每一个字符都对应一个数字
在浮点型的包装类赋值的时候,需要加东西,例如:
Float f = 2.3F;
Double d = 2.0D;
5.有如下代码:
public class Test
{
public void change(String str,char ch[])
{
str = "test ok";
ch[0] = 'g';
}
public static void main(String args[])
{
String str = new String("book");
char[] ch = {'a','b','c'};
Test t = new Test();
t.change(str,ch);
System.out.print(str+"and");
System.out.print(ch);
}
}
请分析输出的结果?
这个讲的知识点关于Java中形参,实参,可变类,不可变类。
因为呢,这里面的String是不可变类,当主函数调用change()方法的时候,将对“book”的引用传入进去,change方法中改变引用对象,转而指向新的字符串“test ok”,此时"book"还在内存中,"test ok"是新建出来的对象,但是这个修改对实参是不可见的,此时形参地址指向test ok,实参地址仍然是"book",主函数打印实参,输出的自然是book。相反,char[]数组是可变的,调用方法的时候,把对数组的引用复制给了形参,对数组下标为0的元素做出的修改对实参是可见的,此时实参形参都是指向的同一个数组引用,自然输出的是修改后的数组。