JAVA基础语法:类和对象

一.类与对象

1.类和对象的概念

类是一个抽象概念,如:人类。猫类,犬类=》无法具体到某个实体。
对象是某个类的一个实体,当有对象之后,这些属性就有了属性值,这些行为就有了相应的意义。

2.类和对象的关系

类是来描述这类对象的统称。
对象是这个类的一个实例而已。
这一类对象所具备的共同属性和行为(方法)都在类中定义。
类相当于一个蓝图,一个范本,抽象的概念,有类之后我们就能根据类来产生一个具体的对象。
所有类的对象都是引用数据类型。,对于引用数据类型来说,默认值为null

3.创建类的语法

class 类名称{
//属性(实例属性,成员属性)
//行为(实例方法,成员方法)
}
a.类的命名使用有意义的大驼峰命名法
b.成员变量(例如:name,age,sex)都有默认值,默认值就是这个变量所在的类的默认值
在这里插入图片描述
成员变量可以在类定义是赋值,成员变量就地初始化。在这里插入图片描述

4.创建对象的语法

类名称 引用名称 = new 类名称()
例如:
Person per = new Person();
new Person:对象,在堆中存储
per:这个对象的引用(给这个对象起了个名字)
当产生一个类的对象之后,我们就可以使用"."操作符来使用该对象的属性和方法。
在这里插入图片描述
在这里插入图片描述

5.关于引用数据类型的特殊值null

null在java中表示"空引用",只有名字没有保存任何堆内存中的地址,如果直接使用值为null的引用去操作任何属性或方法(成员变量和成员方法)都会报错。

下面为调用了一个值为null的引用:空指针异常
在这里插入图片描述

二.static关键字

看见static,本能反应,和对象无关

1.static修饰

a.修饰属性:类属性,类变量,所有对象共享
b.修饰方法:类方法,工具方法
c.修饰代码块:静态代码块
d.修饰内部类:静态内部类

2.static使用

以下为例:
在这里插入图片描述
在这里插入图片描述
对于country这个属性值来说,他应该是很多个对象共有的一个属性,使用static修饰这个属性,该属性称为静态属性。
当一个实例对象被static关键字修饰,他就表示类的属性,该类的所有对象共享这个属性,所有对象的属性值大家都一样。
static修饰的属性在JVM方法区中存储,所有该类对象共享此属性。
static修饰的属性直接通过类名称就可以访问,无需通过对象访问。
在这里插入图片描述
所有该类属性都访问同一块内存
在这里插入图片描述
在这里插入图片描述
局部变量保存在栈中,而静态变量保存在方法区,局部变量出了方法就被栈回收了,而静态变量不会,所以在局部变量前不能加static关键字。
编译错误:
在这里插入图片描述

3.final和static区别

class Person{
final int age = 18;//成员常量,都在堆中存储
static String country = “中国”;//静态变量,在方法区中存储,所有Person的对象共享这个country属性
}
若在类中定义了一个常量:我们通常情况下会把stsatic和final共同使用,称为类的常量。

常量的命所有单词全部大写,多个单词使用下划线分隔。
static final String STUDENT_SCHOOL = “清华大学”
总结:
a.static变量称为类属性,在方法区中存储,该类的所有对象共享此变量。
b.若在类中定义了常量(定义时赋值),一般我们使用static和final共同修饰,称为全局常量。
c.要使用类属性,我们通常直接通过类名称,属性名称,不推荐使用对象来调用类属性,不规范。
static属性称为类属性,通过类名称直接访问,此时就没有对象也能调用(包含该类的null引用)
在这里插入图片描述

4.static修饰方法

static修饰方法称为类方法或工具方法,也是通过类名称直接访问,没有对象就能访问。在这里插入图片描述
为什么主方法是静态方法:
主方法是一个程序的入口,如果主方法是个成员方法,要通过对象调用,入口都没有,无法产生对象。
程序从主方法开始执行,主方法要能调用起来,静态方法,直接调用,无需产生对象。
静态变量能否访问成员变量和成员方法
不能,成员变量和成员方法必须产生该类对象才能访问

成员方法能否访问静态变量和静态方法
能,已经有对象了,可以访问

共享的变量如country属性,设计为静态变量
工具类的方法设计为static方法
Arrays.sort(int[])
Arrays.copyOf()都是Arrays提供的操作数组的方法,设计为static方法
看见static,都和对象无关,直接通过类名称访问静态属性和方法。

普通的类能否使用static关键字修饰
static class Person{
}
类定义出来要产生对象
在这里插入图片描述

三.面向对象的特性

面向对象一共有三大特性:
封装,继承,多态

1.封装

封装:保护性和代码的易用性(封装有很多种表现形式)
private实现属性和方法的封装只是封装的其中一种。private不能修饰外部类。
在Java中,所谓的权限修饰符就是指,你修饰的属性,方法和类,到底可见的范围有多大。

一共有四大访问修饰符,可见的范围由小到大依次为:
private<default(不要写这个关键字,啥权限也没有,就是default)-包访问权限<protected<public
被public修饰的东西,在当前程序中都是可见的,都是可以使用的。
被private修饰的属性和方法,只在当前类的内部可见,出了类的{},对外部就完全隐藏了,外部都不知道有其存在。

只有Bank类的内部是知道这三个属性
在这里插入图片描述
主方法存在于Bank类的外部,Bank类的私有属性就对其他类不可见了
在这里插入图片描述
主方法就存在于这个类的内部,私有属性当前类的内部是可见的,未报错:
在这里插入图片描述
在类的外部去使用这些私有属性,需要使用类提供的getter(取值)和setter(修改值)方法。
到底哪些属性需要提供getter让外部可见。
哪些属性需要提供setter让外部修改。
都要根据属性的特征来决定.
cardNum只可取
sal只能获取
password即可以取也可以改
在这里插入图片描述
阿里编码规范:java类中所有的成员变量一律使用private封装,并且根据属性的使用情况对外提供getter和setter方法。

四.构造方法

1.什么是构造方法

构造方法是类中非常特殊的一类方法,使用关键字new实例化对象时实际上就是调用该类的构造方法。
构造方法的作用就是产生对象,使用关键字new产生一个对象时,大致分为以下两步:
1.为对象在堆中分配一个空间。
2.调用对象的构造方法为对象成员变量赋值。

2.构造方法的语法规则

构造方法的语法规则有三点:
1.方法的名称与类名称完全相同。
2.构造方法没有返回值声明,(不是void)。
3.一个类中至少存在一个构造方法,若没有显示定义,编译器会生成一个默认的无参构造。
在这里插入图片描述
在这里插入图片描述
没有定义构造方法,编译之后,编译器会生成一个默认的无参构造。
在这里插入图片描述
当类中定义了构造方法,则默认的无参构造就不再生成。
在这里插入图片描述
在这里插入图片描述

3.构造方法的重载

构造方法是为了类中成员变量赋值的,此时重载只可能是参数的个数不同(为不同成员变量赋值)
在这里插入图片描述
在这里插入图片描述

五.this关键字

this表示当前对象的引用

1.this关键字修饰

a.调用当前对象的成员变量
b.调用当前对象的方法(1.调用不同成员方法2.构造方法的互相调用)
c.表示当前对象的引用

2.调用当前对象的成员变量

程序的设计理念,就近匹配原则,编译器找最近的相同名称的变量在哪
形参自己等于自己,对成员变量无影响
在这里插入图片描述
在这里插入图片描述
如何打破就近匹配原则,从类中匹配变量,使用this关键字
在这里插入图片描述

3.this调用类中的方法

a.this调用类中的成员方法
在这里插入图片描述
b.this表示构造方法间的相互调用
this调用其它构造方法必须放在当前构造方法的首行
this调用构造方法不能成环。
若不同构造方法之间出现了重复的调用,可以使用this(参数)调用其他的构造方法
在这里插入图片描述

六.代码块

代码块,指的就是使用{}括起来的一段代码称为代码块,根据定义的代码块的位置以及关键字的不同,分为普通代码块,成员代码块,静态代码块,同步代码块

1.普通代码块

定义在方法中,使用{}括起来的代码块在这里插入图片描述

2.成员代码块

直接定义在类中,使用{}括起来的不加任何修饰符的代码块,也叫构造块,优先于构造方法执行,有几个对象产生,就调用几次构造块。
在这里插入图片描述
构造块优先于构造方法执行
在这里插入图片描述

3.静态代码块

静态代码块定义在类中,使用static修饰的代码块,在类加载时执行一次,y与对象无关,无论产生多少对象。
在这里插入图片描述
主类中静态代码块优先于主方法执行,JVM要执行主方法,首先得加载主类,主类一加载,静态块就执行了。
在这里插入图片描述

七.匿名对象

匿名对象->new出来的对象,没有引用指向,使用一次后就是销毁,就再也用不成了。
匿名对象常用于测试类中的某些功能,使用一次后就被JVM销毁。
在这里插入图片描述

八.toString方法

当一个引用类型的变量调用println函数打印时,默认输出的都是引用类型的地址。(不是真正的内存地址,java中,程序员是无法知道任何确切的内存地址。)
大概率我们调用打印函数打印一个引用的时候,打印这个对象具体属性值内容==>实现toString();
在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值