1.基本数据类型之间向上(下)转换:
byte,short,char——>int——>long——>float——>double
前三者在计算时会自动转换成int类型。
后几个如果是向上转换时自动转换,如果是向下转换则需要强制转换,例如:
int i=2;
long l=i //自动转换
-----------------------------------------------------------------------------------------------
double o=3.14
int p=(int)o //必须强转
------------------------------------------------------------------------------------------------
2.java运算符:
&和&&的区别:
&运算符无论左边表达式是否为true,都计算右边的表达式;
&&若符号左边表达式为false,则不计算右侧的表达式了;
|和||的区别:
同理,单|无论左侧结果如何都计算右侧表达式;双||时,若左侧为true则不计算右侧表达式,否则进行计算;
三目运算符:
格式:b?x:y
解释:b是boolean类型的表达式,若b结果为true,则三目运算表达式的结果是x,否则结果是y
方法名词的定义:一段可以重复使用的代码段,程序中完成独立功能的一段代码集合;
方法的重载(overload):方法名相同,方法的参数类型或者参数个数后者参数顺序不同,返回值类型 也可以不同,是静态多态的体现;
方法的重写(override):前提是基于子类对父类这样的关系下,方法名与形参列表一致,返回值类型一致(或者小于父类的返回值类型).
注意:子类的权限修饰符必须要大于或者等于父类的权限修饰符,子类抛出的异常类型要小于或者等于父类抛出的异常类型.
3.可变参数
java5之后出现的,放在参数列表的最后,表示穿的参数根据实际情况而定,一般表示为;
(int a,String b,double...c),其中double...c就表示可变参数。
4.关于构造函数,构造代码块和成员变量赋值三个操作的执行顺序:
1. java编译器编译一个java源文件的时候,会把成员变量的声明语句提前至一个类的最前端(但不代表是最前端执行)。
2. 成员变量的初始化工作其实都在在构造函数中执行的,也就是说在执行过程中成员变量赋值代码会移动到构造函数中执行,并且是在构造函数中的代码前执行。3. 一旦经过java编译器编译后,那么构造代码块的代码块就会被移动构造函数中执行,是在构造函数之前执行的,构造函数的中代码是最后执行 的。
4. 成员变量的赋值代码和构造代码块 的代码是按照当前java文件中代码的顺序执行的。
class Demo5
{ //构造函数
public Demo5(){ //构造函数
i = 300000000;
}
//构造代码块
{
i = 200000000;
}
int i = 100000000; //成员变量的显初始化
public static void main(String[] args)
{
Demo5 d = new Demo5();
System.out.println("i = "+d.i);
}
}
例如以上代码,执行时int i = 100000000;和i = 200000000;会按照当前两者的顺序排列到构造函数中执行,相当于下面的代码:
public Demo5(){ //构造函数
i = 200000000;
i = 100000000;
}
5.关于继承特性要注意的地方:
1.创建子类对象时默认会先调用父类无参的构造函数。调用父类的构造方法是可以初始化从父类继承下去的属性的。
2. 子类原则上是继承父类所有成员变量和方法包括私有的,但是子类不能直接调用父类私有的成员和方法。
3. 父类的构造函数不能被继承。
4.super关键字:
super关键字代表了父类空间的引用。
super关键字的 作用:
1. 子父类存在着同名的成员时,在子类中默认是访问子类的成员,可以通过super关键字指定访问父类的成员。
2. 创建子类对象时,默认会先调用父类无参的构造方法,可以通过super关键字指定调用父类的构造方法。
super关键字调用父类构造方法要注意的事项:
1. 如果在子类的构造方法上没有指定调用父类的构造方法,那么java编译器会在子类的构造方法上面加上super()语句。
2. super关键字调用父类的构造函数时,该语句必须要是子类构造函数中的第一个语句。
3. super与this关键字不能同时出现在同一个构造函数中调用其他的构造函数。因为两个语句都需要第一个语句。
6.抽象类要注意的问题:
1. 如果一个函数没有方法体,那么该函数必须要使用abstract修饰,把该函数修饰成抽象 的函数。。
容易误导的一个点是public void run(){ }这种写法只是代表方法体为空并不是没有方法体
2. 如果一个类出现了抽象的函数,那么该类也必须 使用abstract修饰。3. 如果一个非抽象类继承了抽象类,那么必须要把抽象类的所有抽象方法全部实现。
4. 抽象类可以存在非抽象方法,也可以存在抽象的方法.
5. 声明为抽象类的类中可以不存在抽象方法,但是只要一个类只要存在抽象方法就必须声明成抽象类。
5. 抽象类是不能创建对象的。
疑问:为什么抽象类不能创建对象呢?
因为抽象类是存在抽象方法的,如果能让抽象类创建对象的话,那么使用抽象的对象
调用抽象方法是没有任何意义的。
6. 抽象类是存在构造函数的,其构造函数是提供给子类创建对象的时候初始化父类的属性的。
7.接口要注意的问题:
接口要注意的事项 :1. 接口是一个特殊的抽象类。
2. 接口的成员变量默认的修饰符为: public static final 。那么也就是说接口中的成员变量都是常量。
3. 接口中 的方法都是抽象的方法,不能有方法体,默认的修饰符为: public abstract。
4. 接口是没有构造方法的,接口不能直接实例化对象。
5. 接口是给类去实现使用的,非抽象类实现一个接口的时候,必须要把接口中所有方法全部实现(因为接口这个特殊的抽象类中的方法都是抽象方法), 但是抽象类实现一个接口时,可以实现也可以不实现接口中的 方法。. 一个类可以实现多个接口 。
6.接口与接口之间关系是继承关系。与类的单继承不同, 接口是可以继承多个接口的,如:interface B extends A,C
8,多态要注意的问题:
多态的定义:一个对象具备多种形态。
具体是指 父类的引用类型变量指向了子类的对象 或者是 接口的引用类型变量指向了接口实现类的对象
存在多态特征的前提:必须存在继承或者实现 关系。
1. 多态情况下,子父类存在同名的成员变量时,访问的是父类的成员变量。
2. 多态情况下,子父类存在同名的非静态的成员函数时,访问的是子类的成员函数。
3. 多态情况下,子父类存在同名的静态的成员函数时,访问的是父类的成员函数。
4. 多态情况下实例化的对象不能直接访问子类中特有的成员, 要把父类引用变量强制转换成子类的类型才能调用子类中特有的成员。
总结:多态情况下,子父类存在同名的非静态的成员方法时访问的子类的方法。子父类存在同名的其他成员时,访问的都是父类的成员,
一个类实现接口关系下的多态:(Dao dao=new DaoImp();)
子类实现了接口所有的方法,调用的都是实现类自己的成员方法
8.关于异常注意的问题:
异常体系:
--------| Throwable 所有错误或者异常的父类
--------------| Error(错误)
--------------| Exception(异常) 异常一般都通过代码处理
------------------| 运行时异常: 如果一个方法内部抛出了一个运行时异常,那么方法上 可以声明也可以不 声明,调用者可以以处理也可以不处理。
------------------| 编译时异常(非运行时异常、受检异常): 如果一个方法内部抛出了一个编译时异常对象,那么方法上就必须要声明,而且调用者也必须要处理。
运行时异常: RuntimeException以及RuntimeException子类 都是属于运行时异常。
编译时异常: 除了运行时异常就是编译异常。
9.关于导包问题注意的地方:
为什么需要包:在jvm编译的时候同名类会被覆盖,因此必须要以包区分(类似于win系统中的文件夹)
sum提供导包语句让我们解决该问题。导包语句作用:简化书写。如果不导包的话代码中类与类之间的访问每次都必须 要写上类的完整路径(包括包名)
导包语句的格式:
import 包名.类名; (导入xxx包中某个类)
导包语句要注意的细节:
1. 一个java文件中可以出现多句导包语句。
2. "*"是 导包语句的通配符。可以匹配任何 的类名。
3. import aa.*; 是不会作用于aa包下面的子包的。
推荐使用:import 包名.类名; 因为使用*通配符会导致结构不清晰。
什么时候使用import语句:
1. 相互访问的两个类不是在同一个包下面,这时候就需要使用到导包语句。
2. java.lang 是默认导入 的,不需要我们自己导入。