JAVA学习随笔-DAY2

基础语法

注意:

  • 大小写敏感
  • 类名首字母必须大写
  • 方法名首字母必须小写,后面每个单词首字母大写
  • 源文件名与类名必须相同
  • 文件名与类名必须相同
  • 必须有主方法入口
    public static void main(String[] args)
点击查看代码
public class HelloWorld {
    /* 第一个Java程序
     * 它将输出字符串 Hello World
     */
    public static void main(String[] args) {
        System.out.println("Hello World"); // 输出 Hello World
    }
}

变量类型:

  • 局部变量
  • 类变量(静态变量)
  • 成员变量(非静态变量)

枚举

枚举限制变量只能是预先设定好的值。
枚举类声明时机

  • 单独声明
  • 类中声明
    枚举类中可包含的属性
  • 方法
  • 变量
  • 构造函数
点击查看代码
//包声明
package com.itheima.operat;
//定义FreshJuice类
class FreshJuice {
    // 为FreshJuice类定义一个名为FreshJuiceSize的枚举类,包含三个固定值,是FreshJuice的静态成员变量
    enum FreshJuiceSize{ SMALL, MEDIUM , LARGE }
    // 为FreshJuice类定义一个名为size类型为FreshJuiceSize枚举类的成员变量,
    FreshJuiceSize size;
}
// 定义FreshJuiceTest类,用于测试FreshJuice类的功能
public class FreshJuiceTest {
    public static void main(String[] args){
        // new一个FreshJuice对象实例,并赋值给变量juice
        FreshJuice juice = new FreshJuice();
        // 给FreshJuice类的juice对象的size属性赋值为MEDIUM
        juice.size = FreshJuice.FreshJuiceSize.MEDIUM; // 通过"类名.枚举名.枚举值"的方式赋值
        // 打印juice对象的size属性值
        System.out.println(" juice size : " + juice.size);
    }
}

接口

接口interface: 对象间相互通信的协议。接口只定义派生要用到的方法,派生类决定方法的具体实现


JAVA源程序 VS 编译型源程序

图片

注释

点击查看代码
//单行注释

/*
多行注释
*/

/**
 * 文档注释
 * 通常包含类、方法、字段等的详细信息,用于生成代码文档
 * 可被工具提取生成API文档,如JavaDoc
 * 通常包含一些特定标签用来生成清晰的API文档,有助于其他开发者理解
 * 特殊标签:‘@param’描述方法参数、‘@return’描述返回值、‘@throws’描述可能抛出的异常。
 */

对象、类

每个编译单元(文件)都只有一个 public 类。

java因强制要求类名(唯一的public类)和文件名统一,因此在引用其它类时无需显式声明。在编译时,编译器会根据类名去寻找同名文件。

为什么JAVA文件中只有一个public类?

java 程序是从一个 public 类的 main 函数开始执行的,(其实是main线程),就像 C 程序 是从 main() 函数开始执行一样。只能有一个 public 类是为了给类装载器提供方便。
一个 public 类只能定义在以它的类名为文件名的文件中。

每个编译单元(文件)都只有一个 public 类。
因为每个编译单元(文件)都只能有【一个公共接口,用public类来表现】。该接口(该类)可以包含众多的支持包访问权限的类。
一个编译单元(文件)内可以没有 public 类,但是如果有一个以上的 public 类,编译器就会报错。
public类的名称必须与编译单元(文件)名相同,严格区分大小写。

成员变量(实例变量)和类变量(静态变量)的区别:

不同对象的实例变量将被分配不同的内存空间,如果类中的成员变量(实例变量)有类变量(静态变量),那么所有对象的这个类变量(静态变量)都分配给相同的一处内存,改变其中一个对象的这个类变量(静态变量)会影响其他对象的这个类变量(静态变量),也就是说对象共享类变量(**对象共享静态变量**)。

由【static修饰】的变量称为【静态变量】,其实质上就是一个【全局变量】。
如果某个内容是被所有对象所【共享】,那么该内容就应该用【静态修饰】;没有被静态修饰的内容,其实是属于对象的特殊描述。

1、两个变量的生命周期不同

  【成员变量】随着【对象】的创建而存在,随着对象的回收而释放。

  【静态变量】随着【类】的加载而存在,随着类的消失而消失。

2、调用方式不同

  【成员变量】只能被【对象调用】。

  【静态变量】可以被【对象调用】,还可以被【类名调用】。

3、别名不同

  【成员变量】也称为【实例变量】。

  【静态变量】也称为【类变量】。

4、数据存储位置不同

  【成员变量】存储在【堆内存的对象】中,所以也叫对象的【特有数据】。

  【静态变量】数据存储在方法区(共享数据区)的【静态区】,所以也叫对象的【共享数据】。

static 关键字,是一个修饰符,用于修饰类的成员(成员变量和成员函数)。
特点:

1、想要实现对象中的共性数据的【对象共享】。可以将这个数据【进行静态修饰】。

2、被静态修饰的成员,可以【直接被类名所调用】。也就是说,静态的成员多了一种调用方式。【类名.静态方式】。

3、静态随着类的加载而加载。而且【先于对象】存在。

类变量的弊端:

1、有些数据是对象特有的数据,是不可以被静态修饰的。

因为那样的话,特有数据会变成对象的共享数据。

这样对事物的描述就出了问题。

所以,在定义类变量时,必须要明确,这个数据是否是被对象所共享的。

2、静态方法只能访问静态成员,不可以访问非静态成员。

  因为静态方法**加载时,先于对象存在**,所以没有办法访问对象中的成员。

3、静态方法中不能使用this,super关键字。

  原理同2,因为this代表对象,而静态在时,有可能没有对象,所以this无法使用。

什么时候定义静态成员呢?或者说:定义成员时,到底需不需要被静态修饰呢?

成员分两种:
1、成员变量。(数据共享时静态化)
该成员变量的数据是否所有对象都一样?

【是】,那么该变量需要被静态修饰,因为是共享的数据。

【不是】,那么就说这是对象的特有数据,要存储到对象中。

2、成员函数。(方法中没有调用特有数据时就定义成静态)
如果判断成员函数是否需要被静态修饰呢?
根据该函数内是否访问了对象中的特有数据:

【访问过】,不能被静态修饰。

【没有访问过】,需要被静态修饰。

所以,成员变量可以称为对象的特有数据,静态变量称为对象的共享数据。

成员变量与局部变量的区别

  1. 声明位置
    成员变量是类的属性,在类中声明
    局部变量在方法中,或者类外声明
  2. 初始化位置
    成员变量存在默认值,可以不用赋值,默认值跟数据类型有关
    局部变量没有默认值,必须先声明,再赋值,然后使用
  3. 类中,局部变量可以与成员变量同名,局部变量优先,访问成员变量需使用'this.成员变量'。

对象和引用的区别

对象是一个具体的实例,是用new创建的一个对象,在堆内存中有空间分配的
引用名称存放的时对象的地址,类似于C语言中的指针

内部类

类似于类的嵌套,内部类在外部类中。
不使用内部类时:

点击查看代码
public class Body{
	private int blood;
	private Heart heart;
	private Head head;
}

publid class Heart{
	private int blood;
	public void test(){
		System.out.println(blood);
	}
}

public class Head{
	private int blood;
	public void test(){
		System.out.println(blood);
	}
}

使用内部类时:

点击查看代码
public class body{
	private int blood;
	public class Heart{
		public void test(){
			System.out.println(blood);
		}
	}
	public class Head{
		public void test(){
			System.out.println(blood);
		}
	}
}

优点: 内部类可访问外部类的私有属性
缺点: 破坏了原有类的属性、构造方法、普通方法、内部类

源文件声明规则

  • 一个源文件只能有一个public类
  • 一个源文件可以有多个非public类
  • 源文件名必须与public类名一致
  • 对于在包中的源文件,package语句应在源文件首行
  • import语句应紧随package语句,并在类定义之前
  • import语句和package语句对类中定义的所有类都有效

包packag的作用

import 语句就是用来提供一个合理的路径,使得编译器可以找到某个类。

package 的作用就是 c++ 的 namespace 的作用,防止【名字相同的类】产生冲突。
Java 编译器在编译时,直接根据'package'指定的信息,直接将生成的'class'文件生成到对应目录下。如:'package aaa.bbb.ccc'编译器就将该'.java'文件下的各个类生成到'./aaa/bbb/ccc/'这个目录。

import的作用

import 是为了【简化】使用 package 之后的【实例化的代码】。
对于'./aaa/bbb/ccc/'下的A类:
	如果没有'import',实例化A类为:'new aaa.bbb.ccc.A()'
	如果有'import',使用'import aaa.bbb.ccc.A'后,就可以直接使用'new A()'了
也就是编译器匹配并扩展了'aaa.bbb.ccc.'这串字符串
posted @ 2025-12-08 00:53  一以当之  阅读(2)  评论(0)    收藏  举报