一:面向对象的概念
在程序开发初期,人们使用结构化开发语言。随着软件的规模越来越庞大,结构化语言的弊端也逐渐暴露出来,开发周期越来越长,产品的质量也不尽如人意。
1:对象
(1)从这一问题中抽象出对象,这里抽象出的对象为大雁
(2)识别这个对象的属性。对象具备的属性都是静态属性,如大雁有一对翅膀,黑色的羽毛等。
(3)识别这个对象的动态行为,即这只大雁可以进行的动作,如飞行,觅食等,这些行为都是这个对象基于其属性而具有的动作。
(4)识别出这个对象的属性和行为后,这个对象就被定义完成了。然后可以根据这只大雁具有的特性制定这只大雁从北方飞向南方的具体方案。
2:类
类就是同一类事物的统称,如果将现实世界中的一个抽象成对象,类就是这类对象的统称,在Java语言中,类对象的行为是以方法的形容来定义的,对象的属性是以成员变量的形式定义的,所以类包括对象的属性和方法。
3:封装
面向对象程序设计具有以下特点:封装性,继承性和多态性;
(1)封装是面对对象编程的核心思想,将对象的属性和行为封装起来,其载体就是类,类通常对客户隐藏其实现细节,这就是封装思想
(2)采用封装的思想保证了类内部数据结构的完整性,使用类的用户不能轻易的直接操作类的数据结构,只能执行类允许公开的数据
4:继承
(1)类与类之间具有关系,这种关系被称为关联。关联主要描述两个类之间的一般二元关系。(2)继承性主要利用特定对象之间的共同属性。
5:多态
继承,父类和子类,其实将父类对象应用于子类的特征就是多态。
二:类
类是封装对象的属性和行为的载体,而在Java语言中对象的属性以及成员变量的形式存在,对象方法以成员方法的形式存在。
1: 成员变量
在Java中,对象的属性也称为成员变量,成员变量可以任意类型,整个类中均是成员变量作用范围。
-
package 面对对象;
-
public class 例题2 {//类
-
private String name;//String类型的成员变量
-
public String getName() {//name的Getter的方法
-
return name;//在有返回值的方法中 返回方法指定类型的值 同时结束方法执行
-
}
-
public void setName(String name) {//name的Setter的方法
-
this.name = name;//将 参数name的值赋值给 本对象的成员变量name。
-
}
-
}
先创建一个类 然后定义一个String类型的成员变量
在使用Getter的方法
在有返回值的方法中,返回方法指定类型的值 同时结束方法执行
再name的Setter方法
将参数值赋予类中的成员变量
2:成员方法
-
权限修饰符 返回值类型 方法名(参数类型 参数名){
-
...
-
return 返回值
-
}
一个成员方法可以有参数,这个参数可以是对象,也可以是基本数据类型的变量,同时成员方法有返回值和不返回值的选择,如果方法需要返回值,可以在方法中使用retnrn关键字,使用这个关键字后,方法的执行将被终止。
3:权限修饰符
public和protected修饰的类可以由子类访问,如果子类和父类不在同一包中,那么只有修饰符为public的类可以被子类进行访问。如果父类不通过继承产生的子类访问它的成员变量,那么必须使用private声明父类这个成员变量。
例如 在项目中的com.mr包下创建AnyClass类,该类使用默认的访问权限
-
package com.mr;
-
class AnyClass{
-
public void doString(){
-
....//方法体
-
}
-
}
在上述代码中 由于类的修饰符为默认修饰符,即只有一个包内的其他类和子类可以对该类进行访问,而AnyClass类中的doString()方法却又被设置为public访问权限,即使这样doString()方法的访问权限依然与AnyClass类的访问权限相同
4:局部变量
局部变量是在方法被执行时创建的,在方法执行结束时被销毁。局部变量在使用时必须进行赋值操作或被初始化,否则会出现编译错误。
-
public class ChangeDemo{
-
public static int[]exchange(int[]arr){
-
int tmp =arr[0];//创建局部变量tmp,保存数组第一个元素的值
-
arr[0]=arr[1];//第二个元素赋值给第一个元素
-
arr[1]=tmp;//第二个元素值改为tmp
-
return arr;
-
}
-
public static void main(String[]args) {
-
int arr[]= {17,29};
-
System.out.println("第一个值="+arr[0]+",第二个值="+arr[1]);
-
arr =exchange(arr);
-
System.out.println("第一个值="+arr[0]+",第二个值="+arr[1]);
-
}
-
}
结果;
5 :局部变量的有效范围
可以将局部变量的有效范围称为变量的作用域,局部变量的有效范围从该变量的声明开始到该变量的结束位置
下面代码描述了变量的作用范围
-
package 面对对象;
-
public class 例题5 {
-
public void doString(String name) {
-
int id = 0;
-
for (int i=0;i<10;i++) {
-
System.out.println(name+String.valueOf(i));
-
}
-
}
-
}
在相互不嵌套的作用域中可以同时声明两个名称和类型相同的局部变量如下面代码所示
-
public void doString(String name) {
-
int id = 0;
-
for (int i=0;i<10;i++) {
-
System.out.println(name+String.valueOf(i));
-
}
-
for(int i=0;i<3;i++) {
-
System.out.println(i);
-
}
-
}
但是在相互嵌套的区域中不可以这样子声明,如果将局部变量id在方法体中for循环再次定义编译器将会报错如下代码所示
-
public void doString(String name) {
-
int id = 0;
-
for (int i=0;i<10;i++) {
-
System.out.println(name+String.valueOf(i));
-
}
-
for(int i=0;i<3;i++) {
-
System.out.println(i);
-
int id=7;
-
}
-
}
6:this关键字
this关键字用于表示本类当前的对象,当前对象不是某个new出来的实体对象而是当前正在编译的类。this关键字只能在本类中使用
例如 图书类setName()方法代码如下
-
public void setName(String name) {//定义一个setName的方法
-
this.name = name;//将参数值赋予类中的成员变量
-
}
this除了可以调用成员变量或成员方法,还可以作为方法的返回值,例如 返回图书类的苯类的对象可以写成下面这种形式;
-
public Book getBook(){
-
return this;//返回BooK类的本类对象
-
}
再getBook()方法中范围值Book类,所以方法体中使用了return this这种形式返回Book类对象
三:类的构造方法
在类中除成员方法外,还存在一种特殊类型的方法,那就是个构造方法。构造方法是一个类与类同名的方法,对象的创建就是通过构造方法完成的。每当类实例化一个对象时,类都会自动调用构造方法
构造方法的特点如下
构造方法没有返回值
构造方法的名称要与本类的名称相同
-
publicBook(){
-
...//构造方法
-
}
public//构造方法的修饰符、
Book//构造方法的名称
在构造方法中可以为成员变量赋值,这样当实例化一个本类对象时,相应的成员变量也将被初始化。如果类中没有明确定义构造方法,编译器会自动创建一个不带参数的默认构造方法
代码
-
public class EggCake {
-
int eggCount; //鸡蛋灌饼里蛋的个数
-
public EggCake(int eggCount){ //参数为鸡蛋灌饼里蛋的个数的构造方法
-
this.eggCount=eggCount; //将参数eggCount的值付给属性 eggCount
-
}
-
public EggCake() { //无参数构造方法,默认给饼加一个蛋
-
//调用参数为鸡蛋灌饼里蛋的个数的构造方法,并设置鸡蛋灌饼里蛋的个数为1
-
this(1);}
-
public static void main(String[]args){
-
EggCake cake1=new EggCake();
-
System.out.println("顾客不要求加蛋的数量,饼里会有"+cake1.eggCount+"个蛋。 ");//输出
-
EggCake cake2=new EggCake(2);
-
System.out.println("顾客要求加2个蛋,饼里会有"+cake2.eggCount+"个蛋。");//输出
-
}
-
}
运行结果
四: 静态变量和静态方法
在介绍静态便连个静态方法之前 要介绍static关键字 应为有static修饰的变量和方法被称为静态变量和静态方法。
代码
-
package 面对对象;
-
public class StaticDemo {
-
//静态的成员变量
-
static double P1=3.1415;//static就是静态变量
-
static final double P2=3.1415;//有static final就静态常量
-
//静态常量
-
public static void method() {static就是静态方法
-
//静态的成员方法
-
System.out.print("这是静态方法");
-
}
-
public static void main (String[]args) {//调用静态变量
-
System.out.println(StaticDemo.P2);//输出要选择你要输出的
-
StaticDemo.method();//调用成员方法
-
}
-
}
运行结果
静态变量与静态方法的作用通常是为了提供共享数据或方法如数学计算公式等 景观使用这种方式调配用静态成员比较方便 但静态成员同样遵循public,private 和protected修饰符的约束。
在Cust类中创建一个静态整数类型属性count在构造方法中让count自增。
代码
-
package 面对对象;
-
public class Cust {//吃货类
-
static int count =0;//共享的属性:人数
-
String name;//名称属性
-
public Cust(String name) {
-
this.name =name;//记录名称
-
count++;//人数递增
-
}
-
public static void main(String[]args) {//主方法
-
Cust c1 =new Cust("tom");
-
System.out.println("我是第"+Cust.count+"名吃货,我叫"+c1.name);//输出
-
Cust c2=new Cust("张三");
-
System.out.println("我是第"+Cust.count+"名吃货,我叫"+c2.name);//输出
-
Cust c3=new Cust("狗蛋");
-
System.out.println("我是第"+Cust.count+"名吃货i,我叫"+c3.name);//输出
-
}
-
}
运行结果
五: 类的主方法
主方法时类的入口点,他定义了程序从何处开始。主方法提供对程序控制,java编译器通过著方法来执行程序。主方法的语法如下
-
publie static void main(String[]args){
-
....
-
}
主方法是类的入口点,它定义了程序从何处开始,主方法提供对程序流向的控制,Java编译器通过主方法来执行程序。
-
public static void main(String[] args) {//传入参数
-
// TODO Auto-generated method stub
-
for(int i=0;i<args.length;i++) {
-
System.out.println(args[i]);//输出参数
-
}
-
}
-
}
结果:
六:对象
java时一门面向对象的程序设计语言,对象是由类实例化而来的 所有问题都通过对象来处理对象可以通过操作剋的属性和方法来解决相应问题,所以了解对象的产生,操作和小王是十分必要的 本章节来讲解java语言中的应用
1:对象的创建
在6.1节中曾讲过对象 ,对象可以认为是在一类事物中抽象出某一个特例可以通过这个特例来处理这类事物的出现的问题在java语言中通过new操作符来创建对象。前文在讲解构造方法时介绍过 每实例化一个对象就会自动调用一次构造方法,实质上这个过程就是创建对象的过程中准确的说可以在java语言中使用new操作符调用构造对象 语法如下
-
Test etst =new Test();
-
Test etst =new Test("a");
例题创建人类并创建对象
-
package 面对对象;
-
public class People {
-
private String name;//定义一个字符串类型 赋值为名字
-
private int age;//定义一个整型变量 年纪
-
private String sex;//定义一个字符串类型 赋值为性别
-
public People(String name,int age,String sex) {//成定义一个成员变量 人(名字 年纪 性别)
-
this.name =name;//抛弃就近原则选择成员变量中的
-
this.age =age;//抛弃就近原则选择成员变量中的
-
this.sex=sex;//抛弃就近原则选择成员变量中的
-
}
-
public static void main(String[]args) {
-
People p1= new People("tom",23,"男");//人p1赋值名字和年龄和性别
-
People p2= new People("lily",19,"女");//人p1赋值名字和年龄和性别
-
}
-
}
2:访问对象的属性和行为
-
package 面对对象;
-
public class Dog {
-
String name;//定义字符串类型的 name 名字
-
String Color;//定义字符串类型的 name 名字
-
String vioce;//定义字符串类型的 vioce 叫声
-
public Dog(String name,String color,String vioce) {//成员变量
-
this.name=name;//抛弃就近原则选择成员变量中的
-
this.Color=color;//抛弃就近原则选择成员变量中的
-
this.vioce=vioce;//抛弃就近原则选择成员变量中的
-
}
-
public void call() {//叫
-
System.out.println(vioce);//输出
-
}
-
public static void main(String[]args) {
-
Dog d1 =new Dog("陈佳俊","白色","汪汪汪");
-
System.out.print(d1.name+"的颜色是"+d1.Color);//访问对象属性
-
System.out.print(",叫起来的声音:");
-
d1.call();
-
Dog d2 =new Dog("李成龙","灰色","嗷呜");
-
System.out.print(d2.name+"的颜色是"+d2.Color);//访问对象属性
-
System.out.print(",叫起来的声音:");
-
d2.call();
-
}
-
}
运行结果
3: 对象的引用
在java语言中,尽管一切都可以看作对象 但真正的操作标识符实质上是一个引用那么引用在java中是如何体现按的呢语法如下
类名 对象的引用变量
例如一个People类的引用可以使用以下代码
People tom;
通常一个引用不一定需要有一个对象的相关联应用于对象相关联的语法如下
People tom=new People();
4:对象的销毁
每个对象都有生命周期 ,当对象的生命周期借宿时 分配给该对象的内存地址需要被收回 在其它语言中需要用户手动回收废弃的对象 java拥有一套完整的垃圾回收机制,用户不必担心废弃的对象占用内存,垃圾回收器会自动回收无用却占用内存的资源
对象引用超过起作用范围 这个对象将被视为垃圾 如下所示
-
{
-
Examblee =new Example();
-
}
对象超过作用范围将消亡
将对象赋值为null 如下所示
-
{Examble e=new Examble
-
e =null;
-
}
虽然java的垃圾回收站机制已经很完善 但垃圾回收器只能回收那些由new操作符创建的对象。某些对象不能通过new操作符获储存空间的 这种对象无法被垃圾回收站机制所识别。 在java中提供了一个finalize()方法这个方法是Object类的方法他被声明为protected,用户可以在自己的类中定义这个方法,如果用户在类中定义finalize()方法在垃圾回收时首先调用该方法 ,在下依次垃圾回收动作发生时 才真正回收被对象占用的内存