面对对象---关键字final、static

一、重点知识

只要你想对字符串有修改且返回的,你调的的是不变的,返回的那个是改变的

java中从哪开始到哪结束的区间问题,一般都是左闭右开的
一般length就是取几个,index就是到哪结束

抽象方法的最大目的,强制重写

默认方法只能在接口中被定义

一个抽象方法有没有实现看看有没有花括弧

注意接口的实现类的对象可以调用接口中的默认方法,如果重写了接口的默认方法,那么调用的是重写后的,但是接口中的静态方法,只能通过接口来调

如果子类(或实现类)继承的父类和实现的接口中声明了同名同参数的默认方法,那么子类在没有重写此方法的情况下,默认调用的是父类中的同名同参数的方法。-->类优先原则

如果实现类实现了多个接口,而这多个接口中定义了同名同参数的默认方法,那么在实现类没有重写此方法的情况下,报错。-->接口冲突。这就需要我们必须在实现类中重写此方法

以后再提属性不论有没有要求,都声明为私有,这是编码规则

final修饰的方法不允许子类重写

静态属性存在方法区中的静态域中

类变量最好不要用对象访问,不便捷

类变量与对象是否创建没关系,随着类的加载而加载

静态方法中可以创建对象,例如单例模式

二、重点问题

1、static的总结

2.1 属性,是否使用static修饰,又分为:静态属性 vs 非静态属性(实例变量)

实例变量:我们创建了类的多个对象,每个对象都独立的拥一套类中的非静态属性。当修改其中一个对象中的非静态属性时,不会导致其他对象中同样的属性值的修改。

  静态变量:我们创建了类的多个对象,多个对象共享同一个静态变量。当通过某一个对象修改静态变量时,会导致其他对象调用此静态变量时,是修改过了的。

 2.2 static修饰属性的其他说明:

 ① 静态变量随着类的加载而加载。可以通过"类.静态变量"的方式进行调用

 ② 静态变量的加载要早于对象的创建。

③ 由于类只会加载一次,则静态变量在内存中也只会存在一份:存在方法区的静态域中。

2.3static修饰方法:静态方法、类方法

1. 随着类的加载而加载,可以通过"类.静态方法"的方式进行调用

2. 静态方法中,只能调用静态的方法或属性

  非静态方法中,既可以调用非静态的方法或属性,也可以调用静态的方法或属性

2.4.static的注意点:

 在静态的方法内,不能使用this关键字、super关键字

2.5如何判定属性和方法应该使用static关键字:

1 关于属性

> 属性是可以被多个对象所共享的,不会随着对象的不同而不同的。

> 类中的常量也常常声明为static

2 关于方法

> 操作静态属性的方法,通常设置为static的

> 工具类中的方法,习惯上声明为static的。 比如:Math、Arrays、Collections

三、课堂知识

3.1、final关键字

1、在Java中,可以修饰类,变量,方法。

1、final修饰局部变量

赋值之后,数值不能再修改了。

2、final修饰成员变量

final在类中修饰成员变量的话,要求必须初始化。并且赋值后,不能再修改数值了。

3、final修饰成员方法

final所修饰的方法,不允许子类重写的。

4、final修饰的类

final修饰的类,不允许子类继承。“太监类”,比如String。

2、final修饰变量(成员变量和局部变量),则为常量,只能赋值这一次。

修饰成员变量的时候,定义时,要同时给出初始化的值。

修饰局部变量,只能赋值一次。

3、final修饰方法,则该方法不能被子类重写

4、final修饰类,则类不能被继承

5、对比final和abstract关键字修饰方法:

final修饰的方法,不让子类重写。

abstract修饰的方法,要求子类必须重写。

所以final和abstract不能同时修饰一个方法,会疯掉的。

变量:本质就是一小块内存,用于存储数据。在程序执行过程中,数值可以改变。

常量:同变量类似,也是存储数据。数值不能改变。

3.2、static关键字

1、 修饰成员属性

public class Person {

//成员变量:随着对象的创建而产生的。每个对象都有自己的一份属性值,和其他的对象的数值是无关的。

String name;

int age;

static String city;//该类的对象,属性值,恰巧都相同。

}

2、修饰属性:

类中的属性:2种

1、非static,叫成员变量(name,age),属于对象的。随着对象的创建而产生,创建几个对象,就有几分该属性值。对象的属性值是彼此独立的。

对象.成员变量,表示该对象访问自己的属性,赋值,取值

2、static的属性,叫静态属性,属于类的。和对象无关。随着类的加载而产生。内存中,就一份。应该由类直接访问,但是对象也可以访问,多个对象,共享这一份数据。

类.静态属性。可以赋值,取值

3、static修饰的属性:

1、静态成员变量,使用static修饰的成员变量,定义再内存中,方法区中。

2、静态成员变量,不推荐使用对象调用,赋值,取值。。如果使用,也允许,但是会警告:

The static field Person.city should be accessed in a static way

3、静态的成员属性,属于类的,应该由类直接调用。

类名.静态属性名 = 赋值/取值。

4、如果代码中,没有创建对象,可以通过类名直接访问静态属性。【和对象无关的】

5、不管通过对象还是类,如果修改了静态属性的值,那么就改了,其他的对象来访问,会收到影响。

4、 修饰成员方法

//static修饰方法的语法格式:

public static 返回值类型/void 方法名(参数列表){

方法体;

}

一个方法,一旦使用static修饰,就表示该方法属于类,应该由类来直接调用。

静态方法中:

可以访问静态的属性(属于类的),但是不能直接访问非静态的属性(属于对象的)。

可以访问静态的方法(属于类的),但是不能直接访问非静态的方法(属于对象的)。

结论:静态方法中,不要涉及对象的内容:对象的属性(成员变量),对象的方法(成员方法),包括this和super关键字。

非静态方法中:属于对象

静态的,非静态的都可以。this,super都可以。

5、static修饰的方法:

1、静态方法推荐使用类名直接调用。

不推荐使用对象来调用,但是对象也可以调用

2、静态方法中,不能访问对象的内容,对象的成员变量,对象的成员方法。

3、静态方法中,不能出现this和super关键字。语法级别的要求。

4、静态方法中,可以访问静态的属性,以及其他的静态的方法。

5、静态方法中,可以通过new关键字来创建对象。

6、子类可以继承父类的静态方法,但是不能重写。

你可能感兴趣的:(面对对象---关键字final、static)