1 面向对象程序设计基础
1.对象object:在Java中,对象由数据以及对数据进行操作的方法构成。
2.类class:具有相同属性和方法的对象的集合与抽象。
3.面向对象的特征:封装(把对象的全部属性和方法封装在一起,并且对一些重要的信息进行隐蔽)、继承(一个类拥有另一个类的属性和方法,Java只支持单重继承)、多态(程序的多种表现形式,分为方法的多态和变量的多态,方法的多态分为方法重载和方法覆盖)。
4.类的使用:定义某变量为该类型、创建对象(创建对象的实质是为对象分配内存空间)、赋值(就是把对象所占内存空间的首地址赋值给相应的变量)、成员变量的使用。
5.Java的数据类型:8种基本的数据类型和(byte、short、int、long、float、double、boolean)参考数据类型(三种类型:类,接口和数组)。成员变量在对象创建后有默认值,整数类型的成员变量默认值是0,字符类型的成员变量的默认值是空格,布尔类型的成员变量默认值是false,参考类型成员变量的默认值是null。
6.方法:方法定义时的参数为形参。同一个类中的方法可以直接调用,不需要加标识符引导。
7.方法中参数的传递:Java中的方法的参数可以是形参或实参。形参可以是基本数据类型或参考数据类型的变量,实参可以是相应形参类型的常量、变量或表达式。基本数据类型的形参得到的是相应类型的数据值,而参考类型的形参得到的是一个地址值。
8.方法的重载:指在同一个类中,定义方法名相同,而方法的参数类型、参数个数或者顺序至少有一个不同。方法的重载可以使同一个类中功能相似但是实现细节不同的方法具有相同的外观,便于调用者调用。
9.封装:把对象的数据及对数据的操作放在一起从而形成对象,并且需要隐蔽对象的一些信息,使外界对对象的访问只能通过特定的方法完成特定的操作,从而实现数据的安全性。可以通过private修饰符来完成深层次的封装,因为声明为private的成员变量在其他类中是不可见的,此时只能通过特定的方法对这些属性进行指定的操作。
10.构造器:构造器是一种特殊的方法,特点是其名称和类的名称一样,并且没有返回值(void也没有)。作用是在创建对象时对对象进行初始化。
11.构造器的重载:构造器的重载可以完成不同的初始化过程,为创建对象带来方便。在同一个类中可以定义多个构造器,通过参数的不同来区分。在同一个类中重载的构造器是可以相互调用的,在调用时只能通过this关键字来调用,不能通过方法名直接调用。
12.变量的作用域和初始化:Java中根据作用域的不同,变量可分为三种类型:局部变量,参数,成员变量。局部变量,在一个方法的内部或方法的一个代码块中定义的变量。局部变量在定义之后没有默认值,需要先赋值再使用。参数,这里的参数指定义方法或构造器时的参数,即形参,作用范围在定义的方法或构造器内部。成员变量,在类内、方法外定义,作用域是整个类。成员变量在创建时有默认值。(局部变量要在初始化以后才能使用,成员变量有默认值可以不用初始化)
13.变量同名的情况:同一作用域内不允许两个变量重名;不同的作用域内变量可以重名。在同一个类中,成员变量可以与局部变量同名,此时在方法内成员变量被屏蔽,若要访问该成员变量,可以通过this关键字来访问。
14.this引用:this指代当前对象自身。主要应用:this.成员变量,当成员变量与局部变量或参数重名时,通过this来访问成员变量。this(参数),用于重载的构造器之间相互调用,这时不能直接使用构造器的名字,只能用this。this做实参,有时在类定义过程中,需要一个当前类的对象作为实参,这时可以通过this来指代当前对象。
15.父类、子类和继承:Java支持单重继承机制,被继承的类为父类,由继承得到的类为子类。子类可以继承父类的属性和方法,可在子类中添加新的属性和方法,也可修改原来的变量成员,重写原有的方法。在Java中所有的类都是直接或者间接的继承类object。
16.继承需注意的点:(1)、子类继承父类,父类中private修饰的属性是可以被子类继承的,但是在父类中被private修饰的属性和方法是不能直接被访问的,需要通过父类中定义的特定方法对其访问。(2)、调用父类的构造器时,只能通过super来指代构造器的名字,不能用父类构造器的名字。
17.方法覆盖:指在子类中定义了与父类同名的方法,且方法的参数(个数、类型、排列顺序)和返回类型完全一致。注意:方法覆盖是在继承的基础上实现的,要能够区分方法的重载。
18.super:super是当前类的直接父类对象的引用。super的用法:super.方法名(参数),调用父类中被覆盖的方法。super(参数),调用父类的构造器。super.成员变量名,访问父类中被隐藏的成员变量,即子类中的变量与父类中的变量重名的时候。
2 数组
1.一维数组的使用:主要包括数组声明、创建数组对象、数组元素赋值等操作。
2.数组的声明:数组元素类型 数组名[ ]。通过声明给出数组元素的名字,数组元素的类型。这里数组元素的类型可以是简单数据类型,也可以是参考数据类型。
3.创建数组对象:数组名=new 数组元素对象[数组元素的个数];创建数组对象也用new,但是后面跟中括号,中括号给出一个整数表示数组的大小,及数组元素的个数。
4.数组元素的赋值:Java中当数组对象创建后,每个数组都有一个属性length,保存数组元素的个数。简
5.简写方式:声明和创建数组对象的合写,int x[ ]= new int[3];D_card dc[ ]=new D_card[2];声明、创建数组对象和赋值的合写,方式一,int x[ ]= {1,2,3};D_card dc[ ]={new D_card(0001,50.0),new D_card(0005,50.3)};这种写法直接由大括号中给定的元素来确定数组的大小,省略了创建数组对象的部分。方式二,int x[ ]=new int[ ] {1,2,3};D_card dc[ ]=new D_card[ ] {new D_card(0001,50.0),new D_card(0005,50.3)};注意,这种写法在创建数组部分,即new之后的类型后面的中括号是空的,不能写数字,因为数组元素的大小由大括号中给出的元素个数来确定。
6.二维数组的声明:数组元素类型 数组名[ ] [ ] ;int y[ ][ ];
7.创建二维数组对象:1),给定行列数。y=new int[2][3];2)分步确定行列数。 y=new int[2][ ] ;y[0]=new int[3]; y[1]=new int[2]; 分步确定行列数时,每行的列数可以不一样,即Java的二维数组可以定义为锯齿型的。
8.二维数组元素赋值:1),可以给每个元素单独赋值。2)声明和创建合在一起, int y[ ][ ]=new int[2][3]; 3),声明、创建和赋值合在一起,int y[ ][ ]={{1,1,2},{2,2,3}};或 int y[ ][ ]=new int[ ][ ]{{1,1,2},{2,2,3}};
9.简单的输入输出:Java的输入输出分为命令行方式的输入输出和图形界面方式两种。
10.命令行方式的输入输出:1)输入,从键盘到内存的输入,首先要建立一个管道:Bufferedreader br=new Bufferedreader(new InputStreamReader(System.in));然后调用类Bufferedreader 的readLine()方法,该方法返回的是输入的字符串,所以通常将它的返回值赋给一个String型的句柄。例如:String s=null;s=br.readLine();若输入的是一个整数值,通过该方法得到的是由数字构成的字符串,此时需要进行转换得到相应的数值,转换的方式如下:int n=Integer.parseInt(s);2)输出,System.out.println("年龄为"+n);
11.图形界面输入输出:1)输入,通过JOptionPane中的方法showInputDialog()来完成输入,showInputDialog()返回的是字符串,需要将他的值赋值给一个String型的句柄;如:String input1;input1=JOptionPane.showInputDialog("请输入姓名");2)输出,仍然使用类JOptionPane,此时使用类的showMessageDialog()方法,如:JOptionPane.showMessageDialog(null,input1);
3 面向对象的高级特性
1.变量多态:类型为X的参考变量,其指向的对象类型可以是X,也可以是X的子类。指向子类的变量就是变量的多态。
2.多态的用途:1)用于异类收集,基于变量多态可以通过一个数组将不同的对象组合在一起。由于参考数据类型的数组元素存储的是对象的地址,不论数组是指向父类的对象、还是指向子类的对象,就存储的内容而言都是相同类型的,所以没有违背数组的定义。例如:类object是所有类的父类,若声明一个数组为object类型,那这个数组就可以集合所有类的对象了。2)用于方法参数传递,有些方法在定义时不能确定具体要操作哪种类型的对象,这时可以借助特定的父类或公共父类object进行形参的定义。调用这个方法时,具体的操作类型已经确定,这时操作的对象是形参的子类对象,也就用到了变量多态。
3.类型判断:对象 instanceof 类 ,判断左边的对象是不是右边的类型。
4.参考类型的转换:子类向父类的转换可以自动进行,而父类向子类的转换需要指明,且看是否能够转换。例如:1)子类变量给父类变量赋值(对)。2)指向父类对象的父类变量强制转换为子类类型后给子类变量赋值(错)。3)指向子类对象的父类变量给子类变量赋值(错)。4)正确的强制类型转换为子类类型的变量给子类变量赋值(对)。总结:给参考数据类型(X)的变量赋值时,若赋值号右边是X的子类类型的数据变量,可以自动转换;若赋值号右边是父类类型的变量,且该父类类型的变量已经事先用x的对象赋值了,此时要先对右边的变量强制类型转换后再赋值。
5.三个非访问控制符:static、final、abstract
6.static:static可修饰变量和方法。1)类变量(静态变量),被static修饰的成员变量,成为类变量 或者是静态变量;没有static修饰的成员变量叫做实例变量。类变量在内存中只存一份,所以类变量可以通过类名访问。而对于实例变量,每创建一个对象,就会为实例变量分配一次内存,所以需要通过对象名进行访问(实例变量在内存中可以有多个拷贝,分别属于不同的对象)。2)类方法(成员方法),同类变量一样,类方法也不需要创建对象,可直接通过类名访问。main()方法就是静态方法,它是程序的入口。
7.类方法:1)类方法只能直接访问类变量或方法参数,不能直接访问实例变量;2)静态方法不能直接访问非静态方法。
8.final:final可修饰类、方法和变量。1)修饰类:final修饰的类为最终类,不能被继承。2)修饰方法:final修饰的方法是最终方法,不能被覆盖。3)修饰变量:final修饰的“变量”是常量标识符,在一次赋值之后其值不能被改变。
9.abstract:abstract可以修饰类和方法。1)修饰类:abstract修饰的类是抽象类,即类中有些内容还没有完整定义。注意:不能够创建抽象类的对象,抽象类一般是用来做父类的,即它可以被其他类继承。2)修饰方法:abstract修饰的方法是抽象方法,也就是只定义了方法头部,没有方法体,即连大括号也没有。3)修饰类和修饰方法的关系:抽象类不一定含有抽象方法,但含有抽象方法的一定是抽象类;如果子类没有实现抽象类中的所有抽象方法,那么子类一定要定义为抽象类。4)抽象类的作用:抽象类的作用就是做父类。
10.接口:Java通过接口来弥补类的单重继承的不足,接口直接是多继承,即一个接口可以有多个接口,一个类也可以实现多个接口。接口中只允许定义常量,不允许定义变量。接口中的成员变量,都是public、static、final型的,方法及变量的修饰符可以省略。
11.访问控制符:private、protected、public和默认。
12.1)private:private修饰的成员变量和方法都是私有的,其作用域范围只限于本类中,即使是子类也不能继承。2)protected:protected修饰的成员变量和方法是受保护的,即只能在跟其有关的类中才能访问,例如在同一个包中的类、所在类的子类中。3)public:public修饰的类、成员变量和方法都是公有的,其访问范围不受限,但是成员变量和方法的公有性是以类的公有性为前提的。4)具有默认访问性的类只能被同一个包中的类访问,具有默认访问性的成员变量和方法,只能在本类中的同一个包中的其他类中被访问。
13.内部类:内部类可分为非静态内部类、静态内部类、方法内部类和匿名内部类。
14.非静态内部类:class outer { class inner{ } },非静态内部类不允许有任何静态声明。
15.静态内部类:创建静态内部对象时,不用事先创建外部类的对象,静态内部类智能访问外部类的静态成员,不能直接访问外部类的非静态成员,访问时必须通过外部类的对象访问。
16.方法内部类:把类定义在方法内,就称为方法内部类。
17.匿名内部类:匿名内部类是没有名字的内部类,它继承了某个类或实现了某个接口。只有类的主体,没有声明部分,类的主体部分紧跟new 。new 接口名(){//类体};