JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

Java基础知识 - 对象与类

wys521 2025-01-01 23:06:24 精选教程 19 ℃ 0 评论


1、类

1)类(class)是构造对象的模板;

2)类可以理解为制作材料的模具,对象可以理解为是通过模具制作出来的材料;

3)由类构造对象的过程称为创建类的实例(instance);

4)*.class 字节码文件只是存在硬盘上的一种文件,需要通过 ClassLoader 加载器把 *.class 文件内容加载到内存中;

5)使用 javac 命令编译源文件时:

1、如果存在相同的部分,可以使用通配符一次编译多个源文件,
	如:javac Employee*.java;
2、如果 A 类中依赖了 B 类,那在编译 A 类源文件时会自动查找依赖的 B 类字节文件,
	如果没找到则会查找 B 类源码文件并编译;

5)UML类图

> Unified Modeling Language,统一建模语言;

> 推荐画图工具draw.io,支持网页版、客户端,非常好用;


2、对象与对象变量

1)首先要区分清楚变量和对象变量的概念,变量包含对象变量和基础类型变量,如:

// 要认识到变量 nowDate 不是一个对象,
// 在没有初始化之前不能使用该变量上的任何方法,因为这些方法是对象的;
Date nowDate,是定义一个Date类型对象变量;

int a = 0,是定一个基础类型变量,并赋值0;

2)对象可以理解为是通过模具制作出来的材料,而类就是这个制作材料的模具,new 操作符会构造一个新对象出来,在内存中划分空间;

// 这里是创建一个Date类的实例对象,并把引用赋值给变量nowDate
Date nowDate = new Date();

3)对象变量 nowDate 中存放的是 new 出来的对象的引用,即变量的值是一个引用;

4)new Date(),new 操作符构造一个对象时返回的是该对象的引用,可以不把引用赋值给变量而直接使用;

5)变量初始化赋值;


3、隐式参数和显式参数

1)user.setName(String name),user 被称为隐式参数,setName 方法括号中的 String name 是显式参数;


4、基于类的访问权限

1)一个类中的方法可以访问,调用该方法的对象的私有字段;

如:channel1.handle(channel2);
解释:
handle() 方法是属于ClueChannelDTO类对象的,
当对象 channel1 调用它的 handle() 方法时,在handle()方法内部是可以直接
访问 channel1 对象的私有字段的;

2)一个方法可以访问所属类的所有对象的私有字段;

如:在 channel1 对象的 handle() 方法中可以直接
访问同一个类的 channel2 对象中的私有字段;


5、final修饰实例成员字段

1)final 修饰的字段必须在构造对象时初始化,即实例化对象后这个字段就已经有值了,且之后不可再改变;

> 手动写一个无参构造函数,不给final 修饰的字段赋值,也会编译报错;

> final 修饰的字段,lombok组件的@Data 注解不会为该 final 字段生成 setXxx 方法;

2)final 修饰的类称为不可变类,String 类就是不可变的;

3)final 修饰的类不能被继承,即不会有子类;

4)final 修饰方法,表示该方法不能被子类重写;


6、静态字段和静态方法


静态字段

1)静态字段也叫类字段,属于类而不是属于类的对象;


静态常量

1)使用 static final 两个关键字修饰的字段称为静态常量;

2)已经赋值的 final 变量的值是不可以修改,这是 java 规范,但是 System 类中的 setOut() 方法可以修改 out 变量的值,这是因为 setOut() 方法调用了原生方法,绕过了 java 语言的访问控制机制;

> 我们一般写程序时不建议这样做;


静态方法

1)使用 static 修饰的方法被称为静态方法;


静态工厂方法

1)通过一个静态方法来创建本类的对象,那该静态方法可以称为静态工厂方法;


7、方法参数

1)Java 是按值传递参数给方法的;

2)基本类型是直接把值传递给方法,方法参数会生成一个传递值的副本

> 在方法内对基本类型的参数做处理并不会影响传入的原变量的值;

3)对象类型是把变量的值(即对象的引用)传递给方法,方法参数会生成一个副本,值是对象的引用,即这个副本也是指向对象的;


8、对象构造


重载

1)一个类中存在多个方法名相同,参数个数不同或参数类型不同的方法,这就叫方法重载;

2)方法名+参数类型叫做方法的签名,方法签名不包含返回类型;

3)方法名和参数类型相同但是返回类型不同的两个方法是不能存在的;


默认值和字段初始化

1)在类构造器中没有显式的为字段赋初始值,就会自动的为字段赋默认值,数值默认0,boolean 类型默认 false,对象类型默认 Null;


无参构造器

1)当类中没有任何构造器时,会有一个默认的构造器;

2)使用无参构造器在构建对象时,会为对象所有字段赋默认值;


显式字段初始化

1)可以在实例字段定义时赋值;


在构造器中通过 this 关键字调用另一个构造器

1)this 表示当前对象;

2)this 也可以用作当前类的构造器;


初始化块(静态与非静态)

1)初始化数据字段的方法有三种:

> 在构造器中初始化字段值;

> 在类中声明字段时初始化;

> 在初始化块中进行自动初始化;

2)在类中可以包含任意多个代码块,构建对象时就会执行这些代码块;

> 首先运行初始化代码块,之后才运行构造器主体部分

3)静态初始化块;

> 在类第一次加载的时候,会进行静态字段初始化

> 静态字段初始化方法或静态初始化块,都是按照出现的顺序执行;

4)执行顺序,静态初始化块 > 初始化块 > 构造器;


调用构造器的处理步骤

1)在构造器的第一行调用了另一个构造器,则会先执行另一个构造器;

2)所有数据字段初始化为默认值;

3)按照出现的顺序,执行所有字段初始化方法和初始化块;

4)执行构造器主体代码;


new 一个对象的过程

1)JVM 看到 new 指令,会先去检查在常量池中是否存在指定类的全限定名称,如果存在则进一步检查该类是否被加载、解析、初始化过,即检查是否第一次使用该类;

如果是第一次使用该类,则先进行加载、解析、初始化;
初始化是指对类的 static 变量做初始化;

2)申请内存空间,创建对象;

3)初始化对象中的变量(赋默认值),执行普通代码块或调构造方法初始化;

4)把对象的引用赋值给引用变量;


注意3)和 4)可能发生指令重排序;


9、public / private / protected / 无修饰符


1)访问权限有四种,public / private / protected / 无修饰符;

2)类定义只能使用 public 修饰或无修饰符:

> 无修饰符时只能在同一个 package 包中被访问到;

3)一个类源文件中只能有一个 public 修饰的 class,其他需是无修饰符;

4)public / private / protected / 无修饰符 可以修饰字段和方法;


10、清单文件 Manifest.MF

1)jar 文件 META-INF 目录中有清单文件 MANIFEST.MF;

2)打包成可执行的 jar 文件时,可以在清单文件中指定程序的主类,如:

Main-Class: xx.xx.AppMainClass(这里不需要.class扩展名)

3)清单文件必须以换行符结束,不然无法被正确的读取;

4)在 windows 系统有包装器工具,可以将 jar 文件转换成 windows 系统的可执行文件,即 .exe 扩展名的文件,工具诸如:Launch4J / IzPack;


11、其他

1)写一个当月日历表:

public static void main(String[] args) {
        String[] weeks = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"};
        for (int i=0; i<weeks.length; i++) {
            System.out.print(weeks[i] + (i<weeks.length-1 ? "  " : ""));
        }
        System.out.println();
        
        LocalDate now = LocalDate.now();
        int daysOfMonth = now.lengthOfMonth();
        int today = now.getDayOfMonth();
        int weekWithFirstDayOfMonth = now.minusDays(today-1).getDayOfWeek().getValue();
        int weekWithLastDayOfMonth = now.minusDays(today-1).plusDays(daysOfMonth-1).getDayOfWeek().getValue();
        int totalLen = (weekWithFirstDayOfMonth-1) + daysOfMonth + (weeks.length-weekWithLastDayOfMonth);
        String space = "     ";
        
        for (int i=0; i<totalLen; i++) {
            int mod = Math.floorMod(i+1, weeks.length);
            if ((weekWithFirstDayOfMonth-1) > i) {
                System.out.print(space);
            } else if (i+1 > (weekWithFirstDayOfMonth-1) + daysOfMonth) {
                System.out.print(space);
            } else {
                String day = String.valueOf((i+1)-weekWithFirstDayOfMonth+1);
                if ((i+1) == today + (weekWithFirstDayOfMonth-1)) {
                    day = day + "*";
                }
                System.out.print(day + space.substring(0, space.length()-day.length()));
            }
            
            if (mod != 0) {
                System.out.print("  ");
            }
            if (mod == 0 && i != 0 && i != totalLen-1) { // 换行
                System.out.println();
            }
        }
    }


本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表