首页 > 技术文章 > 7.数组中常见异常、类与对象一(类的成员:属性、方法)

sun1997 2020-03-04 15:53 原文

数组中常见异常

1.数组角标越界的异常:ArrayIndexOutOfBoundsException

package com.atguigu.java;
public  static void main(String[] args){
          int[] arr = new int[]{1,2,3,4,5};//角标范围【0-4】
          for(int i = 0; i<=arr.length; i++){
                  System.out.println(arr[i]);
          }
}

2.空指针异常:NullPointerException

//情况一
int[] arr1 = new int[]{1,2,3};
arr1 = null;
System.out.println(arr1[0]);

//情况二
int[][] arr2 = new int[4][];
System.out.println(arr2[0]);//null
System.out.println(arr2[0][0]);//空指针异常

//情况三
String[] arr3 = new String[]{"aa","bb","cc"};
arr3[0] = null;
System.out.println(arr3[0].toString());//arr3[0]相当于一个对象,对象为空

在没有处理异常的情况下,一旦程序出现异常,就终止执行。

 

面向对象

/*
 * 一、Java面向对象学习的三条主线:、
 * 1.Java类及类成员:属性、方法、构造器;代码块、内部类
 * 2.面向对象三大特征:封装、继承、多态、抽象
 * 3.其它关键字:this、super、static、final、abstract、interface、package、import
 *
 * 二、面向对象的两个要素
 * 类:对一类事物的描述,是抽象的、概念上的定义
 * 对象:是实际存在的该类事物的每个个体,因而也称为实例(instance)
 * 面向对象程序设计的重点是类的设计
 * 设计类,就是设计类的成员
 *
 * JVM内存结构
 * 编译完源程序以后,生成一个或多个字节码文件
 * 我们使用JVM中的类的加载器和解释器对生成的字节码文件进行解释运行。
 *     意味着,需要将字节码文件对应的类加载到内存中,涉及到内存解析
 *
 * 虚拟机栈:我们将局部变量存储在栈结构中
 * 堆:我们将new出来的结构(比如:数组、对象)加载在堆空间中。
 *    对象的属性(非static的)加载在堆空间中
 * 方法区:类的加载器、常量池、静态域
 *
 */

package com.atguigu.java;
/*
 * 一、设计类,就是设计类的成员
 * 属性 = 成员变量 = field = 域,字段
 * 方法 = 成员方法 = 函数 = method
 * 
 * 创建类的对象 = 类的实例化 = 实例化类
 * 
 * 二、类和对象的使用(面向对象思想落地的实现)
 * 1.创建类、设计类的成员
 * 2.创建类的对象
 * 3.通过“对象.属性”或“对象.方法”调用对象结构
 * 
 * 三、如果创建了一个类的多个对象,则每个对象都独立的拥有一套类的属性(非static的)
 *    意味着:如果我们修改一个对象的属性a,则不影响另外一个对象属性a的值
 */
public class PersonTest {
 public static void main(String[] args) {
  //2.创建Person类的对象
  Person p1 = new Person();
  //Scanner scan = new Scanner(System.in)
  
  //调用对象的结构:属性、方法
  //调用属性:“对象.属性”
  p1.name = "Tom";
  p1.isMale = true;
  System.out.println(p1.name);
  
  //调用方法:“对象.方法”
  p1.eat();
  p1.sleep();
  p1.talk("chinese");
  
  Person p2 = new Person();
  System.out.println(p2.name);
  System.out.println(p2.isMale);
  
  Person p3 = p1;
  System.out.println(p3.name);//Tom
  
  p3.age = 10;
  System.out.println(p1.age);//10  
 } 
}
class Person{
 //属性
 String name;
 int age = 1;
 boolean isMale;
 
 //方法
 public void eat() {
  System.out.println("人可以吃");
 }
 public void sleep() {
  System.out.println("人可以睡觉");
 }
 public void talk(String language) {
  System.out.println("人可以说"+language);
 }
}

类和对象的内存解析 

1.堆(heap):存放对象

2.栈(stack): 存储局部变量等

3.方法区(method area) :用于存储被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据

package com.atguigu.java;
/*
 * 类中属性的使用
 * 
 * 属性(成员变量)   局部变量
 * 1.相同点
 * ①定义变量的格式:数据类型 变量名 = 变量值
 * ②先声明后使用
 * ③变量都有其对应的作用域
 * 
 * 2.不同点
 *   ①在类中声明的位置的不同
 *   属性:直接定义在类的一对{}内
 *   局部变量:生命在方法内、方法形参、代码块内、构造器形参、构造器内的变量
 *   
 *   ②关于权限修饰符的不同
 *   属性 :可以在声明属性时,指明其权限,使用权限修饰符
 *             常用的权限修饰符:private、public、缺省、protected
 *   局部变量:不可以使用权限修饰符
 *   
 *   ③默认初始化值
 *   属性:类的属性,根据其类型,都有默认初始化值
 *       整型:byte、short、int、long:0
 *       浮点型:float、double:0.0
 *       char:0
 *       布尔boolean:false
 *       引用数据类型:null
 *   
 *   局部变量:没有默认初始化值
 *     意味着,我们在调用局部变量之前,一定要显示赋值
 *     特别地:形参在调用时,我们赋值即可
 *   
 *   ④在内存中加载的位置不同
 *   属性:加载到堆空间
 *   局部变量:加载到栈空间
 *   
 */
public class UserTest {
 public static void main(String[] args) {
  User u1 = new User();
  System.out.println(u1.name);
  System.out.println(u1.age);
  System.out.println(u1.isMale);
  
  u1.talk("日语");
 }
}
class User{
 //属性(成员变量)
 String name;
 int age;
 boolean isMale;
 
 public void talk(String language) {//language:形参,也是局部变量
  System.out.println("我们使用"+language+"交流");
 }
 
 public void eat() {
  String food = "烙饼";//局部变量
  System.out.println("北方人喜欢吃:" + food);
 }
 
 
}
package com.atguigu.java;
/*
 * 类中方法的声明和使用
 * 
 * 方法:描述类应该具有的功能
 * 比如: Math类:sqrt、random
 *     Scanner类:nextXxx()
* arrays[]:sort()/binarysearch()/toString()/equals()…… * * 1.举例 * public void eat() {} * public void sleep(int hour) {} * public String getName() {} * public String getNation(String nation) {} * * 2.方法的声明:
* 权限修饰符 返回值类型 方法名(形参列表){ * 方法体; * } * 注:static final abstract 来修饰的方法,后面描述 * * 3.说明 : *①权限修饰符 : * Java规定的4种权限修饰符:private、public、缺省、protected -封装性 * *②返回值类型:有返回值 和无返回值 *如果方法有返回值,则必须在方法声明时,指明返回值的类型。同时,方法中需要使用 * return关键字来返回指定类型的变量或常量。 * public String getName() { * return name;变量 * //return "Tom";常亮 * } * *如果方法没有返回值,则方法声明时,使用void来表示,通常不使用return,但是使用的话, * 只能用“return;”表示结束此方法的意思 * *③方法名:属于标识符,遵循标识符的规则和规范,见名知意 * *④形参列表:方法可以声明0个、1个、或多个形参 * 格式:数据类型1 形参1,数据类型2 形参2,… * *⑤方法体:方法功能的体现 * * *4.return关键字使用 * 1.使用范围:使用在方法体中 * 2.作用:①结束方法 * ②针对于有返回值类型的方法,使用“return 数据(变量或常量)”方法返回所要的数据 * 3.注意点:return后面不可以声明语句 * * * 5.方法的使用中,可以调用当前类的属性和方法 * 特殊:方法A中有调用方法A 称为递归 * 方法中不能定义方法
*
*/ public class CustomerTest { public static void main(String[] args) { Customer cust1 = new Customer(); cust1.eat(); } } class Customer{ String name; int age; boolean isMale; public void eat() { System.out.println("客户吃饭"); } public void sleep(int hour) { System.out.println("休息了"+hour+ "几个小时"); } public String getName() { return name; } public String getNation(String nation) { String info = "我的国籍是" + nation; return info; } }

 

 

推荐阅读