Java类和对象详解(图解java类与对象概念、快速掌握java基础知识点)——Java基础系列

文章目录

    • 前言
    • 一、Java类概念
      • 1.1类的字段和方法
      • 1.2访问控制和静态
    • 二、Java对象创建
      • 2.1为对象分配内存
      • 2.2“==”和“equals”比较的区别
      • 2.3值传递OR引用传递

前言

Java作为典型的面向对象编程语言,其中的重点——类和对象,当然是我们不得不知道的概念。但是其中的种种细节,你真的吃透了吗?

一、Java类概念

  • 类是对现实事务或者相关概念进行抽象提取而形成的模板,包含同类事物的共有属性和方法,同时结合具体问题进行设计。比如下图,设计一个Dog类:

Java类和对象详解(图解java类与对象概念、快速掌握java基础知识点)——Java基础系列_第1张图片

  • 根据需求和共有的属性方法,设计含有name、color、type等字段和相关方法的一个Dog类。

1.1类的字段和方法

类的字段:也可以叫类的属性,是抽象出来的同类事物共有的描述——如狗的颜色,品种;人的年纪、职业、身高体重等,都是结合具体问题具体设计。
类的方法:也叫类的行为,同理是对同类事物可以执行的动作的描述——狗能够跑、叫…人能够工作、吃饭、玩耍等。

  • 类可以只有方法没有字段——一般设计为工具类,比如Math类;也可以只有字段,没有方法——一般作为静态常量组使用

特殊的方法

  1. main方法:作为程序接口,一个程序一般只有一个,写法如下:
public class Applaction{
	public static void main(String[] args){
		//相关语句
	}
}
  1. 构造方法:每个类至少一个构造方法,不然无法创建实例,若无定义,默认安排一个,写法如下:
public class ClassName{
	//构造函数和类同名,可重载(同一函数名不同参数)
	ClassName(相关参数or无){
		//要执行的操作,赋值初始化等
	}
}

3.可变参数方法:可传入0或多个参数不固定的方法,实质上是传入数组。写法如下:

public class ClassName{
	public void functionName(int... args){
		//语句组
	}
}

1.2访问控制和静态

封装:类的设计,或者说面向对象设计三大重要概念之一就是封装,简单的说就是将抽象概念提取组合在一起,提供简单的接口供外部访问,实现高效简洁的运用——就好像电视机,只提供少数几个按钮进行大部分操作,而具体的实现细节(复杂的电路都被打包在机器中)

首先了解 包(package) 的概念:一般将一个文件夹内的java类打包成一个包,在java文件中声明,同一包下java类可以相互访问,而不同包直接访问有限制(在访问控制中说明)

package first.product;//声明该类属于first.product包

访问控制: 为了避免类暴露太多细节导致难读难用,同时有效的保护类不被相互影响,使用访问控制符对类之间的访问进行限制。

  1. 对整个类的访问控制a. public类:只能放在同名java文件中,能够供不同包的类访问使用(访问最大) b. 默认类(没有访问修饰符):只能供同包下的类访问使用。
  2. 对类成员(字段/方法)的访问控制:具体有四种,访问和修饰符号关系见下表格:(速记——本类》同包》子类》其他;——public》protected》默认》private)
访问级别 其他包的类 同一包类 子类 本类
public yes yes yes yes
protected yes yes yes
默认 yes yes
private yes

静态的概念: 用static关键字修饰的类或者成员(static类成员也必须为static)
记住static成员是属于类的不是属于实例对象即可——在类载入过程就已经加载好了,因此无需实例成对象就可以使用,比如:

Math.pow(2.0,10.0)//通过类名使用类静态方法

二、Java对象创建

2.1为对象分配内存

变量:基本类型如int,byte,boolean等,直接在栈中分配内存,变量就是值;但是对于类的实例——对象,声明的变量同样也是在栈中分配好空间,但是保存的是对象在堆中的地址。

对象:对象的创建需要new调用构造函数,或者通过一些特殊构造方法,复制or反射等,然后在堆中开辟空间保存对象。

赋值:对象的赋值操作实际是将堆中的对象的地址交给栈中的变量。
Java类和对象详解(图解java类与对象概念、快速掌握java基础知识点)——Java基础系列_第2张图片

2.2“==”和“equals”比较的区别

我们常用的==比较方法只是比较两个变量的引用地址是否相同,如下:

String s1=new String();
String s2=new String();
if(s1==s2)
	System.out.println("s1==s2");
else
	System.out.println("s1!=s2");

尽管s1和s2都是空字符串,但是你会发现他们不相等,这是由于他们引用的对象地址不同。

StringBuilder s1=new StringBuilder();
s1.append("Hi");
StringBuilder s2=s1;
System.out.println(s2.toString());//Hi
s1.append(" world");
System.out.println(s2.toString());//Hi world

你会发现对s1 的修改影响到了s2,这是由于s1和s2都指向一个对象地址,这属于浅拷贝——关于拷贝可以参考这篇文章_原型模式的深浅拷贝

但是所有的类都继承自Object类,都包含了一个equals方法,Java标准库提供的类比如String等都实例化了该方法,equals能够比较对象的内容是否相同

String s1=new String();
String s2=new String();
if(s1.equals(s2))
	System.out.println("s1==s2");
else
	System.out.println("s1!=s2");

现在他们就相同了

自己编写的类如果需要比较,也需要实现这样一个方法

2.3值传递OR引用传递

按值传递按引用传递一直是编程语言中的重要概念,也是非常难以区分的概念,如果不能较好的理解该概念,将会造成很多莫名其妙的逻辑错误,严重影响数据结构和算法相关实现的理解。

值传递——将内容复制一份传入方法中,方法中的任何修改都不影响原对象
引用传递——将对象的地址传入,方法中的修改可能影响原对象

Java中的基本类型属于值传递,将值复制一份给方法参数传入,不影响原变量的内容。
而Java的对象则更加复杂一些,属于将地址复制给方法参数,归属于引用传递——具体案例见下(下面实现一个交换方法 swap() ):

/**
public void swap(Book a,Book b){
	Book mid;
	mid=a;a=b;b=mid;
	System.out.println("After Swap a: "a.getName()+" b: "+b.getName());
}
**/
Book book1=new Book("A Java入门基础");
Book book2=new Book("B Java进阶知识");
swap(book1,book2);
System.out.println("Real a: "book1.getName()+" b: "+book2.getName());

//After Swap a: B Java进阶知识 b: A Java入门基础
//Real a: A Java入门基础 b: B Java进阶知识

可以看到,尽管在swap方法中,a和b完成了交换,但是方法外的book1和book2指向的对象还是没有改变。
这是由于方法中,改变的是a、b指向的地址,但是对book1、book2的地址没有影响,但是如果在方法中修改a指向对象的Name,对对象内部的修改会同步到外部。

以上就是对Java核心知识点类和对象的简单理解,如有缺漏欢迎指正
有不清楚的同学,也请不耻下问,欢迎私信

你可能感兴趣的:(Java基础概念,java,开发语言,后端,类,面向对象编程)