在学习之前,先复习一下相关的JAVA知识。
java三个方向:
1)JavaSE:作基于C/S(Client-Server)结构的桌面应用开发,QQ聊天、FORMAIL、OA系统...
2)JavaEE(servlet,jsp,struts,spring,hiberate,ajax,webservice...):主要作基于B/S(Browser-Server)结构的电子商务系统的开发
3)JavaME:手机的一些嵌入式开发,如手机游戏、手机定位功能、手机视频
智能手机:有操作的系统的手机
1)IPHONE:苹果
2)ANDROID:谷歌
3)...
非智能手机:没有操作系统的手机
3G:第三代移动通讯
面向过程(c)-->面向对象(java)-->面向服务(webservice)
面向对象:继承,多态,封装
类:对事物的一种抽象,在编程领域里,类是对象的一个模板
对象:是一种实实在在的实体,看得到、摸得着的
属性(成员变量,实例变量,全局变量):描述一个类的特性,是静态的
方法(功能,函数):描述的是一个类的功能,是动态的
基本类型与引用类型
除了八种基本类型之后,其它都是引用类型
this:
1)指代当前对象
2)调用本类的其它构造方法,构造方法一旦出现this,一定要出现在第一句代码上
实例变量和局部变量:
实例变量:
1、在一个类中,任何方法之外定义的变量;
2、从面向对象的思想来说我们又把实例变量成为一个类的属性。
3、实例变量在没有符初值时系统会自动帮我们做初始化:整型数据初始化为0,布尔型数据初始化为false,对象类型初始化为null。
4、声明:
[<修饰符> s] <数据类型> <变量名> [= <初始值>];
如:
private int id;
private String name;
局部变量:
1、在方法内定义的变量叫局部变量。
2、局部变量使用前必须初始化,系统不会自动给局部变量做初始化。
3、局部变量的生命范围在他所在的代码块,在重合的作用域范围内不允许两个局部变量命名冲突。
注:局部变量与实例变量允许同名,在局部变量的作用域内,其优先级高于实例变量。我们可以用this.实例变量名以区分局部变量。
构造方法:在创建对象被调用
1)方法名和类的名字一样
2)不能用static,final等修饰
3)没有返回值
4)在对象初始化的时候调用,用关键字new来初始化
5)如果一个类没有构造方法,系统会默认会提供一个公共的无参的构造方法,如果有定义,就使用用户自己定义的构造方法,系统不再提供无参的了
方法重载:
1、可以定义在同一个类中,也可以定义在父类与子类之间
2、方法名字要求一样,参数列表(参数的个数,参数的类型,参数类型位置)不同
3、对返回类型不作要求
4、构造方法和普通方法都可以重载
5、方法重载时,对于参数的匹配有个向上就近原则。byte-->short-->int-->long-->float-->double
练习:
1,写一个类,名为Animal,该类有两个私有属性,name(代表动物的名字),和legs(代表动物的腿的条数);要求为两个私有属性提供public 的访问方法。并提供个两构造方法,一个无参,默认给name赋值为AAA,给legs赋值为4;另一个需要两个参数,分别用这两个参数给私有属性赋值。要求在第一个构造方法中调用第二个构造方法。该类还有两个重载的move()方法,其中一个无参,在屏幕上输出一行文字:
XXX Moving!!(XXX为该动物的名字);另一个需要一个int参数n,在屏幕上输出n次 XXX Moving!!
2,写一个类Person,包含以下属性:
String name;
int age;
int gender(0表示男,1表示女);
Person partner。
为Person类写一个marry(Person p)方法,代表当前对象和p结婚,如若可以结婚,则输出恭贺信息,否则输出不能结婚原因。要求在另外一个类中写一个主方法,来测试以上程序。(下列情况不能结婚:1,同性; 2,未达到结婚年龄,男<24,女<22;3,某一方已婚)
public class Person{
private String name;
...
private Person partner;
public void marry(Person p){
}
}
Person p1 = new Person(..,..,..);
Person p2 = new Person();
Person p3 = new Person();
p1.marry(p2);
Java中创建对象的步骤:
1、分配空间;
2、初始化属性;
3、调用构造方法;
注意:构造方法不能手工调用,在对象的生命周期内构造方法只调用一次。
参数传递:
1、值传递:方法参数如果是八种基本类型的,都属于值传递,传的是数值,相当是做一个值拷贝
2、引用传递:方法参数如果是引用类型的,都属于引用传递,传的是地址,相当做一个地址的拷贝
封装:指的是一个对象的内部状态对外界是透明的,对象与对象之间只关心对方有什么方法,而不关心属性。封装使实现的改变对架构的影响最小化。
访问修改符:
private :仅本类成员可见
default :本类+同包类可见(默认)
protected:本类+同包+不同包的子类
public :公开,所有的类都可以见到
属性和普通方法都可以用private,default,protected,public修饰
构造方法:
private:本类可以创建对象,其它类都不行
default:本类和同包的类可以创建对象
protected:本类、同包的类和不同包的子类可以创建对象
public:所有类都可以创建该类的对象
修饰类:
default:同包的类可以访问到该类
public:所有包的类都可以访问到该类
继承:
1、定义:基于一个已存在的类构造一个新类。继承已存在的类就是复用这些类的方法和属性,在此基础上,还可以在新类中添加一些新的方法和属性 ;
2、父类到子类是从一般到特殊的关系;
3、继承用关键字extends
class Dog extends Animal :表示狗类继承了动物类
4、java中只允许单继承(java简单性的体现)
父子类之间的关系是树状关系。(而多继承是网状关系)
5、父类中的私有或者default修饰的属性、方法,子类不能继承;
6、原则:父类放共性,子类放个性;
7、构造方法不能被子类继承。
8、java里的根类是java.lang.Object,即所有的类都是间接或者直接继承该类,如果一个类没有用extends继承任何类,默认会隐式继承Object,所有数组类型也是继承了java.lang.Object
super:代表直接父类对象,也可以调用父类的构造方法
1、super()表示调用父类的构造方法 ;
2、super()也和this一样必须放在构造方法的第一行;
3、super.表示调用父类的方法或属性,例:super.m();
4、super可以屏蔽子类属性和父类属性重名时带来的冲突 ;
5、在子类的构造函数中如果没有指定调用父类的哪一个构造方法,那么就会调用父类的无参构造方法,即super()。
带继承关系的对象创建的过程:
1、递归的构造父类对象;
2、分配空间;
3、初始化属性 ;
4、调用本类的构造方法
方法的覆盖(重写):
1)发生在父类与子类之间;
2)方法名字相同,参数列表相同;
3)子类方法返回值的类型必须是父类方法返回值类型的子类或它本身;
4)子类方法的访问控制权限必须跟父类一样或者比父类更广
5)子类方法抛出的异常不能够比父类方法抛出的异常更加宽广
多态:多态性使指相同的操作可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。多态指的是编译时的类型变化,而运行时类型不变。简单来讲,就是用一个父类的引用指向子类的对象
注意:编译时看左边,运行时看右边
多态常见的用法:
(1)多态用在方法的参数上
(2)多态用在方法的返回类型上
练习一:
1,写一个类Fish,继承自Animal类,并提供一个构造方法,该构造方法需要一个参数name,并给legs赋默认值0;该类还要求覆盖Animal类中的无参move()方法,要求输出:XXX Swimming!!
2,写一个类Bird,继承自Animal类,并提供一个构造方法,该构造方法需要一个参数name,并给legs赋默认值2;该类还要求覆盖Animal类中的无参move()方法,要求输出:XXX Flying!!
3,写一个类Zoo,要求分别生成若干个Animal,Fish和Bird。(工厂模式),统计有多少个Fish对象和Bird对象
方法:public Animal createAnimal(String animal),如果传入的是animal "fish"字符串,就返回Fish对象;
如果传入的是animal "bird"字符串,就返回Bird对象,否则,返回null
public Animal createAnimal(String animal){
if(animal.equals("fish")){
return new Fish(...);
}
if(animal.equals("bird")){
return new Bird(...);
}
return null;
}
4、写一个测试方法:测试返回对象的方法