原码,反码和补码:
原码:最高位为0表示正数,为1表示负数。例:-7表示为:10000111
反码:如果一个数为正,那么它的原码与反码相同。如果为负,符号位为1,其余各位取反即可。
补码:如果一个数为正,则原码,反码,补码相同。如果为负,则符号位为1,然后其余位对原码取反,然后整个数加1. 也就是对该数的反码加1 即可。但是一个字节只有8位,超过8位就进1,但是内存这时就溢出了,也就是新进位的1被丢弃。
Eg:-0原码:10000000 -0补码:11111111 所以-0的补码为11111111+1=1 00000000
但是进位1被丢弃,所以结果为00000000.
二进制运算符:(这些运算符是针对二进制才使用的)
按位与 &
按位或 |
按位异或 ^ 两二进制不同时就为1,都为一或都为0时结果为0
按位取反 ~ 它是一元运算符,0变1,1变0
移位运算符:
Java中提供了3中移位运算符:
左移 <<
带符号右移 >>
无符号右移 >>>
构造方法:
如果你没有给定义的类定义构造函数,java会自动添加一个默认的构造函数,并且这时构造函数要对成员变量赋一个初始值。例如:
数值型就赋值为0
布尔型就赋值为flase
Char型就赋值为’/0’
对象就赋值为null
定义了一个类之后必须要通过new关键字生成一个类对象才能使用。
New关键字作用:
1 为对象分配内存空间
2 引起对象构造方法的调用
3 为对象返回一个引用
方法重载overload:
构造函数可以有个无参数的,也可以再加一个有参数的构造函数,两个构造函数都能使用。这种叫方法重载:方法的名称相同,但是参数类型不同或者参数的个数不同。
看看下面这个输出结果是多少呢:
class Point110
{
int x,y;
Point110(int a,int b)
{
x=a;
y=b;
}
void output()
{
System.out.println(x);
System.out.println(y);
}
void output(int x,int y)
{
x=x;
y=y;
}
public static void main(String[] arg)
{
Point110 pt;
pt=new Point110(23,56);
pt.output(4,4);
pt.output();
}
}
结果为23 56哦。
因为在void output(int x,int y)中,成员x,y变量被此出方法内的参数x,y所覆盖了,相当于:4=4,4=4。如果你想在这里对成员变量进行赋值怎么办呢???可以将此方法参数该为不同于x,y的变量名就可以了。还有中方法就是使用this关键字:
void output(int x,int y)
{
this.x=x;
this.y=y;
}
这时输出的结果就为4 4 了哈。其实这里的this就是指Point110,但是把this直接换成Point110就不行哦。
关键字static:
1 用了此关键字,则静态变量和静态方法属于类,而不是类的某个实例了。
2 静态方法和静态变量可以直接通过类名访问
3 在静态方法中不能调用非静态的方法和引用非静态的成员变量,反之则可以
4 可以用类的对象调用静态方法
Final关键字:
她是用于声明常量用的,即是在程序运行过程中常量的值是不能被改变的,因此一般情况下都建议在定义常量时就给她赋好值,例如:final double PI = 3.1415926.但是常量定义时也可以不用先赋值,但是在程序运行中又不能对常量进行赋值或其他更改操作,怎么办呢。常量是可以在构造函数中赋值的,知道怎么办了吧
class Point110
{
int x,y;
final double PI;
Point110(int a,int b)
{
PI = 3.1415926;
x=a;
y=b;
}
Point110()
{
//PI = 3.1415927; 注意这里的注释哦,如果要想她起作用的话必须放在this(7,8);
this(7,8); //之后哦,因为构造函数中这种this调用必须放在构造函数的第一行
}
void output()
{
System.out.println(x);
System.out.println(y);
System.out.println(PI);
}
void output(int x,int y)
{
this.x=x;
this.y=y;
}
public static void main(String[] arg)
{
Point110 pt=new Point110();
pt.output();
}
}
常量定义一般约定大写,为了节约内存,一般也把常量定义为static,常量可以在定义时赋值也可以在构造函数中赋值。
extends关键字 类的继承(面向对象之一)
但是java中不允许多继承,当继承时如果子类需要更改父类某些方法的功能时,子类可以重写父类方法,但是方法名,参数类型,返回类型,和参数个数都要相同才行哦。
之前我们说的方法重载是同一个类中,这里的方法重写是发生在父类和子类之间的。当子类覆盖了父类方法,子类要是又想调用父类的那个方法该怎么调用呢,用super关键字就可以了。
同样,如果子类定义了与父类相同的变量,那么父类的变量也自然就被隐藏了,如果要访问父类的变量同样使用super就可以了。
每个子类构造函数第一条语句都隐含调用super(),如果父类没有这种形式的构造函数,编译时就会报错。因此父类必须要显式地申明相应的构造函数,如果父类只有带参数的构造函数,那么在子类也就要使用super(参数)这种形式来调用。
之所以这么使用是因为构造函数是不能被子类继承的,所以子类必须得使用super调用父类构造函数,而父类也因此必须得有相应构造函数才行。
class animal
{
int height,weight;
animal(int height,int weight)
{
System.outprintln("animal construct");
}
void eat()
{
System.outprintln("animal eat");
}
void breathe()
{
System.outprintln("animal breathe");
}
}
class fish extends animal
{
int height;
fish()
{
super(6,7);
System.outprintln("fish construct");
}
}
多态:
在有子类和父类情况下,通过覆盖父类的方法实现。在运行时,如果传递的是父类引用就使用父类的方法,如果传递的是子类的引用,就使用子类的方法。如果传递的是子类引用,其实程序就是现在子类找相匹配的方法,如果子类没有相匹配的方法就再在父类中查找,这就是多态。
Instanceof操作符:判断一个实例是否是某个对象的实例。
Fish fs = new Fish();
if (fs instanceof fish)
{
System.out.printlin(“yes”);
}
Animal an = new Animal();
Fs instanceof Animal结果为真哦 但是an instanceof Fish结果就为假了哈
如果:an = fs,然后an instanceof Fish 结果还是为真
一个用面向对象思想计算长方形周长和面积的程序:
class Rectangle
{
int w,h;
void area()
{
System.out.println("area= "+w*h);
}
void perimeter()
{
System.out.println("perimeter= "+2*(w+h));
}
public static void main(String []arg)
{
Rectangle rec = new Rectangle();
rec.w=2;
rec.h=7;
rec.area();
rec.perimeter();
}
}