Java基础第三篇(上)------面向对象的基本概念
本文主要基于面向对象着重阐述关于面向对象的几个关键字和其中的思想
一、类
中国有句古话叫物以类聚,人以群分。也就是说万物都有相通之处,而在java中用类来描述这些具有相似点的事物。
1.1类的基本概念:
简单的说:类是一组相似事物的统称。
从面向对象方面来说:类是组成Java程序的基本要素。类封装了一类对象的状态和行为,类是用来定义对象的模板。
1.从类本身来讲:一类事物共有的属性和功能.
2.类着重强调不止一个,否则就是一个特例了,如果只有一个的话,会不会太无聊。
3.但是在多个中它们都有相似点,否则就不是一类,就像水跟姓名一样没有可比性。相似点体现在这组事物在属性, 行为等方面的相似。
4.这个类应该有个统一的名字,就像某个国家,或者一群部落,定义了这一组事物的标示。
广泛的理解:就是定义一组相似的事物为某个类,本身就有主观判断,比如某人被等同于猪,PC和手机不同。对于这样 的结论显然有点仁者见仁智者见智的味道。
所以可以认为在你看来,只要有相似点的就是同一个类。
有位诗人说的好:横看成岭侧成峰,远近高低各不同。
所以站在你的角度来说:具有相似点的事物就是一类。
千万不要跟别人争论你该如何如何,做自己的判断,走自己的路。
1.2对类的分析
在现实世界中我们分析某个事物总会观察它最明显的特征或者,其他的细微特征。这些特征被抽象出来就成了某种属性,或者标签,就像windows界面是蓝色的,有四个四边形在一起,笔记本电脑,有屏幕,键盘,滑动鼠标面,电源孔和USB口等,进而可以用变量来表示这些属性或者标签,。这些属性或者本身的某种特性会表现出某些行为特征,这些行为特征有时候被称为功能。或者能力,进而可以用方法,或者函数来描述这种行为和功能。
简单来说:属性通过变量来刻画,功能通过方法来体现,即方法操作属性形成一定的算法来实现一个具体的功能。类把数据和对数据的操作封装成一个整体.
1.3类的构成
类的实现包括两部分:类声明和类体。
语法格式 <修饰符> class + <类名>{
//类体
}
说明:class是关键字,用来定义类的。类名必须是合法的java标示符。
类名的书写规范:
(1)、类名必须使用英文字母, 首字母大写,如Hello、People等。
(2)、类名最好见名得意,当类名由几个”单词”组合而成时,每个单
词的首字母都要大写。如AllTime, GoodGame, BigDog等。
类体里面的内容比较多。
一般一部分是成员变量的定义,用来刻画状态(就是属性),另一部分是方法的定义,用来刻画行为(功能)
类体构造:
<构造方法>
<变量类型> <变量名1>;
<变量类型> <变量名2>;
<返回值类型> <方法名称1> (<参数类型> <参数名>);
<返回值类型> <方法名称2> (<参数类型> <参数名>);
1.3.1构造方法(也叫构造器,构造函数)
格式<修饰符>+ 构造方法名(<形参列表>){ //方法体 }
说明:
修饰符:修饰符可以省略,也可以是public,protected,private
构造方法名:必须和类名相同
形参列表:用来初始化的参数。
构造函数不能定义返回类型,默认是void的。否则被认为是一般的方法。
说明;当我们用new关键字来调用构造函数的时候,构造函数返回该类的实例,可以把这个类的实例当做构造函数的返回值。因此构造函数的返回值类型总是当前类,无需定义返回值类型。
注意:1.不能在构造函数中显示的使用return来返回当前类的对象,因为构造函数的返回值是隐式的。
2.当创建一个类时,程序会隐士的创建一个公有的无参的构造函数。除非显示指定构造函数否则创建对象的时候初始化不了。
3.私有构造函数很少见,一般默认构造函数是public的,但是私有构造函数的访问权限(修饰符)是private有自己的用途,用来阻止对象的生成,只能被包含它的类自身所访问,而无法在类的外部调用,可以实现一个类只有一个对象
通常私有构造函数用在单例模式和工具类中。
关于构造方法:是一种特殊的方法,
1.构造方法的方法名必须与类名相同
2.构造方法没有返回类型,也不能定义为void,在方法名面前不声明方法类型(诸如int ,String double 之类的)
3.构造方法的主要作用是完成对象的初始化工作,它能够把定义对象时的参数传给对象的域。
4.构造方法不能由编程人员调用。而是由系统完成第三点。
5.一个类可以定义多个构造函数,但是方法参数不能相同,参数类型或者参数个数不同,如果没有构造函数则编译器会隐式的生成一个不带参数public的函数体没有内容的构造函数
6.构造函数可以重载,以参数个数,类型,或者排列顺序区分。
构造函数的执行过程
类初始化时构造函数调用顺序:
1.初始化对象的存储空间为0或者为null;
2.调用父类构造函数
3.按顺序分别执行类成员变量和实例成员变量的初始化表达式
1.4 Java中的变量
Java中的按作用域分为:局部变量,和全局变量,成员变量
按访问限制分为:public,private,protected和友好的变量
按类型分为:实例变量和类变量
变量说明:
成员变量:声明为类的属性的变量(即在类的状态描述部分定义的变量)
静态变量(也叫类变量):就是声明为静态属性的变量
局部变量:就是方法里声明的变量
Volatile变量:和多线程有关,用于简化同步,对于该变量的每一次操作后,值都会写入内存。
Transient变量:用于使该变量不会被持久化
Final变量: 基本上就是常量
作用域:成员变量在整个类的内部都有效。局部变量只在方法内部有效。
操作说明:
1.如果局部变量的名字与成员变量的名字相同,则成员变量被隐藏,即这个成员变量在同名局部变量所在方法内暂时失效。
2.如果想在包含同名局部变量的方法内使用成员变量,必须使用关键字this来引用成员变量。
3.成员变量可以由public、protected、private和static修饰,而局部变量不能。
下面主要说一下,成员变量 实例变量和类变量
成员变量用来刻画类的状态(属性),成员变量又分为实例成员变量(简称实例变量)和类成员变量(简称类变量)
简单的说有static修饰的就是类变量。
对于成员变量的书写规范:
1.成员变量名必须遵循标识符命名规则,同时首字母必须小写,
如果由多个单词组成,从第二个单词开始首字母必须大写。
2.成员变量的定义没有先后顺序,但是最好将成员变量的定义
集中在类的顶部。习惯上先定义变量后定义方法。
1.5 方法
定义:方法是类或者对象的行为特征的抽象;是类或者对象最重要的组成部分,通常解决功能性问题。
语法格式:
<访问权限> <返回值类型> <方法名> (<参数类型> <参数名>) {
方法主体……
}
方法的书写规范:
1.当一个方法不需要返回数据时,返回类型必须是void。如果方
法包含多个参数,各个参数之间用逗号隔开。
2.方法名必须遵循标识符命名规则,同时首字母必须小写,如果
由多个单词组成,从第二个单词开始首字母必须大写。
3.方法的参数在整个方法内有效,方法内定义的局部变量从它定
义的位置之后开始有效,直到方法的末尾。
说明:java里的方法不能单独存在,必须定义在类里面,在逻辑上要么属于类,要么属于对象
如果某个方法使用了static修饰,则这个方法属于这个类,否则这个方法属于这个类的实例。
方法的所属性:
1. 方法不能独立定义,方法只能在类体里定义
2.在逻辑上要么属于类,要么属于对象
3.根据第二点来看:
方法永远不能独立执行,执行这个方法必须使用类或者对象作为调用者。
4.使用static修饰的方法属于类本身,叫类方法,可以被类名(也就是类)直接调用,也可以被类的实例调用。
5.没有使用static修饰的方法属于该类的对象,而不属于类本身,叫实例方法使用不同对象调用同一个普通方法可能得到不同的结果。
方法的使用:
方法调用成员变量:一个类中实例方法可以调用类中的成员变量(包括实例变量和类变量);而类方法只能调用类变量,不能调用类中的实例变量。
方法之间的互相调用:一个类中的方法可以互相调用,实例方法可以调用该类中的其它方法;类方法只能调用该类的其他类方法,不能调用类中的实例方法。
变量之间的调用规则:
方法之间的调用规则
1.6方法重载:是指一个类中可以有多个方法具有相同的名字,但这些方法的参数必须不同,即或者是参数的个数不同,或者是参数的类型不同.
方法重载的说明:方法的返回值类型和参数的名字不参与比较,也就是说如果两个方法的名字相同,即使返回值类型或者是参数的名字不同,也不能称为方法的重载,必须是参数个数或者是参数类型不同。
下面附上两个实例
实例代码一:
package cn.com.basicOne;
public class ClassDemo {
public String name; //实例成员变量(实例变量)
public static String passWord; //静态实例成员变量(类变量)
public static final int age = 25; //静态类常量
public static ClassDemo classDemo3; //静态本身实例
//私有构造方法 1
//该方法防治在其他部分创建对象,所以在ClassDemo2中会报错,要求将private删去,才行
//该方法可以应用于单例模式
private ClassDemo(){}
//单例模式中的懒汉式(线程不安全)
public ClassDemo getInstance(){
if(classDemo3 == null){
classDemo3 = new ClassDemo();
}
return classDemo3;
}
//有参构造方法 2
public ClassDemo(String name){
this.name = name;
}
//有参构造方法 3,与1,2共同为重载构造方法
public ClassDemo(String name,String passWord){
this.name = name;
this.passWord = passWord;
}
/**
*
* 作者:FCs
* 描述:返回姓名
* 时间:2014年8月8日
* 返回类型:String
*/
public String getName(){
return name;
}
/**
*
* 作者:FCs
* 描述:普通打印方法
* 时间:2014年8月8日
* 返回:void
*/
public void disPlay(){
String addr = "吉林省"; //局部成员变量
System.out.println("name : "+name+" passWord : "+passWord+" addr : "+addr);
show(); //实例方法可以调用类方法
}
public static void show(){
System.out.println("我是静态方法。也叫类方法");
//disPlay(); 报错,类方法不能调用实例方法,只能调用类方法
//show(); //重复调用一下自己(会有死循环,这里涉及到递归调用)
show2(); //调用第二个构造方法
}
public static void show2(){
//因为name不是类变量,所以不能出现在类方法中,除非name也是类变量。
//System.out.println("name : "+name+"passWord : "+passWord+" age : "+age);
System.out.println(" passWord : "+passWord+" age : "+age);
}
public static void main(String[] args) {
ClassDemo classdemo = new ClassDemo(); //默认调用无参构造方法实例化对象
System.out.println("类变量也可以被类的实例调用"+classdemo.age);
System.out.println("类变量也可以被类本身直接调用"+ClassDemo.age);
ClassDemo classdemo1 = new ClassDemo("张三"); //调用有参构造方法 2 实例化对象
String name = classdemo1.getName(); // 定义一个局部成员变量接受该方法的返回值。
System.out.println("name : "+name);
ClassDemo classdemo2 = new ClassDemo("张三","12345"); //调用有参构造方法 3 实例化对象
classdemo2.disPlay(); //类的实例classDemo2调用 实例方法
classdemo2.show(); //类的实例调用类方法
ClassDemo.show(); //类本身或者说类名直接调用类方法
}
}
实例代码二:
public class ClassDemo2 {
public static void main(String[] args) {
//ClassDemo de= new ClassDemo(); //创建ClassDemo实例报错,原因有私有构造方法
}
}