Java学习笔记24(面向对象编程(高级))

本文详细介绍了面向对象编程中的类变量、类方法、静态变量、静态方法、main方法以及代码块(包括静态代码块和普通代码块)的概念、语法和使用注意事项。重点探讨了构造器、初始化顺序和访问权限规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.静态代码块只能调用静态成员

静态代码块只能调用静态成员(静态属性和静态方法),普通代码块可以调用任意成员

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值