文章目录
一.类与对象
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();