静的
私たちは実際には、プロパティとそのオブジェクトの動作の説明では、クラスを作成し、対象物が実質的な生産しなかった場合はキーワードのみを行うことで、新しいオブジェクトを生成し、その後、システムは、オブジェクトのためのメモリ空間を割り当てます、そのこの方法は、外部コールにのみ使用することができます。時には、我々は関係なく、ケースをしたいオブジェクトまたはオブジェクトとメモリ空間の多くの特定のデータは、例えば、すべての中国の人々は国家の名前を持っている唯一の、すべての中国の人がこれを共有どんなにかどうか国の名前は、別途国の変数名に、オブジェクトのすべての中国の人々の代表インスタンスに割り当てられている必要はありません。
インスタンス変数の値のクラスに属する各インスタンス変数の具体例としては、インスタンスごとに異なり、クラス変数は、クラスにクラスシェアのすべてのインスタンス同じクラス変数に属します。同様のクラスメソッド。
- 用途:プロパティ、メソッド、コードブロック、内部クラス
- 特長:
- クラスの負荷と負荷で
- オブジェクトが存在しているよりも優先されます
- 変更されたメンバーは、オブジェクトのすべてのインスタンスで共有されています
- アクセスが可能な場合は、直接オブジェクトクラスの呼び出しのインスタンスを作成しません
静的変数のメモリ決意
静的メソッド
- では
static
、プロセス、クラスのみアクセスすることができますstatic
修正プロパティやメソッドを、非アクセスすることができないstatic
構造を、あなたは持っていないことができthis
、super
参照のように static
メソッドをオーバーライドすることはできません
演習:デザインクラス、あなたは自動的にアカウントを生成することができます。
private static int num = 0;//设置一个静态初始值作为生成账号的数字
public int setNum(){
num++;
return num;
}
シングルトン
- 空腹中国風:氏の静的インスタンスとして、呼ばれるのを待っています
class Singleton{
private Singleton(){} //私有化构造器,以防被调用
//内部要创建一个静态实例供调用
private static Singleton singleton = new Singleton();
//提供公共的静态方法,返回当前类对象,供外部使用。为什么这个还要静态的?我猜测是以防被重写。
//毕竟单例模式只向外提供调用实例的借口,不想被操作
public static Singleton getInstance(){
return singleton;
}
}
- レイジータイプ:時間まで待つには、再生成静的インスタンスと呼ばれています
class Singleton{
private Singleton(){} //私有化构造器
//提供静态实例
private static Singleton singleton;
//提供调用接口
public static Singleton getInstance(){
if (singleton == null){ //先检查是否有实例
singleton = new Singleton();//没有就创建
}
return singleton;//有就返回
}
}
- シングルトン利点:オブジェクトを生成することは、他のオブジェクトの依存性生産は、単一の直接アプリケーション起動によって製造することができる場合、このような構成を読み取るように、より多くのリソースを必要とする場合、システムのパフォーマンス・オーバーヘッドを低減する、例示のみを生成します例オブジェクトとメモリ常駐を解決するための恒久的な方法。
- シナリオ:
- ウェブサイトのカウンタは同期しにくい、一般的に達成するためにSingletonパターンです。
- ログアプリケーションアプリケーションは、一般的に、一般的に共有ログファイルが原因である、達成するためにSingletonパターンを使用して動作させるための唯一のインスタンス、それ以外の場合は良い追加コンテンツので、開いたままになります。
- データベースは、データベース接続リソースであるため、データベース接続プールの設計は、一般的にシングルモードです。
- 项目中,读取配置文件的类,一般也只有一个对象。没有必要每次使用配置文件数据,都生成一个对象去读取。
main方法
- 由于Java虚拟机需要调用类的
main()
方法,所以该方法的访问权限必须是public
,又因为Java虚拟机在执行main()
方法时不必创建对象,所以该方法必须是static
的,该方法接收一个String
类型的数组参数,该数组中保存执行Java命令时传递给所运行的类的参数。 - 又因为
main()
方法是静态的,我们不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静态成员
代码块
- 作用:对Java类或对象进行初始化
- 分类:
- 静态代码块:
static
修饰,常用于初始化static
的属性,不能操作非静态属性方法,先于非静态代码块执行,随着类的加载而加载,且只执行一次 - 非静态代码块:先于构造器执行
- 静态代码块:
- 程序中成员变量赋值的执行顺序:
final
final
标记的:- 类不能被继承
- 方法不能被重写
- 变量只能被赋值一次
static final
:全局常量
抽象类与抽象方法
- 用
abstract
修饰,只有方法声明没有方法实现的是抽象方法;包含抽象方法的叫抽象类 - 抽象类不能被实例化,只能用来继承,并且被子类重写抽象方法。如果没有重写全部的抽象方法,则子类仍为抽象类
- 私有方法、静态方法、final方法不能被重写,所以不能用
abstract
修饰
接口
- 接口就是规范,定义的是一组规则。接口的本质是契约,标准,规范,制订好后就要遵守。继承是一个“是不是”的关系,接口则是“能不能”的关系
- 接口是抽象方法和常量值定义的集合。从JDK8开始,可以有静态属性、
final
属性、静态默认方法,特点:- 用
interface
来定义 - 接口中所有属性默认是由
public static final
修饰的 - 接口中所有抽象方法默认是由
public abstract
修饰的 - 接口中没有构造器
- 接口采用多继承机制
- 接口也可以继承其它接口
- 用
- 实现接口的类必须提供接口中所有方法的具体内容,否则仍为抽象类
- 接口可以看作是特殊的类,而且是“父类”,可以与实现类之间存在多态关系,即可以声明一个接口的引用,指向实现类对象。
- 接口的应用:代理模式和工厂模式(还没研究,待学习)
练习:找出下列程序中的错误
ball = new Ball("Football");
这句错了。因为接口里都是常量,不论是属性还是方法,都不能被修改
- Java 8中可以为接口添加静态方法和默认方法。可以通过接口直接调用静态方法。默认方法使用
default
关键字修饰。可以通过实现类对象来调用。 - 若一个接口中定义了一个默认方法,而另外一个接口中也定义了一个同名同参数的方法(不管此方法是否是默认方法),在实现类同时实现了这两个接口时,会出现接口冲突。解决办法:实现类必须覆盖接口中同名同参数的方法,来解决冲突。
- 若一个接口中定义了一个默认方法,而父类中也定义了一个同名同参数的非抽象方法,则不会出现冲突问题。因为此时遵守:类优先原则。接口中具有相同名称和参数的默认方法会被忽略。
内部类
- Java中允许将一个类A声明在另一个类B中,则类A就是内部类,类B称为外部类
- 分类:
- 成员内部类:
static
成员内部类和非static
成员内部类 - 局部内部类
- 匿名内部类
- 成员内部类:
成员内部类
- 成员内部类:
- 一方面,作为外部类的成员:
- 调用外部类的结构,包括
private
- 可以被static修饰
- 4つの異なるアクセス許可に変更することができます
- 调用外部类的结构,包括
- 一方、クラスのように:
- クラスは、プロパティ、メソッド、および他のコンストラクタを定義します
- 最終的には、それがクラスが継承することができない表し、改変することができます。含意は、最終的には使用しないでください、継承することができます
- 抽象的に変更してもよいです
- 一方面,作为外部类的成员:
- 非
static
内部クラスのメンバを宣言することができないstatic
だけで外部クラスやでstatic
、彼らは宣言することができます前に、内部クラスstatic
メンバーを - コンパイラは、バイトコードファイルOuterClass $ InnerClass.class(内部局所にも適し)を生成した後、
- コード例:
内部クラスのメンバー
class Person{
String name = "小明";
int age;
public void eat(){
System.out.println("人:吃饭");
}
static class Dog{ //静态成员内部类
String name;
int age;
public void show(){
System.out.println("卡拉是条狗");
}
}
class Bird{ //非静态成员内部类
String name = "杜鹃";
public Bird(){ //构造器
}
public void sing(){
System.out.println("我是一只小小鸟");
Person.this.eat();//调用外部类的非静态属性
eat();
System.out.println(age);
}
public void display(String name){
System.out.println(name);//方法的形参
System.out.println(this.name);//内部类的属性
System.out.println(Person.this.name);//外部类的属性
}
}
}
部分的な内部クラス
- それだけステートメントまたはコードブロックの方法、および使用後の最初の文で使用することができます。クラス以外の任意の場所を使用することはできません
- しかし、復帰のための外部の戻り値を介して、その目的は、戻り値の型は、部分的にのみ親クラス内の親クラスまたはインタフェースタイプであります
- クラスメソッドの外にありますが、なければなりませんローカル内部ローカル変数
final
に。同様のローカル内部クラスのステータスとローカル変数を使用することはできませんpublic
、protected
デフォルトでは、private
- ローカル内部クラスを使用することはできません
static
静的メンバを含めることはできませんので、修正、および - 使用が一般的ではありません、あなたは理解することができます
- コード例:
public void method(){//方法体内
class AA{//局部内部类
}
}
{//代码块内
class BB{//局部内部类
}
}
public Person(){//构造器内
class CC{//局部内部类
}
}
匿名内部クラス(あまりない理解します)
- 匿名内部クラスは匿名内部クラスのインスタンスを作成することができ、任意の静的メンバ、メソッドやクラスを定義することはできません。匿名内部クラスは、暗黙的にクラスを実装するためのインタフェースまたはを使用して実装され、新しい背後に配置する必要があります。
- フォーマット:
new 父类构造器(实参列表)|实现接口(){
//匿名内部类的类体部分
});
- これは、匿名の内部クラスを特徴:親クラスを継承するか、インタフェースを実装する必要があります。一つだけオブジェクトが存在することができ、オブジェクトは、唯一の多形型を使用して参照することができます
- コード例:
interface A{
public abstract void fun1();
}
public class Outer {
public static void main(String[] args) {
new Outer().callInner(new A() {
//接口不能new,但此处比较特殊是子类对象实现接口,只不过没有为对象取名
public void fun1() {
System.out.println("implement for fun1");
}
});// 两步写成一步了
}
public void callInner (A a){
a.fun1();
}
}