short a =4;
a=a+5; //会报错 ,因为进行了一次加法运算又进行了一次赋值运算。
a+=5; //不会报错,因为只进行了一次运算,而且这个运算会强制类型转换。
环境变量配置 技巧 我们可以设置一个classpath变量 这样java在寻找类的时候会首先考虑classpath地址里的。 可以在path里加入 %classpath%变量。
&和&&的区别
Int a=2;
a>3& a<4 首先会计算a>3 结果为false 然后又计算a<4 会把两边都计算一下
a>3&& a<4 首先会计算a>3 如果结果为false的话 就不用计算a<4
|和||的区别
| 两边都参与运算
|| 当左边为true时,右边不用运算
由此可知 &&和|| 会比&和|的效率高一些
while循环和for循环的使用 从效率和内存上来讲更多使用for循环 因为当for循环使用结束时 ,int变量会自动销毁
无限循环的最简单表达式
for( ; ;) { }
break 跳出循环
w:for(Int x=0; x<3; x++) //为此循环标上名字
{
q:for(int y=0;y<x;y++)
{
system.out.println("x="+x);
break w ; //跳出w循环
}
}
break和continue必须作用在循环之内才能有用
内存概念 栈内存和堆内存
Int [] x = new int[ 3 ];
x 存储于栈内存内 栈内存也存放main函数和其他函数 其他函数使用完后退出内存
而堆内存存放new后的对象 对象用地址标示 上述表达式的 x的内容就是new对象之后的地址 0x000...
排序
Array.sort( arr );
折半查找提高了效率,但是必须要保证是有序的
进制转换最优算法
class ArrayTest7
{
public static void main(String[] args)
{
//toBin(-6);
//toHex(-60);
//toBa(60);
// System.out.println(Integer.toBinaryString(6));
// System.out.println(Integer.toHexString(6));
}
/*
十进制-->二进制
*/
public static void toBin(int num)
{
trans(num,1,1);
}
/*
十进制-->八进制
*/
public static void toBa(int num)
{
trans(num,7,3);
}
/*
十进制-->十六进制
*/
public static void toHex(int num)
{
trans(num,15,4);
}
public static void trans(int num,int base,int offset)
{
if(num==0)
{
System.out.println(0);
return ;
}
char[] chs = {'0','1','2','3'
,'4','5','6','7'
,'8','9','A','B'
,'C','D','E','F'};
char[] arr = new char[32];
int pos = arr.length;
while(num!=0)
{
int temp = num & base;
arr[--pos] = chs[temp];
num = num >>> offset;
}
for(int x=pos; x<arr.length; x++)
{
System.out.print(arr[x]);
}
return ;
}
}
arr[3][]
arr.length 二维数组的长度 即行数
arr[0] .length 二维数组中第一个一位数组的长度
私有仅仅是封装的一种表现形式
构造函数的几个特点:
1. 函数名与类名相同
2.不用定义返回值类型
3.不可以写return语句
当对象一建立,就会调用与之对应的构造函数
当一个类没有定义构造函数时,那么系统会默认给该函数定义一个空的构造函数
什么时候定义构造函数呢
当分析事物时,该事物存在具备一些特性或行为,那么将这些内容定义在构造函数中
构造代码块 //没有函数名 只有函数体的代码块
作用:给对象进行初始化
对象一建立就运行,而且优先于构造函数执行
和构造函数的区别
构造代码块是给所有对象进行统一初始化 里面是对象的共性内容 而构造函数是给对应的对象进行初始化
this所代表的对象:哪个对象调用this所在的函数 this就代表哪个对象
static 静态修饰的内容可以被对象所共享, 省去了堆内存里的内容,节约内存
static特点:
随着类的加载而加载 随着类的消失而消失 也就是说它的声明周期最长
被所有对象所共享
优先于对象所存在
可以直接被类名所调用
重载和重写
重载:只看同名函数的参数。
重写:子父类方法要一模一样,包括返回值类型。
父类和子类的属性可以一样,new一个之类对象,访问子类同名属性时用this,访问父类同名函数时用super、
在对子类初始化的时候,父类的构造函数也会进行,因为子类的构造函数里默认第一行有一条隐式的语句super();
super()会访问父类中的空参数的构造函数,而且子类中所有的构造函数第一行都有一条隐式的super():
为什么子类一定要访问父类中的构造函数。
因为父类中的数据子类可以直接获取。所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的。
所以子类在对象初始化时,要先访问一下父类中的构造函数。
如果要访问父类中指定的构造函数,可以通过手动定义super语句的方式来指定。
注意:super语句一定定义在子类构造函数的第一行。
类的修饰符 public final
成员的修饰符 public private potential
抽象类的特点:
1,抽象方法一定在抽象类中。
2,抽象方法和抽象类都必须被abstract关键字修饰。
3,抽象类不可以用new创建对象。因为调用抽象方法没意义。
4,抽象类中的抽象方法要被使用,必须由子类复写其所有的抽象方法后,建立子类对象调用。如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。
在多态中成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。
在多态中,成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)。
在多态中,静态成员函数的特点:
无论编译和运行,都参考做左边。
throw 和 throws的区别
throw为手动抛出异常 throws为声明使用异常
throws和throw的区别
throws使用在函数上。
throw使用在函数内。
throws后面跟的异常类。可以跟多个。用逗号隔开。
throw后跟的是异常对象。
Exception异常中的RuntimeException 在函数中抛出异常 可以不用在函数上声明