目录
对象数组
前言
Java是一种面向对象语言,面向对象编程主要体现在封装性、继承和多态。而本文中将详细讲类的封装
类
什么是类?
类是Java程序的基本要素,由关键字class定义。
class 类名{
类体的内容
}
注:类名首字母使用大写字母,类名最好任意识别。
类使用类体来描述所抽象的属性和行为(类声明之后的一对大括号以及它们之间的内容称为类体。类体的内容由变量(属性)和方法(行为)组成。【方法,其实也就是c语言里面的函数】
成员变量
访问修饰符 属性类型 属性名;
eg:public int a;
1. 成员变量的类型可以是Java中的任何一种基本类型,包括基本类型和引用类型。
2. 成员变量的默认值:在声明成员变量时如果没有指定初始值,Java编译器会为其指定默认值。【boolean:false;byte、short、int和long变量:0;char:'\0';float和double:0.0;“引用型”变量(数组及对象):null】
3. 属性注意细节:
1)属性的定义语法同变量【示例:访问修饰符 属性类型 属性名;( 访问修饰符:控制属性的访问范围 ;四种访问修饰符:public,protected;默认;private;)】
2)属性的定义类型可以为任意类型,包含基本类型或引用类型
3)属性如果不赋值,有默认值,规则和数组一致。
成员方法
访问修饰符 返回数据类型 方法名(形参列表){//方法体
语句;
return 返回值;
}
1. 方法的使用
- 访问修饰符(作用是控制 方法的范围) 如果不写默认访问【四种:public,protected,默认,private】
- 返回数据类型:1)一个方法最多只有一个返回值【返回值的类型必须与return值的类型一致或兼容】;2)返回类型可以为任意类型,包含基本类型或引用类型(数组,对象);3)方法是void,则方法体中可以没有return语句(或写 return;)
- 方法名:遵循驼峰命名法(第一个单词首字母小写,其余单词的首字母均大写)
- 参数列表(形参列表):1)一个可以可以有0个参数,也可以有多个参数,中间用逗号隔开;2)参数类型可以为任意类型,包含基本类型或引用类型;3)调用带参数的方法时,一定对应着参数列表传入相同类型或兼容类型的参数;4)方法定义时的参数称为形式参数(形参),方法调用时的传入参数称为实际参数(实参),实参和形参的类型要一致或兼容、个数、顺序必须一致
2. 方法的调用:
- 同类中的方法直接调用
- 跨类的方法调用:通过对象名调用:对象名.方法名【eg:A.b()】-----跨类的方法调用和方法的访问操作符有关
3. 方法注意细节:
- 执行方法时,就创建一个新的受保护的独立空间(栈空间)
- 方法的局部变量是独立的,不会相互影响
- 成员方法传参机制:基本数据类型传递的是值(值拷贝)(形参不会影响实参),引用类型传递的是地址(形参影响实参)
- 方法不能嵌套定义
class Cat{
//成员变量
private String name;
//成员方法
public void Playing(){
System.out.println("Cat is playing");
}
}
方法重载Overload
- 基本介绍: java中允许同一个类中,多个同名方法的存在,当要求 形参列表不一致!
- 优点: 代码美观(减少起名)
- 注意事项: 1)方法名:必须相同; 2)参数列表:必须不同(参数类型或个数或顺序,至少有一样不同,参数名无要求); 3)返回类型:无要求 【只有返回类型不同或者参数列表中的名称不同不构成重载】
public int sum(int n1,int n2){
return n1 + n2;
}
public int sum(int n1,int n2,int n3){
return n1 + n2 + n3;
}
public double sum(double n1,double n2){
return n1 + n2;
}
可变参数
- 概念:java允许将同一个类中多个同名同功能但参数个数不同的方法,封装成一个方法就可以通过可变参数实现
- 基本语法: 访问修饰符 返回类型 方法名(数据类型…形参名){}
- 注意细节:1. 可变参数的实参可以为0个或任意多个 ; 2. 可变参数的本质就是数组; 3. 可变参数可以同普通类型的参数放在形参列表,但必须保证可变参数在最后; 4. 一个形参列表中只能出现一个可变参数
public int sum(int...nums){
int total = 0;
for (int i = 0; i < nums.length; i++) {
total += nums[i];
}
return total;
}
构造方法
-
基本介绍
- 构造方法:类的一种特殊方法,也叫构造器(constructor),主要作用是完成对新对象的初始化
- 特点:
- 方法名和类型相同
- 没有返回值
- 在创建对象时,系统会自动地调用该类的构造器完成对象的初始化
-
基本语法
[修饰符] 方法名 (形参列表){ 方法体;}
- 构造器的修饰符可以默认,也可以是public,protected、private
- 构造器没有返回值
- 方法名和类名字必须一样
- 参数列表和成员方法一样的规则
- 构造器的调用系统完成
-
注意细节
1. 一个类可以定义多个不同的构造器(即构造器重载 );2. 构造器名和类名要相同 并且没有返回值; 3. 构造器是完成对象的初始化,表示创建对象; 4. 在创建对象时,系统自动调用该类的构造方法; 5. 如果类中没有构造器,系统会自动给类生成一个默认无参构造器(也叫默认构造器),使用javap指令反编译可以查看;6. 在类中定义了一个构造器,默认的构造器就会被覆盖,要使用默认无参构造器必须进行显式的定义【即:Person(){}】
class Person{
public Person(){
//无参构造器
}
public Person(int name){
//有参构造器
}
}
对象的创建
1.创建对象
1)先声明在创建 :Cat cat;//声明对象 cat cat=new Cat();//创建
2)直接创建 :Cat cat=new Cat();
Java内存结构:
栈:存放基本数据类型(局部变量)
堆:存放对象(Cat cat,数组等)
方法区:常量池【常量、字符串等】,类加载信息
Java创建对象的流程:
1)加载类信息(属性和方法信息,只会加载一次)
2)在堆中分配空间,进行默认初始化
3)把地址赋给所起的名字(eg:dog)
public static void main(String[] args) {
Dog dog = new Dog("Mike");
Dog dog1;
dog1 = new Dog("Jimmy");
dog.play();
//直接调用方法
new Dog("Tom").play();
}
this关键字
基本介绍:this代表当前对象,可以用来访问本类中的属性、方法、构造器
注意细节:1. this用于区分当前类的属性和局部变量 ;2.访问成员方法的语法:this.方法名(参数列表) 3.访问构造器语法:this(参数列表);注意只能在构造器中使用 ;4. this不能在类定义的外部使用,只能在类定义的方法中使用
class Dog{
private int age;
public String name;
public Dog(String name){
this.name = name;
}
public Dog(String name,int age){
this(name);
this.age = age;
}
}
包
基本介绍:包是Java语言有效地管理类的一个机制。在不同Java源文件中可使用包名区分名字相同的类
包的作用: 1、区分相同名字的类 2、当类很多时,可以很好的管理类 3、控制访问范围
本质:创建不同的文件夹来保存类文件
基本语法:用package来声明包文件
命名规则:只能包含数字、字母、下划线、小圆点,但不能用数字开头,不能是关键字或保留字
导入包:import语句来导入包,可以在类中引入包中的类和接口
package 包名;
例如:package sun;//sun包
package sun.sunrise;//在sun包里面的sunrise包
使用细节:
1、package需要放在类的最上面,一个类中最多,只有一句package
2、import指令,位置放在package的下面,在类定义前面,可以有多句(没有顺序要求)
访问修饰符
java提供了四种访问控制修饰符控制方法和属性(成员变量)的访问权限(范围)
- 公开级别:用public修饰,对外公开
- 受保护级别:用protected修饰,对子类和同一个包中的类公开
- 默认级别:没有修饰符号,向同一个包的类公开
- 私有级别:用private修饰,只有类本身可以访问,不对外公开
访问级别 | 访问控制修饰符 | 同类 | 同包 | 子类 | 不同包 |
公开 | public | √ | √ | √ | √ |
受保护 | protected | √ | √ | √ | × |
默认(友好) | 没有修饰符 | √ | √ | × | × |
私有 | private | √ | × | × | × |
使用细节:
- 修饰符可以用来修饰类中 的属性,成员方法以及类
- 只有默认的和public才能修饰类,并且遵循上述访问权限的特点
- 成员方法的访问规则和属性完全一样
番外
基本类型的封装
Java的基本数据类型包括boolean、byte、short、char、int、long、float和double。Java在java.lang包中提供了与基本数据类型相关的类Boolean、Byte、Short、Character、Integer、Long、Float和Double,实现了对基本数据类型的封装。
char c='A';
if(Character.isLowerCase(c)){
c=Character.toLowerCase(c);
}
System.out.println(c);
var局部变量
var可以声明局部变量(仅限于在方法体内使用var声明局部变量
var是保留类型名称,不是关键字。在JDK10开始,var也可用作变量或方法的名称。但是,var不能再用作类或接口的名称(如果维护的代码需要使用JDK10之后的环境,就需要修改类名或接口名是var的那部分代码
void f(double d){
var width = 108;
var height = d;
var date = new date();
width = 3.14;//非法,width的类型确定为int类型
var str;//非法,无法判断str类型(必须显式指定)
var what = null; //非法,无法判断类型
}
注意事项:
1. 在类的类体中,不可以用var声明成员变量(只能在方法体内)
2. 使用var声明局部变量时,必须显式地指定初始值(初始值不能为null)
3.方法的参数和方法的返回类型不可以用var来声明
对象数组
概念:数组的元素的对象
Dog[] dogs=new Dog[10];
for(int i=0;i<dogs.length;i++){
dogs[i]=new Dog("id:"+i);
}
总结:类是组成Java源文件的基本元素,一个源文件是若干个类组成的,类体由成员八零和方法组成。类的构造器可以初始化对象,导入包可以使用包内的类和接口,访问修饰符控制了方法和属性的访问范围。