《Java从入门到精通》第七章学习笔记

第7章 类和对象

一、类和对象的定义及关系

1、类是同一类别对象的抽象定义;可以理解为是某一类具体对象的模子,确定对象将会拥有的特性,包括该类对象具备的属性和方法。

2、对象是对类的一种具体化的客观存在,是对类的具体实例化。要创建一个对象,必须基于类,即先要创建可描述该对象的类。

3、创建一个类

 1 public class Telphone {
 2     //属性(成员变量):有什么
 3     float screen;
 4     float cpu;
 5     float mem;
 6     //方法 :干什么
 7     void call(){
 8         System.out.println("Telphone有打电话的功能!");
 9     }
10     void sendMessage(){
11         System.out.println("Telphone有发短信的功能!");
12     }
13 }

4、创建一个对象
针对上面代码创建类的创建对象方法

Telphone myphone=new Telphone();

5、对象的比较:

有两种方法,分别为“==”运算符和equals()方法,但两者有本质的区别:
(1)“==”运算符比较的是两个对象引用的地址是否相同;
(2)equals()方法比较的是两个对象引用所指的内容是否相同。

 1 public class ClassCompare {
 2     public static void main(String[] args) {
 3         String c1=new String("abc");
 4         String c2=new String("abc");
 5         String c3=c1;
 6         System.out.println("c2==c3的运算结果为: "+(c2==c3));
 7         System.out.println("c2.equals(c3)的运算结果为: "+(c2.equals(c3)));
 8     }
 9 }
10 /*首先为c1分配一块内存区域存储字符串abc,并将c1指向设为该内存区域
11  *然后同样为c2分配另外一块内存区域存储字符串abc,并将c2指向设为该内存区域
12  *最后把c3的引用指向c1的指向
13 */

6、类的使用
同样针对上面创建的Telphone类:

 1 public class InitialTelphone {
 2     public static void main(String[] args) {
 3         // TODO Auto-generated method stub
 4         Telphone phone=new Telphone();
 5         phone.sendMessage();
 6         //这里各实例属性值在未初始化赋值的时候默认为0
 7         phone.screen=5.0f;
 8         phone.cpu=1.4f;
 9         phone.mem=2.0f;
10         phone.sendMessage();
11         //赋值后的显示
12     }
13 }

二、成员变量和局部变量
1、成员变量:在类中定义,用于描述对象的属性;成员变量可以被本类的方法使用,也可以被其他类的方法使用(依据该成员变量定义时的修饰词)。
2、局部变量:在类的方法中定义,在方法中临时保存数据。局部变量只能在当前方法中使用。
3、区别:局部变量的作用域仅限于定义的方法内部;成员变量的作用域在整个类内部都是可见的。Java中会给成员变量赋初始值,但不会给局部变量默认赋初值,所以局部变量在使用前必须要赋值,否则会报错。
4、同一个方法中不能用同名的局部变量;在不同的方法中,可以有同名局部变量。如果局部变量和成员变量同名,在定义该局部变量的方法内部局部变量有更高的优先级。

 1 public class Telphone {
 2     float screen;
 3     float cpu;
 4     float mem;
 5     int var;
 6     void call(){
 7         int localVar=10;
 8         System.out.println(var);
 9         //可以调用类的成员变量var,默认值为0
10         System.out.println("Telphone有打电话的功能!");
11     }
12     void sendMessage(){
13         System.out.println(localVar);
14         //调用call()方法中的局部变量会报错
15         System.out.println("Telphone有发短信的功能!");
16     }
17 }

三、类的构造方法
1、构造方法是定义在Java类中的一个用来初始化对象的方法。构造方法与类同名,并且没有返回值。
2、如果类定义中没有设置无参数的构造方法,则系统会自动生成。

 1 //设置无参数的构造方法
 2 public class Telphone {
 3     int sc=10;  //定义成员变量
 4     public Telphone(){
 5         System.out.println("无参的构造方法执行了");
 6     }
 7 }
 8 public class InitialTelphone {
 9     public static void main(String[] args) {
10         Telphone phone=new Telphone();
11         //可以看到构造方法执行了
12         System.out.println(phone.sc);
13         //可以看到输出了成员变量sc的值为10
14         //当没有设置无参构造方法时,默认的无参构造方法会使对象拥有成员变量这个实例属性
15         //当定义了无参构造方法时,即便没有显式的定义成员变量的赋值,对象也会拥有成员变量对应的实例属性
16     }
17 }

3、有参数的构造方法通常只有一个目的:即给成员变量赋初值。

 1 public class Telphone {
 2     float screen;
 3     float cpu;
 4     float mem;
 5     public Telphone(){
 6         System.out.println("无参的构造方法执行了");
 7     }
 8     //有参构造方法与无参构造方法同名
 9     public Telphone(float screen,float cpu,float mem){
10         screen=screen;
11         cpu=cpu;
12         mem=mem;
13         System.out.println("有参的构造方法执行了");
14     }
15 }
16 public class InitialTelphone {
17     public static void main(String[] args) {
18         // TODO Auto-generated method stub
19         Telphone phone=new Telphone();
20         Telphone phone1=new Telphone(5.2f,1.4f,2.0f);
21     }
22 }

4、当类中定义了构造方法(不管是有参还是无参)时,系统都不会再默认生成无参的构造方法。
5、构造方法的重载:方法名相同,但参数不同的多个构造方法,调用时候会自动判断、根据不同的参数组合选择对应的构造方法。如上面代码中无参和有参的构造方法为同名,都可以使用。
6、构造方法中一般可以添加保证赋值合理的功能。

 1 public class Telphone {
 2     float screen;
 3     float cpu;
 4     float mem;
 5     public Telphone(){
 6         System.out.println("无参的构造方法执行了");
 7     }
 8     public Telphone(float screen,float cpu,float mem){
 9         if(screen<3.5){
10             System.out.println("赋值不合理,已自动赋值screen为3.5");
11             screen=3.5f;
12         }else{
13             screen=screen;
14         }
15         cpu=cpu;
16         mem=mem;
17         System.out.println("有参的构造方法执行了");
18     }
19 }

四、静态变量和静态方法
1、静态变量:当同一个类的两个或者多个对象需要在同一个内存区域共享一个数据时,可以通过定义类的静态变量来实现。由static修饰的成员变量即是静态变量。静态变量可以通过类名.静态变量名,也可以通过实例对象名.静态变量名来访问,但因为是同一类所有实例对象的共享,所以一般采用类名.静态变量名的方式进行访问。
2、静态方法:对于方法的静态修饰,与上述静态变量规则一致。需要注意:
(1)静态方法可以直接调用同一个类中的静态成员(包括静态变量和静态方法),但不能直接调用非静态成员。如果要调用一个类中的非静态成员,则必须先实例化对象,通过实例对项目名.非静态成员来调用。
(2)与静态成员方法不一样的是在普通成员方法中可以直接访问同类的非静态和静态变量。

public class HelloWorld {
    String name="imook";
    static String hobby="java";
    public void show(){
        System.out.println(name);  //普通成员方法中可以使用非静态成员
        System.out.println(hobby); //也可以使用静态成员
    }

    public static void main(String[] args) {
        System.out.println(name);  //错误!静态方法main中不能使用类中的非静态成员
        System.out.println(HelloWolrd.name);  //错误同上
        System.out.println(hobby);
        //静态方法中可以直接调用静态成员
        System.out.println(HelloWorld.hobby);
        //也可以通过类名.静态成员名进行调用
        HelloWorld myHelloWorld=new HelloWorld();
        //创建一个实例对象
        System.out.println(myHelloWorld.name);
        //可以通过实例对象名.非静态成员名进行调用
        System.out.println(myHelloWorld.hobby);
        //也可以通过实例对象名.静态成员名进行调用(但不推荐)
        HelloWorld.show(); //错误!静态方法main中不能使用类中的非静态成员
        show();         //错误同上!
        myHelloWorld.show();
    }
}

3、通过static静态初始化块:静态初始化块只在类加载时执行,且只执行一次,并且静态初始化块只能给静态变量赋值,不能给普通成员变量赋值。

 1 public class HelloWorld {
 2     int num1;
 3     int num2;
 4     static int num3;
 5
 6     public HelloWorld(){
 7         num1=11;
 8         System.out.println("通过构造方法给num1赋初值!");
 9     }
10     {//通过普通初始化块给num2赋初值
11         num2=222;
12         System.out.println("通过构造方法给num2赋初值!");
13     }
14     static{ //通过静态初始化块给静态变量num3赋初值
15         num3=3333;
16         System.out.println("通过构造方法给num3赋初值!");
17     }
18
19     public static void main(String[] args) {
20         HelloWorld hello=new HelloWorld();  //构造方法创建类的实例对象hello
21 /*
22  * 本次使用构造方法时,程序第一次加载HelloWorld类,会先执行静态初始化块,对应给num3赋值3333,并输出"通过构造方法给num3赋初值!"
23  * 再执行普通初始化块,对应给num2赋值222并输出"通过构造方法给num2赋初值!"
24  * 最后才执行构造方法,对应给num1赋值11并输出"通过构造方法给num1赋初值!"
25  */
26         System.out.println("hello的num1:"+hello.num1); //普通成员通过实例对象名访问
27         System.out.println("hello的num2:"+hello.num2);
28         System.out.println("hello的num3:"+num3);  //静态成员直接访问
29         HelloWorld hello2=new HelloWorld();  //构造方法创建类的实例对象hello2
30 /*因静态初始化块只在加载时执行一次,所以这次创建对象时不执行静态初始化块
31  * 这里不执行也是可以理解的,因为构造方法本身不包括静态初始化块,自然不会执行
32  * 前次创建hello对象时并不是因为构造方法而去执行静态初始化块,而是加载类的时候执行
33  */
34     }
35 }

五、访问修饰符和this关键字
1、访问修饰符包括private\protected\public;其中private范围对应为本类;protected范围对应本类、子类和同包;public范围为本类、子类、同包及其他包。如果没有使用访问修饰符,则默认的访问范围是本类和同包。
2、this关键字用于引用对象,实质上是对一个对象的引用。有些情况下可以省略this 关键字,如下例代码:

private void setName(String name){
    this.name=name; //这里可以省略this,写成name=name;
}

在当需要返回一个类的对象时则必须显式的使用this关键字:

/*创建一个返回类型为Book类的方法
 *方法名为getBook
 */使用this引用对象将Book类的对象返回
public Book getBook(){
    return this;
}

六、实例

 1 //汉诺塔
 2 public class HanoiTower {
 3     public static int moveTimes=0;//设置全类下的静态变量,计步器
 4     public static void moveDish(int num,char a,char b,char c){
 5         if(num==1){
 6             System.out.println("Move dish from "+a+" to "+c);
 7             moveTimes++;
 8         }else{
 9             moveDish(num-1,a,c,b);
10             //先把num-1个盘子从a通过c放到b;这里不涉及具体的移动,而是调用方法,所以计步器不加
11             System.out.println("Move dish from "+a+" to "+c);
12             //然后再把a上剩余的最后一个移动到c,这里涉及到具体的移动步骤,所以计步器加1
13             moveTimes++;
14             moveDish(num-1,b,a,c);
15             //最后解决b上的num-1个盘子,通过a再移动到c
16         }
17     }
18
19     public static void main(String[] args) {
20         // TODO Auto-generated method stub
21         int numTimes=12;
22         moveDish(numTimes,‘A‘,‘B‘,‘C‘);
23         System.out.println("总共移动了"+moveTimes+"次!");
24     }
25 }
时间: 2024-08-02 10:57:44

《Java从入门到精通》第七章学习笔记的相关文章

《Java从入门到精通》第九章学习笔记

第9章 类的高级特性 一.抽象类 抽象类只声明方法的存在,不能被实例化,就是说抽象类不能创建其对象,在定义抽象类时要在class前面加上abstract关键字. 1 /*定义一个抽象类Fruit,并定义其抽象方法 2 *在其子类中实现该抽象方法 3 */ 4 abstract class Fruit { 5 public String color; 6 public Fruit(){ 7 color="green"; 8 } 9 //定义一个抽象方法 10 public abstrac

《Java从入门到精通》第八章学习笔记

第8章 接口.继承与多态 一.接口的使用 1.接口的定义,基本语法格式如下: [修饰符] interface 接口名 [extends 父接口名列表]{ [public][static][final] 变量; [public][abstract] 方法; } /* 1.修饰符是可选参数,指定接口的访问权限,可选值为public或省略默认 2.接口名是比选参数,必须是合法的Java标识符 3.extends 父接口名列表是可选参数,用于说明要定义的接口继承于哪个父接口. 4.方法:接口定义的方法只

《Java从入门到精通》第十章学习笔记

第10章 Java集合类 一.概述 Java中的java.util包中提供了一些集合类,也被称为容器,不同于数组,集合的长度是可变的,存放的是对象的引用.常用的集合有List集合.Set集合.Map集合,其中List和Set实现了Collection接口. 二.集合类接口的常用方法 1.List接口的常用方法:因为继承了Collection接口,所以List接口也继承了Collection中的所有方法.List集合以线性有序的方式存储对象.List集合中可以包含重复的对象,的主要方法如下: (1

Unity3D入门 到精通 第七章物理引擎应用小结

实践了书上第七章的CrazyBall, 1.Camera的尾随,本例中没有使用已有的CarmeraFollow脚本,而是直接根据Ball的pos来跟随,当然也使用了插值,并设置了阻尼弹簧方式: transform.position = Vector3.Lerp(transform.position, newPos, Time.deltaTime * dampSpeed); 2.单例模式在游戏Manger管理中的应用: public static myCrazyBallManager mCB;//

《深入理解计算机系统》第七章学习笔记(初稿)

第七章 链接 链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(或拷贝)到存储器并执行.链接可以执行于编译时,也就是在源代码被翻译成机器代码时:也可以执行于加载时,也就是在程序被加载器加载到存储器并执行时:甚至执行于运行时,由应用程序来执行.在早期的计算机系统中,链接是手动执行的.在现代系统中,链接是由叫链接器的自动执行的. 理解链接器将帮助构造大型程序 理解链接器将帮助避免一些危险的编程错误 理解链接器将帮助语言的作用域规则是如何实现的 理解链接器将帮助其他重要

源码-PL/SQL从入门到精通-第七章-操作数据表

除了序列(Sequence)和同义词(Synonym)外,其他语句基本上都在自己创建的iTerm数据中用过了,所以这章感觉不难. --第7章开始 --7.1.2 插入单行记录 SELECT * FROM emp; INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno ) VALUES (7890, '刘七', '副理', 7566, TO_DATE ('2001-08-15', 'YYYY-MM-DD'), 80

《深入理解计算机系统》第七章学习笔记

20135109 高艺桐 一.关于链接 1.连接:将各种代码和数据部分收集起来并组合成为一个单一文件的过程.这个文件可被加载或拷贝到存储器并执行. 2.连接可以执行于编译时,也就是在源代码被翻译成机器代码.也可以执行于加载时,也就是程序被加载器加载到存储器并执行时执行于运行时,有应用程序来执行. 3.连接是由链接器的程序自动执行的. 4.连接使分离编译成为可能. 二.编译器驱动程序 1.大部分编译系统提供编译驱动程序:代表用户在需要时调用语言预处理器.编译器.汇编器和链接器.    (1)C预处

《JAVA 从入门到精通》 - 正式走向JAVA项目开发的路

以前很多时候会开玩笑,说什么,三天学会PHP,七天精通Nodejs,xx天学会xx ... 一般来说,这样子说的多半都带有一点讽刺的意味,我也基本上从不相信什么快速入门.我以前在学校的时候自觉过很多门语言,但基本都只是了解了一个大概,入门肯定也算不上了.顶多也就能吹吹牛,说几个大的概念而已. 公司最近转型,决定抛弃PHP了,我们的出路是:要么H5,要么JAVA,要么走人.纠结了一段时间后,决定还是转JAVA了. 当一个人在自己熟悉的领域的时候,好像说什么都很有自信,都觉得自己是对的.那时候我们的

Java从入门到精通pdf电子版

Java从入门到精通pdf电子版 链接:https://pan.baidu.com/s/1nzy8LV6d2_qAD3oKS-Fj9Q 提取码:at3x 简介: <Java从入门到精通>从初学者小白角度出发,通过通俗易懂的白话语言.丰富多彩的实战实例,详细介绍了使用Java语言进行程序开发应该掌握的各方面技术和技能,让你在编程开发中越走越远 目录 · · · · · · 第一篇 基础篇 第1章 Java概述 第2章 Java基本语言 第3章 控制流程语句 第4章 数组 第二篇 面向对象 第5章