Java 面向对象

类与对象

对象内存分析

堆内存:存放对象的具体信息,在程序之中,堆内存的空间的开辟是通过 new 来完成的。
栈内存:存放堆内存的地址,通过地址找到堆内存,而后找到对象内容。

对象的实例化

对象的调用要在实例化以后,程序错误描述的是空指向异常,只有引用剋下会出现这类错误。

对象传递分析

堆内存可以被不同的栈内存所指向,也可以更换指向。
类似于c语言中的指针类型;

可以利用方法实现对象传递

引用传递可以在方法中实现,需要注意方法中的参数的作用域。

引用传递与垃圾产生分析

引用处理不当会导致垃圾产生。

没有任何栈内存所指向的堆内存叫做垃圾空间。
所有的垃圾将被 GC (Gaebage Collector ) 不定期的收集,释放无用的内存空间,但是产生的垃圾过多仍然会影响 GC 的处理性能,从而降低整体的程序性能。垃圾产生越少越好。

一个栈内存只能保持有一个堆内存的地址数据,如果发生改变,堆内存的地址就将从栈内存中彻底消失。

深入分析类与对象

成员属性封装

在类之中,方法对外提供服务,不会封装。而属性需要被封装而进行保护数据。
可以通过方法在类外对属性进行调用。

属性在不封装时,外部可以进行调用,但是数据合法性,安全性无法得到保证。
可以使用 private 对属性进行封装。属性封装后,外部不可以直接访问.

可以使用 setMethodname ()、getMethodname (),方法来获得属性使用。

  • 设置属性方法: public void setMethodname(String n);
  • 获取属性方法:public String getMethodname()

类中的所有属性都要使用 private 封装,属性访问要提供有 setter 和 getter 方法。

构造方法与命名对象

为了初始化的便捷,通过构造方法来实现实例化对象中的属性初始化处理。在有 new 使用构造方法。

  • 构造方法名称必须与类名称保持一致;
  • 构造方法不允许设置任何的返回值类型,即:灭有返回值定义;
  • 构造方法是在使用关键字 new 实例化对象时自动调用。

Java 程序考虑程序完整性,所有的类都有构造方法,没有自己定义的构造方法,就会自动创建默认的构造方法。一个类至少有一个构造方法。

构造方法没有返回值,为什么不使用 void 关键字?
使用 void 关键字后,构造方法就会与普通方法结构完全相同,构造方法实在类对象实例化时调用,而普通方法时在类对象实例化以后调用的。

构造方法重载只需要考虑参数;
setter 方法可以初始化,也可以修改参数。

构造方法可以传递属性数据

  • 定义对象名称: 类名 对象名 = null;
  • 实例化对象:对象名称 = new 类名()
    而这种形式的对象由于没有名字就叫匿名对象。

this 关键字

  • 当前类中的属性: this.属性;
  • 当前类中的方法(普通方法、构造方法);this()、this.方法名称();
  • 描述当前对象
  • 对 this 的调用必须是构造器中的第一个语句

——————— 21/9/19 ————————-

  • 构造方法相互调运时,要避免形成死循环,要保留出口。

简单 Java 类

简单 Java 类是Java项目的重要组成部分

  • 类名称有意义,明确描述某一类对象
  • 类之中的属性都必须用 private 进行封装,同时封装后院的属性必须提供 getter 和 setter 方法。
  • 类之中可以提供有无数多个构造方法,但是必须保留无参构造方法。
  • 类之中不许出现任何的输出语句,所有的内容的获取必须返回;
  • (非必须)可以提供有一个获取对象详细信息的方法,暂时将此方法的名称定义为 getInfo()

static 关键字

static 属性可以由类名称直接调用;
static 属性虽然定义在类中,但是并不受到类实例化对象的控制。static 属性可以在没有实例化对象的时候使用。

———————2021/09/20————————

公共信息存储时考虑 static 属性
而且 static 属性可以在没有实例化对象的时候产生

static 声明

可以由类名在没有实例化对象的时候进行调用;

  • static 方法只允许调用 static 属性或者 static 方法;
  • 非 static 方法允许调用 static 属性或者 static 方法;

static 定义的方法或者属性都不是代码编写之初所需要考虑的内容,只有在回避实例化调用并且描述公共属性的情况下下才会考虑使用 static 定义的方法或者关键字时属性;

static 实例

  1. class Book {
  2. private String title;
  3. private static int count = 0;
  4. public Book() {
  5. SysTem.out.println(" 未命名");
  6. }
  7. public Book(String title) {
  8. this.title = title;
  9. count ++;
  10. System.out.println("创建第" + count +"一本新的图书");
  11. }
  12. public String getTitle() {
  13. return this.title();
  14. }
  15. }
  16. public class JavaDemo {
  17. pubilc static void main(String args[]) {
  18. new Book("Java");
  19. new Book("JSP");
  20. new BOOK("Spring");
  21. }
  22. }
  1. class Book {
  2. private String title;
  3. private static int count = 0;
  4. public Book() {
  5. this("NUTITLE");
  6. }
  7. public Book(String title) {
  8. this.title = title;
  9. }
  10. public String getTitle() {
  11. return this.title();
  12. }
  13. }
  14. public class JavaDemo {
  15. pubilc static void main(String args[]) {
  16. System.out.println(new Book ().getTitle("Java"));
  17. System.out.println(new Book ().getTitle("JSP"));
  18. System.out.println(new Book ().getTitle("Spring"));
  19. System.out.println(new Book ().getTitle()); //无参构造
  20. }
  21. }

代码块

普通代码块:可以在一个方法之中进行拆分,以防止相同变量命名带来的相互影响。

构造代码块:定义在类之中,构造块会先于构造方法执行,每一次实例化方法就会调用构造快;

静态代码块:使用 static 定义,考率主类中定义和非主类中调用。静态代码块优先于构造代码块执行,仅仅初始化一次。在主类中定义静态代码块,静态代码块优先于主方法执行。

同步代码块:多线程时出现

面向对象案例

构造银行账户类,类的构成包括
数据成员用户的账户名称,用户账户余额(private数据类型)
方法包括开户,设置账户名称以及余额,使用构造方法完成
查询余额

  1. class Account {
  2. private String name;
  3. private double balance;
  4. public Account() {}
  5. public Account (String name) {
  6. this(name, 0.0);
  7. }
  8. public Account(String name, double balance) {
  9. this.name = name;
  10. this.balance = balance;
  11. }
  12. //setter\getter 方法
  13. public String getInfo() {
  14. return "账户名称" + this.name + "、余额" + this.balance;
  15. }
  16. }
  17. public class JavaDemo {
  18. public static void main(String args[])
  19. {
  20. Account account = new Account("xxxx", 9000000.00);
  21. System.out.println(account.getInfo());
  22. System.out.println(account.getBalance());
  23. }
  24. }

数组定义与使用

数组:一组相关变量的集合
Java数组定义为引用数据结构

  • 数组动态初始化:初始化后所有数据线类型储存为其默认的类型;
    数据类型 数组名称 [] = new 数据类型 [长度]
    数据类型 [] 数组名称 = new 数据类型 [长度]
  • 数组静态初始化
    简化格式:数据类型 数组名称 [] = {data1,…..}
    完整格式:数据类型 数组名称 [] = new 据类型 [] {数据1、数据2、…..}

foreach

foreach 语法可以直接访问数组中的元素而避免了下标的访问。

foreach(数据类型 变量 : 数量) {
//自动循环,将数组的值赋值给变量;
}

二维数组

  1. 初始化
    数据类型 数组名称 [][] = new 数据类型[行][列]
    数据类型 数组名称 [][] = new 数据类型 [][] {{, , ,},{, , ,}}
  2. foreach 使用二维数组
    在其中使用两个循环就可以正常的输出。

数组与方法

数组可以通过方法实现引用传递。
主方法需要简洁,对于复杂计算,可以放在专门的计算类中。

数组相关类库

  1. 数组排序:
    java.until.Arrays.sort(数组名称)
  2. 数组拷贝
    System.arraycopy(原数组,原数组开始点,目标数组,目标数组开始点,拷贝长度);

方法可变参数

避免数组的传递操作,可变参数的本质时数组操作。

对象数组

Java 程序中各种数据类型都可为数组类型,对象数组定义如下。
动态初始化:类 对象数组名称 [] = new 类 [长度] ; 元素内容都为 NULL。
静态初始化:类 对象数组名称 [] = new 类 [] {实例化对象,实例化对象…}