1、1.第五章 面向对象2.简述面向对象和面向过程的区别和联系?面向对象以功能来划分问题,面向过程以步骤划分问题。面向对象可以有更好的可移植性和拓展性类是对对象特征的抽象与归纳,对象是类的实例化,如汽车和 BMW。66 对象和类的关系是?136.面向对象以功能来划分问题,面向过程以步骤划分问题。面向对象可以有更好的可移植性和拓展性138.栈,1. 线程私有,不能实现线程之间共享!2.局部变量存于栈中 3.系统自动分配,内存连续,速度快139.堆,1.new 出来的对象,2.空间不连续,分配灵活,速度慢方法区(堆)1.被所有线程共享 2.用来存放永远不变或唯一内容(类代码信息,静态变量,字符串常量)
2、140.http:/ 0,boolean false,char u0000,引用类型 null;145.不对,构造方法不用于构造类的对象146.必须一致147.没有返回值148.对象实例化时,被调用149.不能150.自己未定义时会默认添加,自己定义了构造器,系统不添加151.this.type=type类创建对象,类是构造对象的模板和蓝图,创建类的实例!栈的特点是?存放什么内容 ?栈的特点是数据共享,存放的是数据引用,对象引用,局部变量的值。所有基本数据类型都在栈中。堆得特点是?存放什么内容 ?堆存放的是具体的对象值,堆可灵活分配内存空间。存放的是 new 出来的对象。【上机】画出如下程序的
3、内存结构(课堂上的代码):3.局部变量、成员变量、静态变量分别怎么声明?局部变量不能初始化,成员变量和静态变量可以进行初始化。不对,构造方法不用于构造类的对象4.局部变量使用之前,必须要手动初始化吗?必须手动进行初始化!5.如果不手动指定成员变量的值,系统将会自动初始化。那么初始化的规则是?Int 为 0 ,double 是 0.0 , String 是 null Boolean 是 false ,byte 是 0.0, short 是 0,6.成员变量从属于谁? 静态变量又叫什么以及从属于谁? 局部变量从属于谁?成员变量从属于对象,静态变量又叫类变量,从属于类,局部变量从属于方法或语句块。7
4、.构造方法的作用是两个:一个构造类的对象,另一个作用是初始化对象的属性。这种说法对不?对8.构造方法的名称必须保持跟类名一致吗?必须保持一致。9.构造方法有没有返回值?详细用文字描述返回值问题。构造方法没有返回值,返回值是对象调用这个方法后,返回一个特定类型的值,给主程序,然后继续进行!10. 构造方法如何被调用?构造方法通过参数的类型进行调用,如果没有提供构造方法,那系统会自动提供一个无参数的构造器。11. 构造方法中能不能有 return 语句?构造方法中不能有 return 语句,12. 系统一定会给我们添加无参数的构造方法吗? 请详细解释。不一定,当我们自己提供了个简单的构造方法后,系
5、统就不会再提供。13. 【上机】设计一个类代表二维空间的一个点public class Points int x,y;public Points(int x, int y) super();this.x = x;this.y = y;14. 【上机】设计一个类代表二维空间的一个圆。要求两个成员变量。一个是圆心,一个是半径提供计算面积的方法。public class Circles int radius ;Point points;public Circles(int radius, Point points) super();this.radius = radius;this.points =
6、 points;double ares() double s = 3.14*radius*radius;return s;public static void main(String args) Point p = new Point(1,1);/ TODO Auto-generated method stubCircles c = new Circles(8, p);System.out.println(c.ares();15. 【上机】为上述 Cricle 类添加一个方法,计算一个点(Point 对象)是否在圆(Cricle对象)内,并写程序验证public class Circles i
7、nt radius ;Point points;private int x;private int y;public Circles(int radius, Point points) super();this.radius = radius;this.points = points;public Circles(int x, int y, int radius)this.x = x;this.y = y;this.radius = radius;double ares() double s = 3.14*radius*radius;return s;boolean CirclePoint(P
8、oint p) double d = (x-p.x)*(x-p.x)+(y-p.y)*(y-p.y);if (d radius*radius) System.out.println(“点在圆内! “);elseSystem.out.println(“点不在圆内! “);return false;public static void main(String args) Point p = new Point(9,1);/ TODO Auto-generated method stubCircles c = new Circles(8, p);System.out.println(c.ares()
9、;System.out.println(c.CirclePoint(p);16. 构造方法能不能重载?可以17. this 在普通方法中,指的是哪个对象?在构造方法中,指的是?This 在普通方法中指的是自身,在构造方法中指的是当前类;18. static 变量在内存中放置在哪个区? static 变量和方法为什么被称为类变量和类方法?可以被该类所有对象共享吗?以下是 thinking in java 里面的关于 static 的描述:2.6.3 static 关键字通常,我们创建类时会指出那个类的对象的外观与行为。除非用 new 创建那个类的一个对象,否则实际上并未得到任何东西。(注意,这里
10、其实就是说的引用和真正的对象创建问题)只有执行了 new 后,才会正式生成数据存储空间,并可使用相应的方法。但在两种特殊的情形下,上述方法并不堪用。一种情形是只想用一个存储区域来保存一个特定的数据 无论要创建多少个对象,甚至根本不创建对象。另一种情形是我们需要一个特殊的方法,它没有与这个类的任何对象关联。也就是说,即使没有创建对象,也需要一个能调用的方法。为满足这两方面的要求,可使用 static(静态)关键字。一旦将什么东西设为 static,数据或方法就不会同那个类的任何对象实例联系到一起。所以尽管从未创建那个类的一个对象,仍能调用一个 static 方法,或访问一些static 数据。而
11、在这之前,对于非 static 数据和方法,我们必须创建一个对象,并用那个对象访问数据或方法。这是由于非 static 数据和方法必须知道它们操作的具体对象。当然,在正式使用前,由于 static 方法不需要创建任何对象,所以它们不可简单地调用其他那些成员,同时不引用一个已命名的对象,从而直接访问非 static 成员或方法(因为非 static 成员和方法必须同一个特定的对象关联到一起) 。有些面向对象的语言使用了“类数据“和“类方法“这两个术语。它们意味着数据和方法只是为作为一个整体的类而存在的,并不是为那个类的任何特定对象。有时,您会在其他一些 Java 书刊里发现这样的称呼。为了将数据
12、成员或方法设为 static,只需在定义前置和这个关键字即可。例如,下述代码能生成一个 static 数据成员,并对其初始化:class StaticTest Static int i = 47;现在,尽管我们制作了两个 StaticTest 对象,但它们仍然只占据 StaticTest.i 的一个存储空间。这两个对象都共享同样的 i。请考察下述代码:StaticTest st1 = new StaticTest();StaticTest st2 = new StaticTest();此时,无论 st1.i 还是 st2.i 都有同样的值 47,因为它们引用的是同样的内存区域。有两个办法可引用
13、一个 static 变量。正如上面展示的那样,可通过一个对象命名它,如 st2.i。亦可直接用它的类名引用,而这在非静态成员里是行不通的(最好用这个办法引用 static 变量,因为它强调了那个变量的“静态“本质) 。StaticTest.i+;其中,+运算符会使变量增值。此时,无论 st1.i 还是st2.i 的值都是 48。类似的逻辑也适用于静态方法。既可象对其他任何方法那样通过一个对象引用静态方法,亦可用特殊的语法格式“类名. 方法 ()“加以引用。静态方法的定义是类似的:class StaticFun static void incr() StaticTest.i+; 从中可看出,St
14、aticFun 的方法 incr()使静态数据 i 增值。通过对象,可用典型的方法调用 incr():StaticFun sf = new StaticFun();sf.incr();或者,由于 incr()是一种静态方法,所以可通过它的类直接调用:StaticFun.incr();尽管是“静态 “的,但只要应用于一个数据成员,就会明确改变数据的创建方式(一个类一个成员,以及每个对象一个非静态成员) 。若应用于一个方法,就没有那么戏剧化了。对方法来说,static 一项重要的用途就是帮助我们在不必创建对象的前提下调用那个方法。正如以后会看到的那样,这一点是至关重要的 特别是在定义程序运行入口方
15、法main()的时候。和其他任何方法一样,static 方法也能创建自己类型的命名对象。所以经常把 static 方法作为一个“领头羊“使用,用它生成一系列自己类型的“实例“ 。19. 静态初始化块和 main 方法哪个先被执行?静态初始化块在类加载的时候就执行,main 方法的执行在静态初始化块的后面才执行。20. 一个构造方法调用另一个构造方法怎么调用? this(),这样的调用方式必须位于第一句吗?嗯必须位于第一句;用 this 必须位于第一句。21. package 的两个作用是什么?Package 是包 用来区别类,同名类。不同的包下不能共享数据和变量对象。22. 增加 packag
16、e 以后,我们在 DOS 下编译怎么做?Javac 把包路径也一块加上即可23. import 是用于导入包还是导入类?import 是用来导入包的。24. import Java.util.*; 会不会降低程序运行速度?为什么?会 使得程序速度变慢。25. import static 静态导入的作用是导入类还是导入类的静态属性和静态方法?Import static 静态导入的是静态方法26. 如果同时导入:Java.util.Date; Java.sql.Date; 在程序中怎么区分它们?可以在创建对象的时候加入前缀27. 【上机】 完成this、static、 package、import
17、 的测试代码28. Javadoc 注释怎么写?三种方式 /*/*/29. Java 项目的 API 文档如何生成?请将步骤写出。步骤;Eclipse 中 project 中 Generate Javadoc 完成30. 面向对象中的封装,追求的是“高内聚,低耦合” 。解释一下,内聚什么?什么叫耦合?就是类与类之间尽量减少联系,不要相互影响太多,31. 封装的几个关键字:private,default,protected,public 的含义。私有的 默认的 受保护的 公有的32. 一般属性是否要设置为 private?是33. 如果属性设置为 private,如何让外部访问该属性?通过接口3
18、4. 提供 getter、setter 方法的操作, Eclipse 中如何实现?Source 中找 generate getterg and setter35. 对于 boolean 类型的属性,提供的 getter 方法是:getXXX 或是 isXXX?public boolean isFlag() return flag;public void setFlag(boolean flag) this.flag = flag;36. Javabean 就是只包含属性和相关getter、setter 方法,不包含业务逻辑处理的类,这种说法对吗?37. 继承的好处是什么?提高代码的重复性38.
19、 Java 中有多继承吗?C+ 中有多继承吗? 单继承相比多继承优势在什么地方?39. 【上机】模仿课堂上动物世界的例子,我们自己写个例子。40. Java 的继承使用哪个关键字实现?extends41. 定义某个类时,如果没有使用 extends,那么继承了哪个类?Object 42. Java 中,有没有多继承? 请说明, Java 为什么取消了多继承?没有多继承,先从 Java 8 之前说起。要区分“声明多继承”与“实现多继承” 。Java 是不允许“实现多继承” ,简称不允许“多继承” 。但是 Java 支持“声明多继承”Java 的接口的多继承一个类可以实现多个接口(“继承”了多个接
20、口上的方法声明) ,而一个接口可以继承多个接口(同样是“继承”了多个接口上的方法声明) 。接口只允许有方法声明而不允许有实现,因而不会出现像C+那样的实现多继承的决议问题;抽象类可以有方法实现,但要遵循 Java 类的单继承限制,也避免了实现多继承的问题。这是早期 Java 为了与 C+区分开的一个决定。43. 重写(override) 指的是什么?方法重写 指的是继承中的,子类重写父类。44. 假如父类有 main 方法,子类能不能继承?子类能继承父类的 main 方法,但是要重写 main 方法。子类调用父类的 main 方法,同时执行 main 方法,子类调用子类的 main 方法,只能
21、执行子类的 main 方法,不能执行父类的 main 方法。45. Object 是所有类的根类吗 ?是所有类的直接父类吗?是根类,不是父类,46. 在哪里查看 Object 类的源代码?在 API 里面47. Object 类中的 toString 方法能否被子类重写 ?请做测试。可以重写 tostring 方法48. 【上机】完成继承、Object 相关的测试代码49. super 指的是什么?指的是直接父类50. 构造方法中,第一个话总是 super 吗?不是,没有父类的话就不用 super51. 叙述一下,有继承结构时,构造方法的调用顺序?先调用父类的构造方法,再调用子类构造方法52.
22、 重写中,子类的返回值类型可不可以跟父类不完全一致?说出你的理由。返回值类型必须一样,返回值类型,方法名,参数列表必须全部一样53. 如何判断两个对象内容是否相同?重写 equals()有什么要求?equals 方法,54. 举一个现实的例子,说明多态。子类是父类的多种表现形式55. 多态的三个必要条件是什么?继承,重写,父类引用指向子类对象56. 什么是向上转型?什么是向下转型?类的向上转型,和向下转型,接口的向上转型,向下转型57. 多态的常用使用场合有哪些?58. Java 的方法绑定采用动态绑定还是静态绑定?动态绑定59. final 修饰变量、方法、类分别表示什么含义?final根据
23、程序上下文环境,Java 关键字 final 有“这是无法改变的”或者 “终态的 ”含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。final 类不能被继承,没有子类,final 类中的方法默认是 final 的。final 方法不能被子类的方法覆盖,但可以被继承。final 成员变量表示常量,只能被赋值一次,赋值后值不再改变。final 不能用于修饰构造方法。注意:父类的 private 成员方法是不能被子类方法覆盖的,因此 private 类型的方法默认是 final 类型的。1、 final 类final 类不能被继承,因此 final 类
24、的成员方法没有机会被覆盖,默认都是 final 的。在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会载被扩展,那么就设计为 final 类。2、 final 方法如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为 final 方法。使用 final 方法的原因有二:第一、把方法锁定,防止任何继承类修改它的意义和实现。第二、高效。编译器在遇到调用 final 方法时候会转入内嵌机制,大大提高执行效率。例如:public class Test1 public static void main(String args) / TODO 自动生成方法存根publi
25、c void f1() System.out.println(“f1“);/无法被子类覆盖的方法public final void f2() System.out.println(“f2“);public void f3() System.out.println(“f3“);private void f4() System.out.println(“f4“);public class Test2 extends Test1 public void f1()System.out.println(“Test1 父类方法 f1 被覆盖!“);public static void main(Strin
26、g args) Test2 t=new Test2();t.f1();t.f2(); /调用从父类继承过来的 final 方法t.f3(); /调用从父类继承过来的方法/t.f4(); /调用失败,无法从父类继承获得 3、 final 变量(常量)用 final 修饰的成员变量表示常量,值一旦给定就无法改变!final 修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量。从下面的例子中可以看出,一旦给 final 变量初值后,值就不能再改变了。另外,final 变量定义的时候,可以先声明,而不给初值,这中变量也称为 final 空白,无论什么情况,编译器都确保空白 fina
27、l 在使用之前必须被初始化。但是,final 空白在 final 关键字 final 的使用上提供了更大的灵活性,为此,一个类中的 final 数据成员就可以实现依对象而有所不同,却有保持其恒定不变的特征。package org.leizhimin;public class Test3 private final String S=“final 实例变量 S“;private final int A=100;public final int B=90;public static final int C=80;private static final int D=70;public final
28、int E; /final 空白, 必须在初始化对象的时候赋初值public Test3(int x)E=x;/* param args*/public static void main(String args) Test3 t=new Test3(2);/t.A=101; /出错,final 变量的值一旦给定就无法改变/t.B=91; /出错,final 变量的值一旦给定就无法改变/t.C=81; /出错,final 变量的值一旦给定就无法改变/t.D=71; /出错,final 变量的值一旦给定就无法改变System.out.println(t.A);System.out.println(
29、t.B);System.out.println(t.C); /不推荐用对象方式访问静态字段System.out.println(t.D); /不推荐用对象方式访问静态字段System.out.println(Test3.C);System.out.println(Test3.D);/System.out.println(Test3.E); /出错, 因为 E为 final 空白,依据不同对象值有所不同.System.out.println(t.E);Test3 t1=new Test3(3);System.out.println(t1.E); /final 空白变量 E依据对象的不同而不同private void test()System.out.println(new Test3(1).A);System.out.println(Test3.C);System.out.println(Test3.D);public void test2()final int a; /final 空白, 在需要的时候才赋值final int b=4; /局部常量-final 用于局部变量的情形final int c; /final 空白, 一直没有给赋值.a=3;/a=4; 出错, 已经给赋过值了./b=2; 出错, 已经给赋过值了.