JAVA学习笔记(二)-面向对象程序设计

1.定义成员方法时可以使用下面的指南:
    1).该方法能实现类的行为吗?
    2).该方法在其他情况下能适应吗?
    3).该方法在大多数情况下都能很方便地使用吗?
    4).该方法在某些特殊方面会受到限制吗?
    5).输入、输出参数名有清楚地含义吗?
    6).该方法名称能充分反映它的功能吗?
  2.一般情况下,将定义成员变量,成员方法的类和调用成员变量,成员方法的类分开。
  3.垃圾回收机制可以通过调用方法System.gc()实现。也可以设置一个变量为null,该变量将标记为要回收的资源。
 

3.2 类的访问与封装
  1.通过将一个类的对象作为另一个类的成员变量可以间接地实现本类中没有的方法。
  2.类的成员访问权限需要遵循一些限制:
     1).一个对象所有的成员变量如有可能应当是私有的,至少应是保护类型的。
     2).如果一个成员方法可能使对象失效或不被其他的类使用,它应当是私有的。
     3).如果一个成员方法不会产生任何不希望的后果,它才可以被声明为公有的。
     4).一各类至少有一个公有、保护和默认的成员方法。
     5).类和构造方法至少应是公有的或默认的。
  3.定义成员变量为私有常有可能太严格而导致类崩溃,因而定义成保护类型会更有价值。
  4.一个类可以通过调用另一个类的公有方法来访问这个类的私有成员变量。
  5.如果一个公有方法变为私有的,所有调用它的类都要进行修改,因此在声明公有方法时要小心,只有几乎不再改变的方法才应该声明为公有的。
  6.修改公有方法时应只改变其实现,而不要改变方法的首部,只要修改后的方法的效果一样,就不会影响到其他类。无论怎样改变私有方法都不会造成类之间的冲突。
  7. 如果要隐藏方法实现的细节,可以将实现该细节的方法设为私有的。再通过一个公有方法来调用该私有方法,从而达到隐藏方法中细节实现的目的。
  8.使用static修饰的成员变量可供同一个类的所有对象实例共享使用,而使用static修饰的成员方法的动作仅与输入参数和用static修饰的成员变量有关。也就是说静态成员方法只能用静态成员变量、输入的参数以及其他静态成员方法。
  9. 如果要在静态方法中使用非静态成员变量,则该静态成员方法必须要有一个输入参数,且该输入参数必须是包含有该非静态成员变量的对象。
  10.不管多少对象被实例化,一个静态成员变量仅存在一个版本。如果一个对象修改了该变量,则其他使用该变量的对象也将受到影响。如果构造方法中含有静态成员变量,则在其它方法中对静态成员变量的修改,将直接影响到后面其它该类对象在初始化时静态成员变量的值。
  11.运行过程中仅依赖于输入参数的方法应标记为静态成员方法。静态成员变量通常用于定义常数。
    

3.3 重载
  1 .对于方法执行的动作相同,但参数的数目和类型不同的方法,可以采用方法的重载。让返回值的类型为void.
  2.重载方法必须有相同的方法名称和相同的返回类型。不能创建返回类型不一样的重载方法。如果返回类型不一样,就只能用不同的方法名称。
  3.重载方法与参数名称无关,只与参数的类型、数目有关。当参数的类型与数目相同时,即使参数名称不同,系统也认为是同一方法,不能通过编译。
    
4.当重载一个方法时,首先要提供一个尽可能普通的版本,其他版本可以使用像:this(参数)这样的格式来调用该版本的构造方法,取代缺省的参数,如果在其他构造方法中调用普通的构造方法,必须作为这个方法的第一条语句。如:
  public Student() {this (“null”,0);}
  public Student(String _name) {this(_name,0);}
  public Student(int _age) {this(“null”,_age);}
  public Student(String _name,int _age) {name=_name; age=_age;}
  在本例中,前三个构造方法都采用了:this(参数)的调用方法,调用了最后一个带有_name和_age参数的构造方法来初始化对象,对于姓名缺省的构造方法,则用null代替,对于年龄缺省的构造方法,则用0代替。对于姓名和年龄都缺省的构造方法,则用null和0代替。
 
3.4 继承
    1. 子类所需的成员在父类中必须是非私有的,因为无法继承私有成员,另一个解决方法是在父类中使用公有set/get方法访问其私有成员变量。
    2. 当我们创建一个类层次的时候,应当线抽象出父类,再通过父类衍生出子类。
    3. 当子类被调用的时候,隐含地调用父类地构造方法,此时没有为构造方法输入任何参数,除非在子类地第一行明确地调用父类的构造方法,如果父类没有无参数的构造方法,子类又没有明确的调用父类的构造方法,编译器将无法编译子类。
    4. 避免隐蔽地调用父类的构造方法,可使用两种解决方法:
        1).每个子类都应当明确的调用超类的一个构造方法,而且必须在第一行。
        2).为每个可能成为父类的类提供一个无参数的构造方法,如果还有其他需要则重载构造方法。
    5. super的作用:
        1).调用父类的构造方法:super(参数/null);
        2).调用父类的成员方法:super.classMethord(参数/null);
        3).调用父类的成员变量:super.classField;
    6. 如果在子类中重新定义了一个与它的父类完全相同的一个方法,子类的方法将覆盖父类中的同名方法,此时父类中该方法仍会在父类中使用,但要加上关键字super和圆点操作符。同理成员变量。
    7. 如果继承与被继承的方法的参数类型、数目相同,即使参数的名称不同,系统也认为是同一方法,不能通过编译。
    8. 如果重定义的方法的参数列表与父类中该方法的列表不一致,那么应该在父类中重载而不是在子类中覆盖。
    9. 尽量避免覆盖成员变量,它会使到代码难以理解,如果有很多变量都需要覆盖,则意味着不应该从该父类中扩展出该子类。
    10. 父类中应该尽量包含所有子类的公有属性和方法。对于特殊的属性和方法则在子类中去实现。
    11. 如果类B继承了类A,那么类B就是类A,所以可以用类A的构造方法来初始化子类的一个对象,然后在子类B的构造方法中再修改具体的成员变量的值。
    12.重载与覆盖的区别:
                             重载                继承
    类的层次    针对同一个类中的同名方法而言    针对父类与子类中的同名方法而言
    方法名称    各重载方法的名称必须完全相同    被继承与继承的方法名称必须完全相同
    返回类型    各重载方法的返回值的类型必须完全相同    被继承与继承的方法的返回值的类型必须完全相同
    参数类型    各重载方法的参数类型可以不同    被继承与继承方法的参数类型必须完全相同
    参数数目    各重载方法的参数数目可以不同    被继承与继承的方法的参数数目必须完全相同
 
    13. 当一个抽象方法被添加到一个类以后,该类也必须声明为抽象类。
    14. 在抽象类中声明抽象方法可以迫使子类实现继承而来的抽象方法。声明一改方方为抽象方法时,无需实现该方法,但要确保它的所有子类实现该方法。
    15. 如果多个类都具有相同的属性,可以放在其抽象父类中让其子类去继承,如果多个类都具有相同目的,但不同实现细节的方法,可以放在其抽象父类中并将其定义为抽象方法,让其子类去继承实现。
    16. 创建一个程序类时应该注意以下事项:
         1). 把一个现实世界的实体当作一个类来处理,每个待处理的实体都作为单独一个类。
         2). 对于每个实体,使用”is a”,”has a”,”does a”来描述这个类的名称属性,成员变量,成员方法以及它们的关系。
         3). 确保每个类尽可能地小,而且方法尽可能地简单。
         4). 通过已有地类,用继承、重载、覆盖减少代码重复。
         5). 包含main方法地类作为主类,但实际大多数工作应该是其他的类来完成。
    17. 最常使用final限定词的情况是常数,因为static使得该变量只存在一个拷贝,final使得它不能改变。用户可以用这些变量名代替具体数值。
    18. 每个Java类隐含地扩展了Object类。System.out.println方法自动调用toString方法,将一个对象转换成为它的代表字符串,因此,我们在设计一个类地时候,都应该重载toString方法来进一步提供关于它的有用信息,然后,可以用System.out.print(ObjectName)来显示类的实例对象,此时对象将自动调用方法toString。
    19. 每个Java类都是由Object扩展而来的,因此,所有的类都属于Object类型,我们可以创建一个Object类型的数组来存储任何类型的对象。反过来,每个元素都可以在数组中检索到,在
         instanceof的帮助下能确定其原来的类型。如:
         Object object[ ]=new Object[4];
         object[0]=new Double(1.0);           object[1]=new Integer(2);
         object[2]=new String(“Hello world”);   object[3]=new Character(‘a’);
         System.out.println((object[0] instanceof Double)); //判断一个对象的类型
         System.out.println((object[1] instanceof Integer));
         System.out.println((object[2] instanceof String));
         System.out.println((object[3] instanceof Character));
 
    20. 如果定义了一个Object类型的数组,意味着它可以包含任何对象。要使用object数组中的实际对象类型,首先要把它们强制转换为实际类型。如果所使用的方法都是所有对象的通用方法,则不必将对象进行强制转换。
    21. 要在一个数组中存储相关对象,可以创建一个类作为这些类的父类,并且定义该数组为父类类型的数组。如果在父类中定义一个抽象的方法,所有扩展父类的类必须实现该方法,而且不必对对象进行强制转换就可以调用这些方法。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值