W_Z_W写
Java基础疑难
1、接口:
接口的默认修饰符是public和abstract的,但是当接口在一个类中声明时,把它当做类元素处理,即可以加在类成员的修饰符也可以加在它上,但final是在哪里都不行的;
*******************************************************************************
2、内部类:
类型:
1.成员内部类:定义在类中且不在函数中的类;
创建对象格式(把内部类当做外部类的一个成员):
外部类.内部类 变量名=外部类对象.new内部类()
2.函数内部类:定义在函数里的类,只能在该函数的作用域内使用
创建对象格式:把内部类当做普通类来使用,只不过作用域只在该函数内
3.静态内部类:定义在类中,且被修饰符static修饰的类
创建对象格式(不需要通过外部类对象):
外部类.内部类 变量名=new外部类.内部类()
*******************************************************************************
3、关键字:String不是关键字,而是类名,注意:关键字都是小写的;
*******************************************************************************
5、==与equals()的区别:
作用:==用来判断地址与值是否相等;equals()用来判断内容是否相等,不考虑地址;
用法:基本数据类型判断是否相等用==,byte、short、int、char、long、float、double、 boolean;字符串判断是否相同用equals()(是String类的一个函数);
*******************************************************************************
6、数据的精度问题:
高精度的数据类型不能隐式的赋给低精度的数据类型,需要做显式的强制类型转换,同精度之间的转换或者是低精度转高精度都可以隐式的自动转换,当不同精度类型的数据进行数学运算时,结果会自动的转为高精度类型。
比如:int a=10; float b=a; 正确;
float a =10; int b=a; 错误 正确形式为int b=(int)a;不过可能会造成精度丢失
这里的float a =10为什么不是float a =10f,因为10是int类型的,精度比float低,所以可以自动转换为float;
注意:带小数的值如果后面不加f,则默认是double类型
*******************************************************************************
7、java中的数据类型分析:
基本数据类型和引用类型之间的转化
*******************************************************************************
8、+号在Java中的作用
两种作用:1.数学运算:如果加号两边都是基本数据类型,则是数学运算;
2.充当字符串连接符:如果加号的任意一边是非基本数据类型,则是连接符;
注意点:+符号是从左边开始算的,所以有如下例子
1.打印(1+2+”3”)结果为:33 (先执行数值1+数值2,得数值3在再字符串”3”连接)
2.打印(1+”2”+3)结果为:123(先执行数值1与字符串”2”连接,得字符串”12”)
3.打印(“1”+2+3)结果为:123(先执行字符串”1”与数值2连接,得字符串”12”)
整数转字符串:
特别注意:String 类型的字符串在赋值、+、+=运算时都是改变了对象的,即不是单纯的对象中内容的改变,而是得到一个新的对象;
如String s=”aa”; s=”bb”(对象已经改变,即”aa”与”bb”也都是一个字符串对象)
String s=”aa”;s+=”bb”;(对象也改变了)
*******************************************************************************
8、异常:
异常:程序运行过程中出现的非正常问题;
继承关系:Throwable是异常的祖先类,下面有两个直接子类,分别是:1.Error(错误);
2.Exception(异常);
Exception的补充:异常分为受检型异常和非受检型异常,受检型异常在编译时就要处理 (比如加try catch语句,或者throw抛出),非受检时异常就是编译时没有报错,但是运行时出现的异常(比如空指针异常)
补充:程序的非受检异常一旦出现,整个程序会瘫痪
异常代码块,可以通过try...catch方式来进行处理
finally代码块:是异常代码块的统一出口,必须要执行
如果有多个catch语句块,则从上往下捕获的时候,一定是从小到大级别或者同 级别捕获,即从子类到父类,异常捕获的具体性由上至下递减,且只要满足了一 个就被捕获,不再被下面的捕获,类似于case+break;
*******************************************************************************
9、I/o流:
1.字符和字节的关系:个英文单词就是一个字符(1个字节);一个中文表示一个字符 (UTF-8为3个字节,GBK为2个字节);
2.大类继承图:
3.注意点:字符流不能直接包装字节流:除了InputStreamReader和OutputStreamWriter;
*******************************************************************************
10、作用域修饰符详解:
作用域 | 当前类访问 | 同包 | 子类同包 | 子类不同包 | 其他(跨包,不是子类) |
public | Y | y | Y | y | y |
protected | y | y | y | y | n |
default | y | y | y | n | n |
Private | y | n | n | n | n |
公共:不涉及到到隐私,公开的(一般情况下不用,,,static->类的 类名.)
保护:你想给留给子类,父类里面的东西一般都是保护的
默认:一般没有用
私有:一般所有属性都是他
*******************************************************************************
11、接口与抽象类的比较:
看属性:
接口中:必须是常量static final(在Java中表示常量,必须在且仅能在声明时被初始化)
抽象类:可以是常量,也可以是变量
看方法:
接口中:全部是也只能是抽象方法
抽象类:可以有抽象方法,也可普通方法,也可以有构造方法
补充:1.接口中所有的方法和属性访问权限,必须是public abstract(可以省略不写)
2.接口可以继承接口,且可以多继承,如Interface a extends Interface b,Interface c......
而类只能单继承,且不能继承接口,而只能是实现接口,但类实现接口可以同时实现多个接口,用关键字implement;
*******************************************************************************
12、关键字static:
static修饰的属性和方法都是属于类的,只跟类加载有关,而与对象的创建无关,被static修饰的属性或者变量在类加载时最先加载,而且只加载一次,在加载类时,在同被static修饰或者是同不被static修饰的情况下,代码块最先加载,然后到属性,然后才到函数,静态代码块在类加载时就会执行,而非静态代码块是在创建对象时执行;
注意:被static修饰的函数不能调用非静态的的属性或函数(因为静态的东西在加载类时就先加载了,而且非静态的东西在创建对象时才会有,所有无法调用非静态的东西)
*******************************************************************************
13、线程中调用start()函数与run()函数的区别:
调用run()函数是在当前线程调用run()函数,程序还是顺序执行的,所以还算单线程;
而调用start()函数是新创建一个线程,并通知Java虚拟机调用该线程的run()函数;
*******************************************************************************
14、小点补充:
+=、-=、*=、/=运算符都具有自动强制转换的功能,
如:byte b=1;
int i=1;
b+=i;(不会报错,因为+=符号自动把b+i得到的int型结果强制转换成byte型然后赋给b)