、この
3つの主要なアプリケーションがあります。
これはクラスのメンバ変数であるプロパティのこのクラスを呼び出します。
他の方法は、このクラスを呼び出します。
この呼び出し他のコンストラクタは、呼び出し時に、コンストラクタの最初の行を置くために、このクラスのオブジェクトを初期化します。
参考メンバ変数
Public Class Student {
String name; //定义一个成员变量name
private void SetName(String name) { //定义一个参数(局部变量)name
this.name=name; //将局部变量的值传递给成员变量
}
}
メンバ変数やメソッドは、この現在のオブジェクトを表すキーワードです。このため、上記のコードのために、後者は、仮パラメータのメソッドの名前であるが、コードは、の形式で渡されたパラメータ値のthis.name =名で、また、オブジェクトの属性を既知this.nameオブジェクトのメンバ変数を、表現されメンバ変数へ。これは、このコードの特定の意味を超えています。
オブジェクトを初期化するメソッドの名前は、このクラスの他のコンストラクタを呼び出すことと同等であるとして、それはコンストラクタの最初の文でなければなりません。
例としては、次のとおりです
public class Demo{
public String name;
public int age;
public Demo(){
this("微学苑", 3);
}
public Demo(String name, int age){
this.name = name;
this.age = age;
}
public void say(){
System.out.println("网站的名字是" + name + ",已经成立了" + age + "年");
}
public static void main(String[] args) {
Demo obj = new Demo();
obj.say();
}
}
それは注目に値します。
コンストラクタコール他の構成方法において、動作は、第1行目に呼び出さなければなりません。
あなたは、コンストラクタ以外の方法では、コンストラクタを呼び出すことはできません。
唯一のコンストラクタコンストラクタメソッド呼び出し内。
オブジェクトの値を返します。
このキーワードは、参照変数またはメンバーの方法に加えて、重要な役割は、クラスへの復帰への参照です。学生という名前のクラスとして、使用することができるリターンこの、クラスへの参照を返します。この時点で、キーワードは、このクラスの名前を表します。学生のクラスとしては、代表者が学生を返すことを意味しています。しかし、これは、このキーワード可変基準方法またはメンバーに加えても、戻り値クラスとしてであってもよいです。
最後の二、
三つの特徴があります修正、最終的なもの
- 変更され、最終的なクラスは継承できません
- 修飾された最終的な方法は、オーバーライドできません
- 修飾された最後のメンバ変数が再割り当てまたは変更することができない、それは一度だけ割り当てられることができます。この時点では、一定の変数になります
final修饰局部变量
修饰基本类型时,基本类型的值不能发生改变
修饰引用类型时,引用类型的地址值不能发生改变,但是,该对象堆内存的值是可以改变的
class Student {
int age = 10;
}
class FinalTest {
public static void main(String[] args) {
//局部变量是基本数据类型
int x = 10;
x = 100;
System.out.println(x);
final int y = 10;
//这里会报错,无法为最终变量y分配值
//y = 100;
System.out.println(y);
System.out.println("--------------");
//局部变量是引用数据类型
Student s = new Student();
System.out.println(s.age);
s.age = 100;
System.out.println(s.age);
System.out.println("--------------");
final Student ss = new Student();
System.out.println(ss.age);
ss.age = 100;
//这里不会报错,因为final修饰的是引用类型 代表student的地址不可被修改 而该对象堆内存的值是 可以被修改的
System.out.println(ss.age);
//重新分配内存空间
//无法为最终变量ss分配值
ss = new Student(); //这里是错误的
}
}
三、スーパー
总结一下super的用法:
第一、在子类构造方法中要调用父类的构造方法,用“super(参数列表)”的方式调用,如果该构造方法是无参的,super里面可以不带参数,如果构造方法
是带参构造,那么super里面也需要有对应的参数。同时还要注意的一点是:“super(参数列表)”这条语句只能用在子类构造方法体中的第一行。
第二、当子类方法中的局部变量或者子类的成员变量与父类成员变量同名时,也就是子类局部变量覆盖父类成员变量时,用“super.成员变量名”来引用
父类成员变量。当然,如果父类的成员变量没有被覆盖,也可以用“super.成员变量名”来引用父类成员变量,不过这是不必要的。
第三、当子类的成员方法覆盖了父类的成员方法时,也就是子类和父类有完全相同的方法定义(但方法体可以不同),此时,用“super.方法名(参数列
表)”的方式访问父类的方法。
class father {
int a= 60;
public father () {
System.out.println("父类无参构造");
}
public father(String name) {
System.out.println("父类带参构造");
}
public void method() {
System.out.println("父类方法1");
}
public void abs() {
System.out.println("没有被重写的父类方法");
}
}
class son extends father {
int a= 10;
public son() {
super();//调用父类的无参构造方法
System.out.println("子类无参构造");
}
public son(String name) {
super (name);//调用父类的带参构造
System.out.println("子类带参构造");
}
public void method() {
super.method();//访问父类成员方法
System.out.println("子类方法1");
System.out.println(super.a);//访问父类成员变量60
System.out.println(a);//子类的成员变量10
super.abs();//实例说明可以用super调用没被子类覆盖重写的父类方法,但是这是没有必要的
//因为可以通过对象名.父类方法名来调用
}
}
public class DEMO {
public static void main(String[] args) {
son s = new son();//
s.method();//调用子类的method
son s2 = new son("aaa");//super的有参调用,这里会初始化有参构造方法
}
}
出力:
输出
父类无参构造
子类无参构造
父类方法1
子类方法1
60
10
没有被重写的父类方法
父类带参构造
子类带参构造
四、静的
4.1静的プロパティ
静的メンバ変数と、そのクラスの任意のオブジェクトの独立したメンバメソッド変更されました。つまり、それは、クラスの特定の例には、クラスのシェアのすべてのインスタンスに依存しません。長いクラスがロードされると、Java仮想マシンは、ランタイムデータ領域でエリアクラス名を指定した方法に従って、それらを見つけることができるようになります。したがって、静的オブジェクトは、それは要するに、簡単にオブジェクトダウンを作成していない場合のコール(メソッド/変数)を作るために、静的の基本的な役割である、任意の右側を参照することなく、任意のオブジェクトの作成にアクセスする前に、明らかに、ありますstaticキーワード修正方法や変数は、静的メソッドやクラス名。メソッド名やカテゴリを通じて直接変数を、クラスがロードされている限り、あなたはクラス名を介してアクセス行くことができ、アクセスされるオブジェクトに依存する必要が変更されていません変数名に名前を付け、例えば、
package hello;
class demo{
static String str1 = "hello";
private String str2 = "world";
public void aaa(){
System.out.println(str1);
System.out.println(str2);
}
public static void bbb() {
System.out.println(str1);
}
}
public class Static {
public static void main(String[] args) {
demo s = new demo();
s.aaa();
demo.bbb;//在这里被static修饰的方法名和变量可以直接通过类名.方法名或变量名调用
System.out.println(demo.str1);
}
}
静的メソッド
静的メソッドは、一般的に任意のオブジェクトに依存しない静的メソッドにアクセスすることができますので、そのため、静的メソッドは、これを使用し、スーパー、それは任意のオブジェクトに添付されていないため、ノーオブジェクトので、することができない、静的メソッドとして知られている、あなたは話をしませんこの上。そして、この機能により、非静的メンバ変数やメソッド静的メソッドでアクセス非静的メンバクラスができない、非静的メンバメソッド/変数は、特定のオブジェクトに依存しているため、呼び出すことができなければなりません。
それは、アクセス非静的メンバ・メソッドと静的メソッドで非静的メンバ変数が、この方法は、プロセス内の静的メンバ/非静的メンバ変数にアクセスすることができることはできないものの、それに注意すること。
例えば
線12と線13(エラーBBBの静的メソッドの原因である)(非静的および非静的変数STR2変数AAAにアクセスするため)、8行目のAAA非静的メソッドのように、静的変数は自由にアクセスすることができると静的メソッド
あなたが言及することができ、その理由修正使用静的メソッドへの主な理由は、mainメソッドの実装に任意のオブジェクトを作成することはありませんが、それは唯一のクラス名で呼び出すことができるので、静的な変更を使用する
一切の表示がない場合でも、またことに注意してくださいコンストラクタは、クラス、実際に静的メソッド、staticとして宣言しました
4.3静的変数
修飾された静的メンバ変数:静的メンバ変数、また、クラスが変更静的メンバ変数をロードされた修飾クラス変数またはグローバル変数として知られているがあれば、クラスが存在するように、クラスに関連付けられ、初期化され、静的変数が存在します。単一のストレージ・スペースを分割する静的変数は、特定のオブジェクトに関連付けられていない、メモリ空間の各オブジェクトクラスが共有されています。それはコピーは静的変数ではなく、クラスオブジェクトのすべてのインスタンスが同じ静的変数を共有すること、オブジェクトが宣言されたときに、あります。修正静的メンバ変数は、多くのオブジェクトが作成されているかに関係なく、変更され、静的変数は専用メモリを占めていること、任意のオブジェクトを参照することなく、オブジェクトのインスタンスを作成する前にアクセスすることができます。
4.4静的ブロック
staticキーワードは、アプリケーションのパフォーマンスを最適化するために、コードの静的ブロックを形成するための、より重要な役割があります。静的ブロックは、クラス内の任意の場所に配置することができる、クラスは、静的な複数のブロックを有していてもよいです。クラスが最初にロードされるとき、静的ブロックの各々は一度だけ静的ブロックの順序で行われてもよいです。
コードのロードされたときに最初のクラスでは、静的コード・ブロックがロード後に実行される、ということに留意されたいもはや静的ブロックしない
試料
package hello;
class demo{
static String str1 = "hello";
private String str2 = "world";
public demo(){
System.out.println(str2);
}
static {
System.out.println("这是static代码块");
}
public void aaa(){
System.out.println(str1);
}
static {
System.out.println("这是第二个静态代码块");
}
public static void bbb(int name) {
System.out.println(str1);
}
}
public class Static {
public static void main(String[] args) {
demo s = new demo();//demo类第一次被加载所以执行静态代码块
demo.bbb(2);
demo q = new demo();//在这里demo类第二次被加载了 所以不再执行静态代码块
q.aaa();
}
}
出力
这是static代码块
这是第二个静态代码块
world
hello
world
hello
因为静态代码块只在第一次类加载中执行,所以在以后的类加载中就不再执行静态代码块了, 因此,很多时候会将一些只需要进行一次的初始化操作都放在static代码块中进行。
メンバ変数が行うこのアクセス静的を通じて?次の例を見てください
package hello;
class demo{
static int a = 33;
public void printValue(){
int a = 3;
System.out.println("这是this.a:"+this.a);
System.out.println("这是a:"+a);
}
public class Static {
public static void main(String[] args) {
demo s = new demo();
s.printValue();
}
}
出力は、
这是this.a:33
这是a:3
この静的な主要な遠征があります理解しています。この何を意味しますか?これは新しい言葉で、現在のオブジェクトが新しいデモオブジェクトによって生成されたprintValueを呼び出すために、現在のオブジェクトを表します。静的変数は、オブジェクトによって享受されるので、疑い33にprintValueにおける値this.a。printValueメソッド内の値は、これは不可能であるので、出力は33であると関連する、ローカル変数です。ここでは、常に一つのことを覚えている:オブジェクトの独立したものの、静的メンバ変数をではなく、オブジェクトを介してアクセスすることを意味するものではありません、すべての静的メソッドと静的変数は、(十分にアクセスできる限り)オブジェクトを介してアクセスすることができます。