1.面向对象编程(高级)
1.1 类变量和类方法
1.类变量
*类变量也叫静态变量/静态属性,是该类的所有对象共享的变量,任何一个该类的对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量
*定义语法:
1.访问修饰符 static 数据类型 变量名;
2.static 访问修饰符 数据类型 变量名;
class A
{
public static String name = "abc";
static public int totalNum = 100;
}
*访问类变量
1.类名.类变量名
2.对象名.类变量名
//类变量的访问,也必须遵守相关的访问权限
class Child
{
private String name;
//定义一个变量count,是一个类变量(静态变量) static 静态
//该变量最大的特点就是会被Child 类的所有对象共享
//类变量可以通过类名直接使用 Child.count
public static int count = 0;
public Child(String name)
{
this.name = name;
}
public void join()
{
System.out.println(name + "加入了游戏..");
}
}
main()
{
Child child1 = new Child("Tom");
Child child2 = new Child("Smith");
child1.count++;
child2.count++;
}
1.static变量
1.static变量是同一个类所有对象共享
2.static变量,在类加载的时候就生成了 //所以即使没有创建对象实例也可以访问
class A
{
public static String name = "111";
}
main()
{
System.out.println(A.name);
}
2.类方法
*类方法也叫静态方法,静态方法只能访问静态属性
1.形式如下:
1.访问修饰符 static 数据返回类型 方法名(){ }
2.static 访问修饰符 数据返回类型 方法名()
2.类方法调用:
1.类名.类方法名
2.对象名.类方法名
3.使用注意事项和细节讨论
1.类方法和普通方法都是随着类的加载而加载,将信息存储在方法区
类方法中无this的参数
普通方法中隐含着this的参数
2.类方法可以通过类名调用,也可以通过对象名调用
3.普通方法和对象有关,需要通过对象名调用,比如对象名.方法名(参数),不能通过类名调用
4.类方法中不允许使用和对象有关的关键字,比如this和super。普通方法(成员方法)可以
5.类方法(静态方法)中 只能访问静态变量或静态方法
6.普通成员方法,既可以访问普通变量(非静态成员),也可以访问静态变量(静态成员)
1.2 main方法
1.解释main方法的形式:
public static void main(String[] args){}
1.main方法是java虚拟机调用的
2.java虚拟机需要调用类的main()方法,所以该方法的访问权限必须是public
3.java虚拟机在执行main()方法时不必创建对象,所以该方法必须是static
4.该方法接收String类型的数组参数,该数组中保存执行Java命令时传递给所运行的类的参数
5.java 执行的程序 参数1 参数2 参数3
public class A
{
public static void main(String[] args)
{
for(int i = 0 ;i<args.length;i++)
{
System.out.println("第" + (i+1) "个参数为:" + args[i]);
}
}
}
2.特别提醒
1.在main()方法中,我们可以直接调用main方法所在类的静态方法或静态属性
2.但是,不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静态成员
1.3 代码块
*代码化块又称为初始化块,属于类中的成员[即 是类的一部分],类似于方法,将逻辑语句封装在方法体中,通过{}包围起来
*但和方法不同,没有方法名,没有返回,没有参数,只有方法体,而且不能通过对象或类显示调用,而是加载类时,或创建对象时隐式调用
1.基本语法
[修饰符]{
代码
};
*注意事项:
1.修饰符可选,要写的话,只能写static
2.代码块分为两类,使用static修饰的叫静态代码块,没有static修饰的,叫普通代码块/非静态代码块
3.逻辑语句可以为任何逻辑语句(输入、输出、方法调用、循环、判断)
4.“ ; ”号可以写上,也可以省略
class movie
{
private String name;
private double price;
private String director;
//不管调用哪个构造器,创建对象,都会先调用代码块的内容
//代码块调用的顺序优先于构造器
{
System.out.println("电影开始");
}
public Movie(String name){
System.out.println("Movie(String name) 被调用");
this.name = name;
}
public Movie(String name ,double price){
System.out.println("Movie(String name,double price) 被调用");
this.name = name;
this.price = price;
}
}
2.使用细节
1.static代码块也叫静态代码块
作用就是对类进行初始化,而且它随着类的加载而执行,并且只会执行一次。如果是普通代码块,每创建一个对象,就执行
class A
{
static {
System.out.println("aaa");
}
}
2.类什么时候被加载
1.创建对象实例时(new)
main()
{
A a = new A();
}
class A
{
static {
System.out.println("aaa");
}
}
2.创建子类对象实例,父类也会被加载
main()
{
A a = new A();
}
class B
{
static{
System.out.println("bbb");
}
}
class A extends B
{
static {
System.out.println("aaa");
}
}
3.使用类的静态成员时(静态属性,静态方法)
3.普通的代码块
在创建对象实例时,会被隐式的调用。被创建一次,就会调用一次
如果只是使用类的静态成员时,普通代码块并不会执行
4.创建一个对象时,在一个类的调用顺序
1.调用静态代码块和静态属性初始化(注意:静态代码块和静态属性初始化调用的优先级一样,如果有多个静态代码块和多个静态变量初始化,则按他们定义的顺序调用)
2.调用普通代码块和普通属性的初始化(注意:普通代码块和普通属性初始化调用的优先级一样,如果有多个普通代码块和多个普通属性初始化,则按定义顺序调用)
3.调用构造方法
5.构造方法(构造器)
构造器的最前面其实隐含了super()和调用普通代码块,新写了一个类演示,静态相关的代码块,属性初始化,在类加载时,就执行完毕,因此是优先于构造器和普通代码块执行的
main()
{
new B();
//1.先调用A() 构造器
//2.B的普通代码块被调用
//3.B()构造器被调用
}
class A
{
public A(){//构造器
//这里有隐藏的执行要求
//(1)super();
//(2)调用本类的普通代码块
System.out.println("ok");
}
}
class B extends A
{
{
System.out.println("okB");
}
public B()
{
//super();//调用A()构造器
//调用本类的普通代码块
System.out.println("B()构造器被调用。。。")
}
}
6.创建一个子类时
创建一个子类对象时(继承关系),他们的静态代码块,静态属性初始化,普通代码块,普通属性初始化,构造方法的调用顺序如下:
1.父类的静态代码块和静态属性(优先级一样,按定义顺序执行)
2.子类的静态代码块和静态属性(优先级一样,按定义顺序执行)
3.父类的普通代码块和普通属性初始化(优先级一样,按定义顺序执行)
4.父类的构造方法
5.子类的普通代码块和普通属性初始化(优先级一样,按定义顺序执行)
6.子类的构造方法
7.静态代码块只能调用静态成员
静态代码块只能调用静态成员(静态属性和静态方法),普通代码块可以调用任意成员