什么是类和对象
Java是一门面向对象编程的语言,所以在Java中,一切皆对象,我们把这些对象共同具有的属性列表放在一个类中(比如人的眼睛,鼻子,嘴都放在人这个类中),这就组成了类与对象。
类的实例化
类的创建
class Person {
//成员属性 实例变量
int age;
String name;
String sex;
//成员方法
public void eat() {
System.out.println("吃饭!");
}
在创建类的时候,我们需要注意,所有类中定义的成员均有默认值。
命名规则:大驼峰写法,所有单词大写
类的引用
关于特殊值null
当我引用一个类,但是引用的值为null
例如 Person per1 = null;或者per
或者Person per2 = new Person();
然后将二者
System.out.println(per1.age);
System.out.println(per2.age.length());
二者都会报一个空指针异常的错误。
这是因为,当使用一个值为“null”的去引用任何成员变量或成员方法,都会报错。
但二者所代表的意思有所不同,因为第一个代表per的值为null,引用的成员变量是age,第二个per则是因为age的值为null,所以引用它的成员方法length时,空指针异常。
static关键字
看见static,本能反应,和对象无关。
1.修饰属性
static修饰的属性称为类属性,类变量,所有对象共享。
为什么会引入static变量
class Person {
int age;
String sex;
String name;
static String country="中国";
}
比如这两行代码
name作为成员变量,在所有对象调用时,会储存在堆中,每个对象都有自己对应的name。
country作为静态变量,在产生对象时,程序从右向左执行,此时会先将Person类加载到内存中,
而static修饰的变量会直接存储在JVM方法区中,所有对象共享。
被static修饰的变量,直接通过类名就可以访问,无需通过对象。
若在引用时修改static修饰的值,那么所有引用此值的地方都会改变(牵一发而动全身)
** 在Java中,能否在方法内部定义static变量呢?**
答案是否定的,道理也很简单,方法中创建的变量为局部变量,都保存在栈中,而static变量保存在方法区中。
全局常量
当我们在类中创建一个成员常量 例如 float int a = 10;(赋常量值必须在定义时赋值)
既然是一个常量,也就无法修改。
也就是说每个对象的此值都是一样的。
这样的话,我不妨把常量的值直接放在方法区中,而非堆中,这样也就不需要每次创建对象就要专门在堆中存放常量的值了。
由此我们可以看出,
final其实就是一个天然的共享概念,直接定义为static final即可。
这样的话,相当于所有对象共享此值,并且是唯一的
在类中定义常量,一般都会使用全局常量
static final 共同修饰
命名规则:所有字母全部大写,多个单词下划线分隔
static final String STUDENT_SCHOOL = "清华大学" ;
总结
1.static变量称为类属性,在方法区中存储,该类的所有对象共享此变量。
2.若在类中定义了常量(定义时赋值),一般我们使用 static 和 final 共同修饰,全局常量
3.要使用类属性,我们通常直接通过类名称,属性名称
不推荐使用对象来调用属性,不规范
4.null引用也可以调用
2.修饰方法
static修饰的方法称之为类方法,工具方法(静态方法)
static修饰的方法也是通过类名称直接使用,没有对象就可以访问。
为什么主方法是静态方法呢?
public static void main(String[] args) {
因为主方法是程序的入口,如果主方法也是成员方法也就需要对象调用。
如果一个程序连入口都没有又从哪产生对象?
所以程序从主方法执行,要用静态方法直接调用才能调用起来,无需产生对象。
成员变量,方法与静态变量,方法互相调用
成员方法是否可以直接调用静态方法和静态变量?
静态方法是否可以直接调用成员方法和成员变量?
成员方法因为自身有对象,可以直接调用成员方法和变量,又因为静态方法不需要对象,所以也可以调用静态方法和变量。
静态方法自身没对象,但是调用成员方法和变量的前提就是需要对象,所以无法调用成员方法和变量,但是可以调用静态方法和变量。
因此得出结论:
1.在静态方法只能调用静态方法或者静态属性,static家族之间可以互相调用,不能直接调用成员方法和成员属性,必须通过对象来调用。
2.在成员方法中既可以调用成员方法,也可以调用静态方法(此时都已经产生了对象,一定是可以访问静态域)
3.如何用static
共享变量:
如country(国家)属性
工具类的方法:
Arrays.sort(int[]array)
Arrays.copyOf()
这些Arrays提供的操作数组的方法,设计为static方法
普通的类能否使用static关键字修饰?
类定义出来就是要产生对象的,所以static不能修饰普通的类
版权归原作者 小白的含金量 所有, 如有侵权,请联系我们删除。