博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA数组和面向对象
阅读量:6709 次
发布时间:2019-06-25

本文共 9413 字,大约阅读时间需要 31 分钟。

(一)数组

  • 数组:可以存储多个元素并且多个元素是 同一种类型的容器

    数组的 定义:

    数据类型[] 数组名;
    数据类型 数组名[];

    举例:

    int[] a; 定义了一个int类型的数组变量a
    int a[] ; 定义了一个int类型 变量a数组

    这两种方式的定义:虽然写法不一样,并且读法不一样,但是表达的效果一样,都是在定义一个数组,推荐使用第一种方式;

    数组的初始化:

    1)动态初始化: 给数组指定长度,数组中的元素值由系统默认给定
    2)静态初始化: 给定数组中元素的值,数组的长度由系统给定;

    动态初始化:

    数据类型[] 数组名 = new 数据类型[数组长度] ;

    静态初始化:

    指定数组的元素,长度由系统给定
    定义个数:
    原始格式:
    数据类型[] 数组名称 = new 数据类型[]{元素1,元素2,元素3....} ;
    简写方式:
    数据类型[] 数组名称= {元素1,元素2,元素3..} ;

    注意:数组中经常会出现的异常:

    ArrayIndexOutOfBoundsException:数组角标越界异常
    出现的原因:访问了数组中不存在的索引值;
    解决方案:观察数组中到底有索引值到多少; 数组长度-1
    NullPointerException:空指针异常 (在实际开发中该异常是最多的)
    出现的原因:对象为null,而开发者还要去使用对象,就会出现问题
    解决方案:给某个对象进行非空判断,防止程序程序空指针异常

    (二)面向对象

1、讲面向对象之前:

面向过程:
假设有一个需求:求数组中的最大值;
定义一个数组,静态初始化---->定义一个参照物---->遍历....
给一个需求,对需求分析,然后一步一步进行操作,最终得到某一个结果,整个过程都是自己在完成....

面向对象的思想概述:

思想的特征:
1)面向对象更符合我们的生活中的行为思想习惯
2)面向对象将我们从执行者变成了指挥者,指挥对象做事情
3)面向对象简单性体现在这里:让我们事情从复杂性--->简单化

举例:        洗衣服:            面向过程:脱下脏衣服--->放到一个盆里面--->加水,洗衣液---->泡一泡--->搓一搓---->拧一拧----->        晾一晾            面向对象:脱下脏衣服--->放到一个全自动洗衣机中--->一键---->晾一晾        炒菜:            面向过程:买菜--->摘菜--->洗菜--->切菜--->炒菜--->出锅            面向对象:找一个对象..--->出锅...

举例:

把大象装进冰箱

1)装大象的方法in()    2)开冰箱门:open()    3)关闭冰箱门:close()        面向过程:        class Test{            main(..){                //分别调用三个方法                open();                in();                close();            }            //开冰箱门            public static void open(){                System.out.println("开冰箱门...") ;            }            //装大象            public static void in(){                System.out.println("把大象塞进冰箱") ;            }            //关闭冰箱门            public static void close(){                System.out.println("开冰箱门...") ;            }        }面向对象:        把大象装进冰箱 :   名词提取法:  大象类,冰箱类,测试类        class 大象类{            public static void in(){                System.out.println("把大象塞进冰箱") ;            }        }        class 冰箱类{            public static void open(){                System.out.println("开冰箱门...") ;            }            public  static  void close(){                System.out.println("开冰箱门...") ;            }        }        class Test{            main(){                类名.方法名() ;                大象类.in() ;                冰箱类.open();                并迅雷.close() ;            }        }

面向对象的三大特征:

封装
继承
多态
向对象语言中现实世界的事物在代码中如何体现的{

学生    属性:姓名 年龄 性别 ...学号    行为:学习,打游戏....

学生现实世界的事物------>代码 学生类:Student

属性:属性:姓名 年龄 性别 ...学号 成员变量:name,age,sex...
行为:学习,打游戏.... 成员方法:study(),playGame();

总结:        面向对象                :将事物看成XX类,将事物对应的属性--->看成这个类的成员变量                    将事物对应的行为----->看成这个类的成员方法

描述一个学生事物,

属性:姓名,年龄,性别,学号
行为:学习

在Java中,创建对象:new对象

类名 对象名 = new 类名() ;
public class Student {

//成员变量String name ;int age ;String gender ;int Id ;//成员方法:学习的方法//先去掉staticpublic void study() {    System.out.println("学生在学习Java.....") ;}

}
}

public class StudentTest {

public static void main(String[] args) {    //创建一个学生对象

// 格式: 类名 对象名 = new 类名() ;

Student s = new Student() ;
//System.out.println(s);//org.westos.oop.Student@70dea4e 包名.类名@(地址值标记)16进制数据
System.out.println("学生的姓名是:"+s.name+",年龄是:"+s.age+",性别是:"+s.gender+",学号是:"+s.Id);

//给学生对象进行赋值    s.name = "张三" ;    s.age = 21 ;    s.gender = "男" ;    s.Id = 007 ;    System.out.println("学生的姓名是:"+s.name+",年龄是:"+s.age+",性别是:"+s.gender+",学号是:"+s.Id);    //调用Student类中的成员方法    //对象名.成员方法名() ;    s.study(); }

}

2、匿名对象
就是创建对象的时候,没有名字的对象
例如:
创建一个有名字的学生类对象
Student s = new Student() ;//该对象名s
匿名对象(开发中经常使用),没有名字的对象
new Student().name = "赵又廷" ;
匿名对象在实际开发中,只用使用一次,不要使用多次 (可能会造成一个内存溢出的现象);
new Student() ; //一直给堆内存开辟空间
3、形式参数
形式参数的问题:
如果是基本数据类型,形式参的改变对实际参数没有影响
研究引用类型:形式参数的改变会直接影响实际参数
例如:
class Demo{

//求和的成员方法public int sum(int a,int b) { //形式参数是基本类型  :    return a+b ;}

}

//一个学生类

class Student{
public void show() {
System.out.println("好好学习,天天向上....");
}
}

class StudentDemo{

//method方法中形式参数是一个引用类型:需要的是学生类对象 Student s = new Student () ;
public void method(Student s) {//形式参数现在引用类型
s.show();
}
}

//测试类

public class ArgsTest {

public static void main(String[] args) {    //创建Demo类对象    Demo d = new Demo() ;    System.out.println(d.sum(10, 20)) ;    System.out.println("-------------------------");    //需求:调用StudentDemo中的method方法:如何调用    //1)创建StudentDemo类对象    StudentDemo sd = new StudentDemo() ;    //2)形式参数是Student类型,所以创建Student类的对象    Student s = new Student() ;    sd.method(s);}

}

4、private关键字
private的用法:
1)被private修饰的只能在本类中访问
2)可以通过公共的访问public 去间接访问

当成员变量和局部变量一致时,遵循就近原则。列如:class Phone{//私有修饰        private String brand ;        private int price ;        private String color ;//成员方法//提供公共的访问方法public void setBrand(String brand) {        brand = brand ;}//获取手机品牌public String getBrand() {        return brand ;}public void setPrice(int p) {    price = p ;}public int getPrice() {    return price ;}public void setColor(String c) {    color = c ;}public String getColor() {    return color ;}

}

//测试类

public class PhoneDemo {

public static void main(String[] args) {    //创建手机类对象    Phone p = new Phone() ;

// p.brand = "" ; 已经被私有化了

// System.out.println(p.brand+"----"+p.price+"---"+p.color);
p.setBrand("小米");
p.setPrice(1699);
p.setColor("黑色");
System.out.println(p.getBrand()+"---"+p.getPrice()+"----"+p.getColor());

}

}

成员变量:姓名和年龄
测试这个学生类

分析:

刚才通过下面代码给学生的年龄赋值了一个不合理的数据,而这种不合理的数据依然可以被输出出来,有问题!
解决方案?
在Student类中提供一个针对年龄的判断的一个方法

虽然提供了这一个方法,但是成员变量在测试类中永远被访问到,针对这种情况:Java提供了关键字:private:私有的

private:体现的也是一种封装思想

封装:
标准类的写法,将成员变量全部私有化,被private修饰的成员变量只能在本类中访问,可以通过公共的访问方法去访问成员变量
5、构造方法以及创建对象的过程
一个标准类的写法:
学生类
成员变量:姓名,年龄,性别
成员方法:set/getXXX()
学习,睡觉...

构造方法:            无参构造:            有参构造

一个标准手机类的写法:

class Student{
//成员变量
private String name ;
private int age ;
private char gender ;

//无参构造方法public Student() {}//有参构造public Student(String name,int age,char gender) {    this.name = name ;    this.age = age ;    this.gender = gender ;}//setXXX/getXXX()方法public void setName(String name) {    this.name = name ;}public String getName() {    return name ;}public void setAge(int age) {    this.age= age;}public int getAge() {    return age ;}public void setGender(char gender) {    this.gender= gender ;}public char getGender() {    return gender ;}//学习public void study() {    System.out.println("学生在学习...");}public void sleep() {    System.out.println("学生困了,就需要睡觉...");}

}

//测试类

public class StudentDemo {
public static void main(String[] args) {

//方式1:创建学生类对象    //无参构造+set/getXXX()相结合的方式    Student s = new Student() ;    s.setName("高圆圆");    s.setAge(28);    s.setGender('女');    System.out.println(s.getName()+"----"+s.getAge()+"---"+s.getGender());    System.out.println("----------------------------");    //方式2:直接通过有参构造形式    Student s2 = new Student("高圆圆", 27, '女') ;    System.out.println(s2.getName()+"----"+s2.getAge()+"---"+s2.getGender());}

}

6、static关键字
(1) 定义一个人类
成员变量:姓名 年龄 国籍
创建了三个Person对象,每一个对象的国籍都是中国,值是重复的,这样的话在堆内存中比较浪费内存空间,不好
针对这种情况,多个对象对同一个变量进行共享,这个时候Java提供了一个关键字---static: 静态的(共享的)
在方法区中:开辟一个静态区域: 都是静态标记
(2) 关于static关键字:

1)静态随着类的加载而加载    2)static优先于对象存在        回想:main  public static void main(..){...}    3)static共享数据,可以被多个对象进行共享        举例: 饮水机(staticd的:共享的)                水杯(不能共享的...)    4)如果数据被静态修饰的,它可以被类名直接调用                被静态修饰的方法:   类名.方法名()                被静态修饰的变量:   类名.变量名;

(3)static用法:

一个类中可有静态变量,也可以有非静态
可以有静态成员方法,也可以非静态的成员方法
静态的方法只能访问静态变量,或者是静态的方法
非静态的方法,既可以访问静态变量也可以非静态的变量...

简单记:静态只能访问静态

7、this关键字

定义变量,方法,类,接口,做到见名知意
在手机类中的公共的访问方法中,对应局部变量名称应该做到见名知意
虽然做到见名知意了,但是局部变量将成员变量可以隐藏掉,Java提供一个关键字:this
this:代表是当前类对象,或者是(当前类对象的引用),解决局部隐藏了成员变量
例如:
class Phone{

//私有修饰private String brand ;private int price ;private String color ;//成员方法//提供公共的访问方法public void setBrand(String brand) {

// brand = brand ;

this.brand = brand;
}

//获取手机品牌public String getBrand() {    return brand ;}public void setPrice(int price) {

// price = price ;

this.price = price ;
}
public int getPrice() {
return price ;
}

public void setColor(String color) {    //color = color ;    this.color = color ;}public String getColor() {    return color ;}

}

//测试类

public class Test {

public static void main(String[] args) {    //创建手机类对象    Phone p = new Phone() ;    p.setBrand("华为");    p.setPrice(1999);     p.setColor("黑白");    System.out.println(p.getBrand()+"---"+p.getPrice()+"----"+p.getColor());    System.out.println("-----------------------");    Student s = new Student() ;    s.setName("高圆圆");    s.setAge(28);     s.setsId("xx002");    s.setGender('女');    s.setTitle("学习委员");    System.out.println(s.getName() + "----" + s.getAge() + "----" + s.getsId() + "----" + s.getGender() + "----"            + s.getTitle());}

}

8、类的组成中有一个成员:成员方法
成员方法的分类:
1)按照返回值划分
void的形式:没有具体的返回值
非void形式:有具体返回值
2)按照参数进行划分
空参
有参
//创建一个学生类
class Student {

private String name ;private String age ;public Student() { //alt+shift+s+c}//成员方法public String show() { //有返回值没有参数的    return "helloworld" ;}//没有返回值,有参数的情况public void method(String s) {    System.out.println(s);}//没有返回值,没有参数的情况public void function() {    System.out.println("function student...");}//有返回值,有参数的情况public String function2(String s1,String s2) {    return s1+ s2;}

}

//测试类

public class Test {

public static void main(String[] args) {    //创建学生类对象    Student s = new Student() ;    String str = s.show() ;    System.out.println(str);    s.method("Java");    s.function();    String str2 = s.function2("hello", "world") ;    System.out.println(str2);}

}

9、构造方法
构造方法作用:
就是给对象进行进行初始化
构造方法也属于一类的组成:
成员变量
构造方法
成员方法
构造方法:
1)方法名和类名相同
2)构造方法,连void都没有
构造方法的注意事项:
1)之前没有写无参构造,系统会默认提供无参构造
2)如果我们无参构造或者有参构造,系统不会在提供无参构造;定义一个类的时候,永远给出无参构造;
构造方法是可以重载的:

转载于:https://blog.51cto.com/13670525/2097159

你可能感兴趣的文章
我的友情链接
查看>>
最新HADOOP 调优常用参数统计表
查看>>
haproxy 配置详解
查看>>
nginx代理resin
查看>>
Java编程最差实践
查看>>
linux运维常用命令
查看>>
axis开发webservice
查看>>
网络系统集成工程师——十八般武艺
查看>>
我的友情链接
查看>>
ping命令加入时间戳并写入文本
查看>>
linux下如何把一个用户加到管理员组
查看>>
CodeForces 483C Diverse Permutation
查看>>
我的友情链接
查看>>
mrtg监控网络流量简单配置
查看>>
解决“连接U8数据库服务器失败”的方法尝试
查看>>
把oracle数据库恢复到某个时间点或者某个scn
查看>>
分组背包问题
查看>>
css的再深入4(更新中···)
查看>>
一道面试题
查看>>
大公司里怎样开发和部署前端代码?
查看>>