java编程入门1 static、this、super、final关键字

1.static关键字

static关键字用来修饰类的成员,如成员变量,成员方法及代码块,分别称为静态成员变量、静态成员方法、静态代码块。

注:在Java中规定不能将方法体内的局部变量声明为static

1.静态成员变量

静态成员变量与一般成员变量的区别

1)归属及内存分配空间不同

一般成员变量是属于对象的,即创建对象后,一般成员变量才存在,且其内存分配空间与各自的对象相关

静态成员变量是属于类的,即在装载类定义代码时,系统为静态成员变量分配独自的存储空间,所有属于这个类的对象共享这个存储空间

2)调用方法不同

一般成员对象通过创建对象调用

静态成员变量可以通过创建对象调用以及通过类调用

调用格式:类名.成员变量名; 对象名.成员变量名;

2.静态成员方法

1) 同静态成员变量,静态成员方法属于类,即在装载了类定义代码后,可通过类调用静态成员方法,当然也可以通过创建对象调用。

调用格式:类名.成员方法([实参列表]); 对象名.成员方法([实参列表]);

2)静态方法只能直接处理静态域,但可以通过创建对象处理非静态域

3)main方法为静态方法 public static void main(String[] args)

4)在Java语言对静态方法有两点规定:

1.在静态方法中不可以使用this关键字

2.在静态方法中不可以直接调用非静态方法

3.静态代码块

1)使用一对大括号括起来的若干行代码称为一个代码块,用static关键字修饰的代码块称为静态代码块

在类被加载时,会按照static块的顺序来执行每个static块,由于类只加载一次,因此静态代码块也只被执行一次。

2)在程序中。通常使用静态代码块对类的成员变量进行初始化

public class Demo1 {
    static int cnt;
    String name;
    Demo1(){
        cnt++;
    }
    void print1() {
        System.out.println("调用成员方法");
        System.out.println(cnt);
        System.out.println(name);
    }
    static void print2() {
        System.out.println("调用静态成员方法");
        System.out.println(cnt);
    }
    static void print3() {
        System.out.println("调用静态成员方法");
        Demo1 ob=new Demo1();
        ob.name="zhangshan";
        ob.print1();
    }
    static {
        System.out.println("Demo1静态代码块");
        cnt=0;
    }
}
class Test{
    public static void main(String[] args) {
        System.out.println(Demo1.cnt);
        Demo1.print3();
        Demo1 d=new Demo1();
        d.name="lisi";
        d.print1();
    }
    static {
        System.out.println("调用Test静态代码块");
    }
}

 

2.this关键字

this关键字:

1)this.a 调用成员变量

2)this.f(); 调用成员方法

3)this(); 调用本类中的构造方法

public class Demo {
    int length,width,height;
    public void Area() {
        int area=2*(this.height*this.length+this.height*this.width+this.length*this.width);
        //1.在类的方法中调用对象成员时,系统默认在对象成员前加上this,表示访问的是当前对象的成员。
        System.out.println(area);
    }
    public Demo(int length,int width,int height) {
        this.height=height;
        this.length=length;
        this.width=width;
        //2.通过this关键字可以明确访问类成员,解决与局部变量名字冲突问题
    }
    public Demo() {
        this.height=1;
        this.length=1;
        this.width=1;
    }
    public Demo(int length) {
        //3.当使用在构造方法中调用另一个构造方法时,可通过执行"this([实参1,实参2....])"来实现

        //使用"this([实参1,实参2....])"调用构造方法时,需注意以下几点
        //a."this([实参1,实参2....])"只能在构造方法中使用,且只能用于显式调用构造方法
        //b."this([实参1,实参2....])"只能放在构造函数中的第一行,且只能出现一次
        //c.不能在一个类的两个构造方法中使用this相互调用

        this();
        this.length=length;
    }
}
class Test{
    public static void main(String[] args) {
        Demo d=new Demo(5);
        d.Area();
    }
}

 

3.super关键字

super关键字

1.可通过super关键字来访问父类的成员变量,成员方法,构造方法

1) super.成员变量

2) super.成员方法([实参1,实参2...])

3) super() 父类的构造方法

2.创建子类对象时,系统自动调用父类和子类的构造方法,

调用的顺序是,首先根据构造方法调用匹配机制,在子类中找到相匹配的构造方法并调用,该构造方法可能是系统自动生成,也可能是自定义的;接着进入该构造方法体,调用父类的构造方法;然后返回执行子类构造方法的后续语句;

调用父类构造方法的机制是,如果子类构造方法中没有显示调用或显示调用语句为super(),则调用父类不带参数的构造方法;如果子类构造方法中有显示调用语句super(实参1,实参2),则根据调用匹配机制,调用相匹配的父类构造方法。

public class Demo1 {
    public Demo1(){
        System.out.println("父类的构造方法");
    }
    int a=10;
    public void f() {
        System.out.println("父类的成员方法");
    }   
}

class Demo2 extends Demo1{
    public Demo2() {
        System.out.println("子类构造方法");
    }
    public void f() {
        System.out.println(super.a);
        super.f();
    }
}
class Test {
    public static void main(String[] args) {
        Demo2 ob=new Demo2();
        ob.f();
    }
}

 

4.final关键字

final 关键字

final关键字可以修饰类,方法,和变量(包括成员变量和局部变量)

1.final关键字修饰类

final关键字修饰类表示该类不能被继承,

final类中的所有成员方法都被隐式的指定为final方法

2.final关键字修饰方法

在想明确禁止该方法在子类中被覆盖的情况下才将方法设置为final

类的private方法会隐式的被指定为final方法

3.final关键字修饰变量

对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改.

如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象

final参数问题

java参数传递采用的是值传递,对于基本类型的变量,相当于直接将变量进行了拷贝,所以即使没有final修饰的情况下,在方法内部改变了变量i的值也不会影响方法外的i。

对于引用变量,传递的是引用的值,也就是说让实参和形参同时指向了同一个对象,因此让形参重新指向另一个对象对实参并没有任何影响。

public class Test {
    public static void main(String[] args)  {
        MyClass obj=new MyClass();
        TestClass ob=new TestClass();
        obj.f(ob);
        System.out.println("main函数:"+ob.i);
    }
}
class TestClass{
    int i=0;
}
class MyClass{
    public void f(TestClass ob1) {
        ob1.i++;
        ob1=new TestClass(); //将形参ob1指向新的对象,形参改变对实参没有影响。
        System.out.println("MyClass类中:"+ob1.i);
    }
}

2018-10-15

posted @ 2018-10-14 20:37  CCSU_CBG  阅读(218)  评论(1编辑  收藏  举报