java第二课

  ■  java中的操作符

举一个移位操作符的例子:

public   class  Operation  {
public static void main(String[] args) {
int i=0xffffffff;
int c=i<<2;
System.out.println(i);
System.out.println(Integer.toHexString(c)); 
//输出c以十六进制的无符号整数形式返回一个整数参数的字符串表示形式
}

}

编译运行:

关于移位操作:

>> 带符号右移

<< 带符号左移

>>> 无符号右移

<<< 无符号左移

■  类的成员方法

如下程序:

 

class  Point  {
int x,y;
void output() {
System.out.println(x);
System.out.println(y);
}

public static void main(String[] args) {
Point pt;
pt
=new Point();
pt.x
=10;
pt.y
=20;
pt.output();
}

}

编译运行:

■  构造函数

编写不带参数的构造函数,程序如下:

 

class  Point  {
int x,y;
Point() 
{
x
=5;
y
=5;
}

void output() {
System.out.println(x);
System.out.println(y);
}

public static void main(String[] args) {
Point pt;
pt
=new Point();
pt.output();
}

}


编译运行:

编写带参数的构造函数,程序如下:

 

class  Point  {
int x,y;
Point(
int a,int b) {
x
=a;
y
=b;
}

void output() {
System.out.println(x);
System.out.println(y);
}

public static void main(String[] args) {
Point pt;
pt
=new Point(3,3);
pt.output();
}

}


编译运行:

我们对上面编译运行的java程序进行反编译,要用到javap命令:

可以从.class文件得到java源程序。

如果构造函数中,我们没有进行初始化,则系统会自动赋值,即下面程序:

class  Point {
int x,y;
Point() 
{
}

void output(){
System.out.println(x);
System.out.println(y);
}

public static void main(String[] args){
Point pt;
pt
=new Point();
pt.output();
}

}

编译运行:

■  方法重载

◎构造方法重载

程序代码如下:

 

class  Point {
int x,y;
Point() 

}

Point(
int a,int b) {
x
=a;
y
=b;
}

void output() {
System.out.println(x);
System.out.println(y);
}

public static void main(String[] args) {
Point pt;
pt
=new Point(4,4);
pt.output();
}

}

编译运行:

◎成员方法重载

程序代码如下: 

class  Point {
int x,y;
Point()
{

}

Point(
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[] args){
Point pt;
pt
=new Point(4,4);
pt.output(
12,12);
pt.output();
}

}

编译运行:

这里,程序代码中pt.output(12,12);中pr引用了成员方法output,但是程序运行并没有输出12,12。

有两种方法可以实现输出12,12:

第一种方法:

output方法中的参数不与类Point的成员变量相同,如下程序能够实现:

class  Point {
int x,y;
Point()

}

Point(
int a,int b) {
x
=a;
y
=b;
}

void output(){
System.out.println(x);
System.out.println(y);
}

void output(int x1,int y1){
this.x=x1;
this.y=y1;
}

public static void main(String[] args){
Point pt;
pt
=new Point(4,4);
pt.output(
12,12);
pt.output();
}

}

编译运行:

 

第二种方法:

使用this关键字可以实现:

class  Point {
int x,y;
Point()

}

Point(
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,y
this.x=x;      //使用this引用成员变量x
this.y=y;     //使用this引用成员变量y
}

public static void main(String[] ars){
Point pt;
pt
=new Point(4,4);
pt.output(
12,12);
pt.output();
}

}

编译运行:

我们可以利用this关键字,在不带参数的构造方法中调用带参数的构造方法,如下程序: 

class  Point {
int x,y;
Point(
int a,int b){
x
=a;
y
=b;
}

Point()
{
this(25,25); //在不带参数的构造函数中,用this调用带参数的构造函数
}

void output(){
System.out.println(x);
System.out.println(y);
}

public static void main(String[] args){
Point pt;
pt
=new Point();
pt.output();
}

}

编译运行:

当类中的成员方法声明为static的,则可以在直接用类名引用类的静态成员方法。

用static修饰的方法叫做类方法,而没有用static修饰的方法则叫做实例方法。

如下程序: 

class  Point {
int x,y;
Point(
int a,int b){
x
=a;
y
=b;
}

Point()
{
this(25,25);
}

static void output()//将output()方法定义为静态方法
System.out.println("output() called!");
}

public static void main(String[] args) {
Point.output();
}

}

编译运行:

如果我们试图在类方法(静态方法)中引用非静态的成员变量,将会出错: 

class  Point {
int x,y;
Point(
int a,int b){
x
=a;
y
=b;
}

Point()
{
this(25,25);
}

static void output(){
System.out.println(
"output() called!");
System.out.println(x); 
//打印x
System.out.println(y); //打印y
}

public static void main(String[] args){
Point.output();
}

}

编译则出错:

 

因为成员变量x,y必须在一个类的实例加载时系统才会为其分配内存空间;

而类方法则是在类加载的时候变已经分配了内存空间,所以可以直接用类名引用。

如果我们想要在类方法中引用成员变量,应该把成员变量设为静态变量,叫做类变量,然后就可以在类方法中引用: 

class  Point {
static int x,y;
Point()
{
}

static void output(){
System.out.println(
"output() called!");
System.out.println(x);
System.out.println(y);
}

public static void main(String[] args){
Point.output();
}

}

编译运行:

在非静态方法中是可以引用静态成员变量的。

静态方法和静态变量是属于类的,而不属于类的实例。

可以用类的实例调用静态方法。

 

class  Point {
static int x,y;
Point()
{
}

static void output(){
System.out.println(
"output() called!");
System.out.println(x);
System.out.println(y);
}

public static void main(String[] args){
Point.output();
Point pt1
=new Point(); //创建Point的实例pt1
Point pt2=new Point(); //创建Point的实例pt2

pt1.x
=100//pt1引用静态成员变量x,并赋值
pt2.x=200//pt2引用静态成员变量x,并赋值

System.out.println(pt1.x);
System.out.println(pt2.x);
}

}

编译运行:

可见,静态成员变量在内存中只有一份拷贝,静态成员变量是属于类本身的。

■  final修饰符

用final修饰成员变量,即为类的常量。必须赋值: 

class  Point {
int x,y;
final double PI=3.1415926;;
Point()
{
}

Point(
int a,int b){
x
=a;
y
=b;
}

public static void main(String[] args){
Point pt
=new Point();
System.out.println(pt.PI);
}

}

编译运行:

对于常量也可以在类的构造函数中赋值: 

class  Point {
int x,y;
final double PI;
Point()
{
PI
=3.1415926;
}

Point(
int a,int b){
PI
=3.1415926;
x
=a;
y
=b;
}

public static void main(String[] args){
Point pt
=new Point();
System.out.println(pt.PI);
}

}

编译运行:

定义常量,通常用大写!

当把一个常量定义为一个静态常量时,必须对其初始化:

在构造函数中为静态常量赋值,编译会出错,因为静态常量是属于类本身的。

■  关于this

使用this时,这个语句必须是构造函数中的第一个语句,这点千万要注意: 

class  Point {
int x,y;
final double PI;
Point(
int a,int b){
PI
=3.1415926;
x
=a;
y
=b;
}

Point()
{
PI
=3.1415926;
this(1,1); //this调用带参数的构造函数
}

public static void main(String[] args){
Point pt
=new Point();
System.out.println(pt.PI);
}

}

编译会出错:

可以把不带参数的构造方法中的PI=3.1415926;去掉即可成功地编译运行。

■  关于继承

java中只能是单继承,而不能是多继承。

如下关于继承的示例程序代码: 

class  Animal {
int height,weight;
void eat(){
System.out.println(
"Animal eat");
}

void sleep(){
System.out.println(
"Animal sleep");
}

void breathe(){
System.out.println(
"Animal breathe");
}

}


class  Fish  extends  Animal {
}


class  Integration {
public static void main(String[] args){
Animal an
=new Animal();
Fish fh
=new Fish();

an.breathe();
fh.height
=33;
fh.breathe();
}

}


编译运行: 

注意:上例程序中定义了三个类,我们编译时生成三个类文件,但是只有Integration类包含主函数,所以运行加载的是Integration类。

■  方法的覆盖

方法的覆盖是针对基类与派生类而言的,而在同一个类中称为方法的重载。

class  Animal {
int height,weight;
void eat(){
System.out.println(
"Animal eat");
}

void sleep(){
System.out.println(
"Animal sleep");
}

void breathe(){
System.out.println(
"Animal breathe");
}

}

class  Fish  extends  Animal {
void breathe()//重写breathe方法
System.out.println("Fish bubble");
}

}

class  Integration {
public static void main(String[] args){
Animal an
=new Animal();
Fish fh
=new Fish();
an.breathe();
fh.height
=33;
fh.breathe();
}

}


编译运行: 

■  关于super

可以用super调用父类的方法:

class  Animal {
int height,weight;
void eat(){
System.out.println(
"Animal eat");
}

void sleep(){
System.out.println(
"Animal sleep");
}

void breathe(){
System.out.println(
"Animal breathe");
}

}

class  Fish  extends  Animal {
void breathe(){
int height;
super.breathe();
super.height=40;
System.out.println(
"Fish bubble");
}

}

class  Integration {
public static void main(String[] args){
Animal an
=new Animal();
Fish fh
=new Fish();
an.breathe();
fh.breathe();
System.out.println(
"an.height:"+an.height);
System.out.println(
"fh.height:"+fh.height);
}

}


编译运行:

如果父类中没有不带参数的构造函数,而子类中不带参数的构造函数进行重写了,编译会出错: 

class  Animal {
int height,weight;
Animal(
int height,int weight) {
System.out.println(
"Animal construct!");
}

void eat(){
System.out.println(
"Animal eat");
}

void sleep(){
System.out.println(
"Animal sleep");
}

void breathe(){
System.out.println(
"Animal breathe");
}

}

class  Fish  extends  Animal {
Fish()
{
System.out.println(
"Fish construct!");
}

void breathe(){
int height;
super.breathe();
super.height=40;
System.out.println(
"Fish bubble");
}

}

class  Integration {
public static void main(String[] args){
Animal an
=new Animal();
Fish fh
=new Fish();
an.breathe();
fh.breathe();
System.out.println(
"an.height:"+an.height);
System.out.println(
"fh.height:"+fh.height);
}

}


编译出错:

如果想要按照我们的想法成功运行该程序,需要在子类不带参数方法中用super调用父类带参数的构造函数,并传递实参: 

class  Animal {
int height,weight;
Animal(
int height,int weight){
System.out.println(
"Animal construct!");
}

void eat(){
System.out.println(
"Animal eat");
}

void sleep(){
System.out.println(
"Animal sleep");
}

void breathe(){
System.out.println(
"Animal breathe");
}

}

class  Fish  extends  Animal {
Fish()
{
super(22,44); //用super调用父类带参数的构造函数,并传递实参
System.out.println("Fish construct!");
}

void breathe(){
int height;
super.breathe();
super.height=40;
System.out.println(
"Fish bubble");
}

}

class  Integration {
public static void main(String[] args){
Fish fh
=new Fish();
fh.breathe();
System.out.println(
"fh.height:"+fh.height);
}

}


编译运行:

注意:上面只能用super(22,44);而不能用Animal(22,44);来显式调用!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值