自然界事物由许多实体(对象)组成,相似的对象划分为一类
类:同一类型对象(事物)的抽象描述,定义了这一类对象共同的静态和动态属性
对象:计算机语言对一个具体事物的描述,静态属性(成员变量)和动态属性(方法)的封装体
属性:事物的静态状态
方法:事物的动态行为
类和对象的关系:类是对象的抽象(一组具有共同特征的对象的模板),对象是类的具体实例
定义一个类,必须使用的关键字是class
类的组成:属性(成员变量)和方法(成员方法)
成员变量:类的属性
成员方法:类的行为
必考事项:
1.可以有一个或多个class
2.public修饰的类的名字要跟类文件名称相同,包括大小写
3.一个类生成一个字节码文件(注:不是一个类文件生成一个字节码文件)
4.可以有零个或一个用public修饰的类
5.无public修饰的class不能跨包访问
数据成员(成员变量)
定义形式:权限修饰符 类型 成员名;
成员变量创建对象时自动初始化
权限修饰符private修饰的成员变量,只能在本类中访问(封装性)
成员变量类型有八种数据类型和一种对象类型
对象类型又叫引用类型
特殊初始化值:long类型的初始化值为0L,对象类型的初始化值为null
基本数据类型是Java内嵌的,在任何操作系统中都具有相同大小和属性;而引用类型数据是在Java程序中由编程人员自己定义的类型
java调用属性的方式为对象名.属性名
java调用方法的方式为对象名.方法名
定义形式:
修饰符 返回值类型 方法名([参数类型 参数名]){
方法体语句;
}
return:表示方法的返回
格式:return 返回值
return 0;
void:表示方法无返回值,可以用return结束,return后面不加值
方法中可以有多句return
方法的定义不能嵌套
空方法
无参方法与有参方法
如果是九种数据类型,可以加return
不是所有的方法都需要写return。int表示方法中有返回值,需要些return,而且必须在return后面写值的类型,在方法中返回值一致或可进行隐式转换
创建对象的步骤:
1.为对象在堆区中创建内存,并初始化成员变量为0或null
2.执行显式初始化
3.执行构造方法
4.对象的引用赋值给引用变量(将句柄指向对象)
类创建对象的形式:
一般格式:类名 对象名=new 类名([参数]);
注:创建对象的等价形式:
类名 对象名;
/|\声明引用类型变量,不分配内存
对象名=new 类名([参数])
/|\为对象分配内存,创建对象
/|\为引用变量分配内存,指向对象(实质是指针)
成员变量和成员方法属于对象
类的初始化时自动发生的,比如创建类的实例,调用类的静态方法
通过一个类创建对象要用new关键字
一个对象调用某个方法需要满足的条件:
1.new创建成功
2.权限修饰符可被调用
3.用对象名.方法名有参转无参调用
对象如何引用对象的属性和方法?
答:通过对象名.属性/方法名,前提是属性可以被调用
jvm将内存分为几块,都分别存放什么?
三块,栈区、堆区、方法区
(1)同一类的每个对象的成员变量占用不同的存储空间
(2)引用类型的局部变量存放在栈内存中
(3)对象是通过new产生的,位于堆内存,类的每个成员变量在不同的对象中可能有不同的值(静态变量除外)
(4)方法仅一份,存放在方法区,执行时分配内存。同一类的每个对象共享该类的代码
通过一个类可以创建多个对象,这些多个对象占用不同的内存空间,多个对象的方法占用相同的内存空间
对象存在与内存的堆区中,方法区存放的是方法的字节码
类信息放在内存的方法区
成员变量在堆区中对象里,局部变量在栈区里
引用变量就是对象名,存对象在堆区中的地址
方法区的成员方法字节码,没有对象的情况下不可以调用到
写在类中的变量叫成员变量、全局变量、属性
定义在方法或语句块中的变量叫局部变量
成员变量会默认初始化
局部变量必须先初始化,否则会报错
成员变量和局部变量同名,局部变量会将全局变量屏蔽掉
成员变量在整个类中都可以使用
局部变量只能在定义它的方法或语句块中使用
成员变量如果没有显式初始化,系统会指定默认值,它的生存期是从对象的创建到该对象的销毁
局部变量必须先显式初始化再使用,它的生存期是从初始化(不是定义)开始到方法或语句块调用结束
封装性:属性私有化,为外部提供获取属性值的get方法和设置属性值的set方法
使用权限修饰符private修饰属性
封装就是隐藏对象的属性和实现细节,仅对外提供公有的方法
面向对象的三大特征是封装、继承和多态
面向对象的特点主要可以概括为封装性、继承性和多态性
1.其中封装是面向对象核心思想,将对象的属性和行为封装起来,不需要外界知道具体实现细节,这就是封装思想
2.继承性主要描述的是类与类之间的关系,通过继承,可以在无需重新编写原有类的情况下,对原有类的功能进行扩展
3.多态性指的是在程序中允许出现重名现象,它只在一个类中定义的属性和方法被其它类继承后,它们可以具有不同的数据类型或表达出不同的行为,这使得同一个属性和方法在不同的类中具有不同的语义
权限修饰符修饰类的成员变量与方法时的访问范围:
关键字 | 同一个类中 | 同一个包中 | 派生类中不在包中 | 其它包中 |
public | √ | √ | √ | √ |
protected | √ | √ | √ | |
无访问修饰符(default) | √ | √ | ||
private | √ |
针对类、成员方法和属性,Java提供了4中访问控制权限,分别是private、default、protected、public
对于声明为private、protected以及public的类成员在类外部都不能访问
在同包下的不同类中,除了private修饰的变量外都可以被访问到
在不同包中,除了public修饰的属性可以被访问到,其它的修饰都不可以
权限修饰符都可以修饰属性、方法和类
方法的括号中有参数叫有参方法,有参数时,多个参数用逗号隔开
形参:方法定义时写在方法括号里的参数,没有真实的值
实参:方法调用时写在方法括号里的参数,有真实的值
规则:永远都是实参给形参赋值
值传递:八种基本数据类型,传递后不会对原来变量有影响
引用传递:引用类型数据,有影响Java中只有值传递,没有引用传递
值传递和引用传递都是在方法调用实参和形参赋值时候发生的
两个位于不同包里面的类,如果要相互使用,并且不报错,必须先导包,然后创建对象才能使用另一个对象中的属性和方法
构造方法的作用是给对象进行初始化工作的,为实例变量赋予合适的初始值
实例变量又叫成员变量、全局变量、属性
构造方法的特点:
1.构造方法的方法名必须跟类名相同,包括大小写
2.构造方法没有返回值类型,也不能使用返回值类型修饰(在构造方法名的前面没有返回值类型的声明,在构造方法中不能使用return语句返回一个值)
3.如果有显示定义的构造方法,编译器就不会给我们添加无参的构造方法,如果没有显示定义的构造方法,编译器就会添加一个无参的构造方法。赋值顺序是默认初始化到构造方法初始化
构造方法不能通过直接调用方法的方式调用,而是通过this关键字调用,从而创建对象
Student s=new Student();
Student s1=new Student(1,'L',100);
这两句创建对象有什么相同和不同点?s和s1被称为什么变量?
相同点:都是创建一个Student对象
不同点:第一句没有传入任何参数给构造方法,会调用无参的构造方法
第二句向构造方法传递了三个参数
s和s1被称为引用变量,它们存储了对Student对象在内存中的引用,可以用来操作和访问这些对象的属性和方法
在同一个类中,方法名相同,参数不同,一个方法称为另一个方法的重载方法
方法重载的条件:
1。在同一个类中
2.方法名相同
3.参数的个数、类型、顺序至少有一个不同
构造方法可以重载,构造方法没有返回值,且不用void声明
重载方法的调用:
1.利用调用时候的实参数区分调用的是哪个重载方法
2.方法的实参与形参类型相同或兼容、个数相同、顺序一致
代码执行时,jvm如何确定我们调用的是哪个方法?
答:如果类中没有方法重载,用方法名调用即可;有重载方法,用方法名、参数个数、类型、顺序来区分调用哪一个方法
静态属性也叫类变量还叫静态变量,属于类的
静态变量是在类加载的时候初始化的
静态常量是由于是在类加载的时候初始化,所以要在声明的同时初始化,否则编译报错
没有静态的局部变量
静态变量和静态常量如何调用?
1.类名.静态变量名或静态常量名(推荐使用)
2.对象名.静态变量名或常态变量名
Static块,为类进行初始化工作的,实际就是静态属性初始化
都是类加载的时候运行,会按照顺序结构执行
非static方法中能处理static和非static的成员
静态方法如何调用?
1.类名.静态方法名
2.对象名.静态方法名
this(no,name,age)//必须放在第一行
减少代码行数,提高代码的复用性
this的三种用法?
1.当全局变量和局部变量同名时,可以使用this关键字解决屏蔽问题
2.在一个构造方法中调用其它的构造方法,只能放在第一行
3.在一个实例方法中,访问当前实例的引用(作为方法的实参传递)
主调方法:主动调用其它方法的方法
被调方法:被其它方法调用的方法
this表示对象本身,谁调用此方法,在这个方法运行过程中this表示的就是谁
静态方法的定义形式为:
权限修饰符 static 返回值类型 方法名([参数类型 参数名]){方法体}
静态方法中不能直接调用非静态的属性和非静态的方法,但是可以直接调用静态属性和静态方法
如果非要在静态方法中调用非静态成员可以通过创建对象的形式进行间接调用
在非静态方法中,可以直接调用静态变量、静态方法、非静态变量、非静态方法
静态常量必须在定义时初始化,且只在类加载时被初始化一次
因main方法是静态方法,所以可以在其它类中直接调用
对象使用构造方法和静态块时初始化