抽象、静的、最終的理解
A.抽象抽象
1>変更されたクラス
クラスは抽象修正された後、新しい、変更された親を対象とすることはできません
- 抽象修正記述は、特定の種類、カテゴリはありませんが、親はコンクリートではありません
- 説明このクラスは完全ではない、特定の十分ではありません、抽象クラスはできません独立して存在します
サブクラスの共通出力
作用:
1> 可以被子类继承,提供共性属性和方法
2> 可声明为引用,强制使用多态
3> 抽象父类可以是子类的组成部分,依附于子类对象的存在
4> 由父类共性+子类独有组成完整的子类对象
5> 抽象类也是有构造方法的,可以由子类来调用,构建子类对象时调用父类构造方法
6> 和普通类的区别,就是不能new,其他和普通的类都一样
2>修飾法
抽象メソッド:唯一のステートメントは、不完全で、実現しませんでした
- メソッドの必要な宣言が、発行リアライズすると親クラスの実装はサブクラスのニーズを満たすことができない、サブクラスが最終的に書き換えることになるため、冗長です
- メソッドを含む抽象クラスは、抽象クラス必見です
- 抽象クラス抽象メソッドは必ずしもありません
サブクラスは、親クラスのすべての抽象メソッドをオーバーライドする必要があります
//如果父类是个抽象
//那么子类必须重写父类的所有的抽象方法
//抽象类中不一定有抽象方法
abstract class Animal{//含有不完整的方法,那么这个类也是不完整的
String bread;
int age;
public Animal(){
System.out.println("这是抽象类的无参构造函数..");
}
//这是一个抽象方法
//含有抽象方法的类必须是个抽象类
public abstract void eat();//只有声明,没有实现,意为不完整
//还可以拥有普通的方法
public void slep(){};
}
//一个抽象类的子类
class Dog extends Animal{
//必须重写父类所有的抽象方法
public void eat(){
}
}
//子类不想实现父类的抽象方法
//那么这个类也必须是个抽象类
//同时继承父类所有的未实现的抽象方法
abstract class Cat extends Animal{
}
二つ。静的静的
処理領域では、情報は、クラスオブジェクトMyClassの、MyClass.classに格納されるときにクラスがロードされます。
あなたがオブジェクトを作成するときに通常のインスタンス変数は、メモリ内のオブジェクトを作成しています
静的メソッドは、クラスがロードされたときにメモリ内のオブジェクトを作成することです
静的メソッドは、静的メンバへの直接アクセスを可能にします
静的メソッドはできません直接アクセス非静的メンバ
静的メソッドは、このスーパーのキーワードを許可していません。
静的メソッドは継承されないことができ、書き換えができない、何の多型
- それは彼が書き換えカバーサブクラスがあるかどうかを判断することができないため、動的実行時に実行が、明確されています
- 静的メソッドを実行する必要はありません場合は、コンパイル時に知ることができます。不変ランタイム
コールJavaメソッドは、2つに分割されています
1>静的な割り当て:静的メソッド、同じ名前のパラメータリストは、さまざまな方法を可能にする、静的な方法は、間のリロードを指し
2>動的割り当て:継承関係の場合には、インスタンスメソッドが呼び出され、ローから最大(最初のサブカテゴリーを確認し、親クラスを見つけ、見つけるまでであった)方法の利用可能なバージョンを見つけ、カバーのインスタンスメソッドを指し
JVMメソッドの呼び出し命令:
1> invokespacialコールプライベートメソッドとコンストラクタ
2> invokeintefaceコールインターフェース方法
3> invokestatic呼び出し静的メソッド
4> INVOKEVIRTUAL仮想メソッド呼び出し(親クラス定義、キルトは、将来の方法をカバー)
5> invokedynamicのダイナミックリンクメソッドを呼び出します
public class TestStatic{ public static void main(String[] args){ A.staticMethod(); B.staticMethod();//继承了父类的静态方法,但是不能重写,所以不存在多态 A a = new B(); //也是可以掉调用的,即使在子类中也有一个同样的静态方法 //下面的方法调用的依然是父类中的静态方法 //因为静态方法不能被覆盖 a.staticMethod(); } } class A{ static int find; public static void staticMethod(){ System.out.println("----" + find); } } class B extends A{ //假如B中也存在一个,也是不行的,不能覆盖 public static void staticMethod(){ System.out.println("----" + find); } }
1>静的プロパティ(クラス属性)
静的クラスのメンバは、すべての共有オブジェクトのフルメンバーであります
唯一の理由は、クラス全体の複数のコピーを生成するために複数のオブジェクトを作成しません
代わりに、オブジェクトを作成するのではなく、直接クラス名によってアクセスすることができます
A。一般的なプロパティ
public class TestStatic{
public static void main(String[] args){
MyClass mc1 = new MyClass();
m1.a = 10;
//每个对象都拥有自己单独的a
//每个对象都在堆中用一个自己的a空间,指向栈中的mc2引用
MyClass mc2 = new MyClass();
m2.a = 20;
System.out.println(m1.a + "--" + m2.a);//输出结果: 10 -- 20
}
}
class MyClass{
//每个对象都持有一例
int a; //实例属性
}
B。静的プロパティ
public class TestStatic{
public static void main(String[] args){
//m1.b和m2.b访问的都是方法区中的b,是同一个
//每个类的实例都是使用的这一个b
MyClass mc1 = new MyClass();
MyClass mc2 = new MyClass();
m1.a = 10;
m2.a = 20;
m1.b = 100;
m2.b = 202;//覆盖了前面的m1赋值的100//自动转换 m2.b --> MyClass.b
//不用通过对象名访问静态属性
//直接使用类名访问
MyClass.b = 200;
System.out.println(m1.a + "--" + m2.a);//输出结果: 10 -- 20
System.out.println(m1.b + "--" + m2.b);//输出结果: 200 -- 200
}
}
class MyClass{
//实例属性
int a;
//在这个类加载的时候,这个static属性就放到方法区了\
//整个类的共享的.只有单独的一份
static int b; //静态属性
}
2>静的メソッド
class Student{
//静态方法
//类的所有对象公用
public static void method(){
}
public void fan(){
//同一个类的其他方法使用本类的静态方法,直接使用方法名
method();
}
}
class Test{
public static void main(String[] args){
//类外使用静态方法
//类名.方法名
Student.method();
}
}
3>静的な高度なアプリケーション
1 - クラスローディング
クラスのJVM最初の使用は、CLASSPATHによってクラスを使用する必要があるの.classファイルを見つける必要がある場合には
クラスの.classファイルのファイル記述情報がメモリにロードされ、(例えば:情報等のパッケージ名、クラス名、プロパティ、メソッド、コンストラクタなど)を保存します
- ロード時間
- オブジェクトを作成します。
- サブクラスのオブジェクトを作成します。
- 静的プロパティへのアクセス
- 静的メソッドを呼び出します
- Class.forNameの(「完全修飾名」):(アクティブロードクラスが、)メモリにロードされた戻り値を、受信しませんが、現在使用されていません
class TestClassLoaded{
public static void main(String[] args){
new Super();//首次用到,创建了一个类的对象,就需要加载这个类
Super.sMethod();//或者这个类中有静态方法,那么在首次调用这个静态方法的时候,也会加载这个类
Super.sname;//同上
Sub.sMethod();//调用父类的静态方法,首次使用也会加载super类,
}
}
class Super{
String name;
static String sname;//静态属性
//静态方法
public static void sMethod(
{
}
}
class Sub extends Super{
}
2-静的コードブロック
- コードの静的ブロックは、クラストリガ(一度だけ)によってロードされます
- これは、静的プロパティの割り当て、または必要な初期行動かもしれ
- まず、静的特性及び静荷重及び実行するコードブロック
- 再び共通の属性と動的コードブロックと工法をロード
public class Test{
public static void main(String[] args){
//静态代码块是由类加载触发的
new MyClass;
System.out.print(MyClass.sname);//这两个都会执行静态代码块
}
}
class MyClass{
//静态属性
static int sname = 88;
int name = 99;
//静态代码块
static{
System.out.print("这诗集静态代码块中得到输出");
//使用了静态的属性
//执行静态代码块和静态属性的时候,根据书写顺序加载
//如这里使用了sname静态属性,那么这个属性必须定义到静态代码块前面
System.out.print(sname);
}
MyClass{
System.out.print("类中音译的属性值为: " + name);
System.out.print("这是构造方法中得到输出");
}
public void m1(){
int a = 10;
}
}
様々なモジュール間3-実行順序
package com.huqi.demo1;
public class TestLoadSort{
public static void main(String[] args) throws Exception{
//new Super();
new Sub();//创建一个子类的对象,查看加载各个属性和代码块的顺序
//主动加载一个类,只执行静态代码的部分
Class.forName("com.huqi.demo1.Sub");//里面的必须带包名
/*
如果只执行这一行代码,则会输出下面的语句,这个是类级别的,从这里下面的代码都是对象级别的
这是父类的静态方法---
这是父类的静态代码块---
这是子类的静态方法---
是子类的静态代码块---
*/
}
}
class Super{
static String staticField = "这是父类的静态方法---";
static{
System.out.println(staticField);
System.out.println("这是父类的静态代码块---");
}
String instanceField = "这是父类的成员属性---";
{
System.out.println(instanceField);
System.out.println("这是父类的动态代码块---");
}
public Super(){
System.out.println("这是父类的构造方法---");
}
}
class Sub extends Super{
static String staticField2 = "这是子类的静态方法---";
static{
System.out.println(staticField2);
System.out.println("这是子类的静态代码块---");
}
String instanceField2 = "这是子类的成员属性---";
{
System.out.println(instanceField2);
System.out.println("这是子类的动态代码块---");
}
public Sub(){
System.out.println("这是子类的构造方法---");
}
}
当new Sub时的结果
这是父类的静态方法---
这是父类的静态代码块---
这是子类的静态方法---
这是子类的静态代码块--- //从这里分割,前面的是类几级别的,类加载时运行,后面的都是创建对象时执行
这是父类的成员属性---
这是父类的动态代码块---
这是父类的构造方法---
这是子类的成员属性---
这是子类的动态代码块---
这是子类的构造方法---
当new Super时的结果:
这是父类的静态方法---
这是父类的静态代码块---
这是父类的成员属性---
这是父类的动态代码块---
这是父类的构造方法---
三.final
- 最終修正クラス:このクラスは継承できません
- 最終修正方法:このメソッドをオーバーライドすることはできません
- 変数の最終的な修正:この変数の値を変更することができない(何も初期値は一度だけ割り当てられていないことを可能にします。)
- ローカル変数:ディスプレイの初期化
- 変数の例:初期表示、動的コードブロックコンストラクタ
- 静的定数:ディスプレイの初期化、静的コードブロック
- 一定の基本データ型:値が変更されていません
- アプリケーションのデータ・タイプ定数:不変住所
1> finalクラス
- 最終修正クラス:このクラスは継承できません。
- String.math.Systemは、最終的な修正クラスは継承できませんされています
- 最終修正方法をオーバーライドすることはできません
public class testFinal{
}
//final不能和abstract一起使用,是冲突的两个
final class Super{
}
//发生错误,不能继承被final修饰的类
final Sub extends Super{
}
2> final変数
最終的に修正される変数は、それが一定になります
- 最終修正プロパティでデフォルト値はありません
値は一度しか割り当てることができます
public class testFinal{
main(){
//用final修饰的是常量
//先赋值再使用
final double PI = 3.1415;
}
}
//final不能和abstract一起使用,是冲突的两个
final class Super{
//没有默认值,必须要初始化
//在对象初始化完成之前完成初始化的操作
final int field = 10;
final int FIELD;
public Super(){
//对常量进行初始化
FIELD = 20;
}
//静态常量
final static void STATIC_FIELD = 20;
static{
//可以给STATIC_FIELD赋值
//STATIC_FIELD = 20;
}
}