`
heimeiyingwang
  • 浏览: 94981 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

corejava辅导(4--1)

阅读更多

面向对象的三大特征:封装、继承、多态

 

Java中的封装

 

封装,一个对象和外界的联系应当通过一个统一的接口。

对象中的内容应当公开的公开,应当隐藏的隐藏。(对象的属性应当隐藏)

一个对象的内部是透明的,把对象内部的可透明性和隐藏的特性区分开,该透明的透明,该隐藏的隐藏。

 

属性的封装java中类的属性的默认访问权限不是private,是default,不加访问权限修饰符的属性和方法默认为default

隐藏该属性或方法,要加private(私有)修饰符,限制只能在类的内部进行访问。属性一般都作成私有private

对于类中的私有属性,要对其给出一对方法(getXxx(),setXxx())访问私有属性,保证对私有属性的操作的安全性。

 

方法的封装,对于方法的封装,该公开的公开,该隐藏的隐藏。方法公开的是方法的声明(定义),即(只须知道参数和返回值就可以调用该方法),隐藏方法的实现会使实现的改变对架构的影响最小化。

 

封装的意义,封装会使方法实现的改变对架构的影响最小化。

 

完全封装,类的属性全部私有化,并且提供一对方法来访问属性。

 

例:

public class Person{

     private int age;//属性的封装

     private String name;

     public String getName(){

         return name;

     }

     public void setName(String name){

        this.name=name; //this是一个关键字,他代表的是当前对象

         //这一句的意思就是为本对象的属性name进行赋值               

    }

     public int getAge(){//方法的封装

         return age;

}

private String nickname(){//方法的封装

     ……

}

public void setAge(int age){

     this.age=age

}

 

}

 

java中的继承

 

继承,是对有着共同特性的多类事物,进行再抽象成一个类。这个类就是多类事物的父类。父类的意义在于可以抽取多类事物的共性。

 

java中的继承要使用extends关键字,java中只允许单继承,一个类只能有一个父类。

这样继承关系呈树状,体现了java的简单性。

 

子类只能继承在父类中可以访问的属性和方法(父类中私有的属性和方法会被继承但子类中但无法访问罢了)。

 

访问控制修饰符:(可以修饰属性和方法)

private修饰符,表示只有本类内部可以访问。

default修饰符,方法不加修饰符,默认为default,表示在同一个包中可以访问,父子类在同一包中,子类可以继承父类的相应内容。(可以修饰类)

protected(保护)修饰符,表示同一包中可以访问,不同包的子类也可以访问继承。

public修饰符,表示公开,在任何地方都可以访问。(可以修饰类)

修饰符的权限是由上而下逐渐变宽的。

 

继承的意义,子类可以在父类的基础之上对父类的功能进行发展,继承使系统的耦合性降低,使对象间的联系变得松散,使多类对象间的联系可用其父类对象代替。

 

注意:构造方法不能被继承

 

父类的属性及方法的确定:从子类的角度来看子类间的共性,所有子类都有这个属性时,应当考虑是否该放在父类中。

方法可以看作是对象的行为,类的方法是这一类的对象所共有的行为,所以应当在方法的确定时,注意是不是所有的子类型中都需要有这个方法,根据不同的子类型的该方法的不同,才覆盖这个方法。

 

java中方法的覆盖

 

子类中有和父类可访问可继承到子类)的同名、同返回值类型、同参数表方法,才是覆盖了父类继承来的方法

 

注意:覆盖父类中的某个方法,子类中写的方法要和父类中的方法名、参数表、返回值类型,都相同的,权限访问修饰符比父类的方法的权限修饰符的权限要么相同,要么更宽。

 

注意:在jdk1.4以前要求方法的覆盖时,需要方法的返回值,参数表,方法名必须严格相同,而在jdk1.5中方法覆盖,子类的中覆盖的方法的返回值可以是父类中被覆盖的方法的返回值类型的子类型。

 

注意:子类覆盖父类的方法时,方法的修饰符要么相同,要么子类中的方法的修饰符表示的访问权限要宽于父类。父类中的私有方法,不能被继承到子类,子类中即使将其覆盖了也不会有多态。

 

覆盖的意义:对从父类中继承的方法的发展。

 

注意:父子类中有同名的属性不叫子类覆盖了父类的属性,这种情况较作属性的遮盖(shadow)。

 

例:

public class Person{

     ……

     private int age;

     public void study(){

         System.out.println(“学习”);

     }

}

class Child extends Person{

     private int age;//属性的遮盖

     public void study(){//覆盖了父类中的study()方法

         System.out.println(“在小学学习”);

     }

}

public class Test{

     static public void main(String[] args){

         Person p=new Child();

         p.study();

     }

}

当构造有继承关系的对象的步骤

1,递归的构造父类的对象

2,分配空间

3,初始化本类实例变量(属性)

4,调用本类的构造方法

 

注意:子类对象中包含着父类的对象,父类对象加上子类对象,才是完整的子类对象的实例。在构造子类对象时,先递归的构造父类对象,会默认的调用父类的无参的构造方法,所以最好将类中无参构造方法写上。

分享到:
评论
2 楼 xiaofei_suman 2008-12-08  
写的很好 ,学习了
1 楼 H_eaven 2008-12-08  
1>: private int age;//属性的遮盖
这个访问修饰符至少应该是package-private的.
对于子类至少就访问到基类才能出现遮盖,如果子类看不到那么super.age会报错的.
2>: 1.5已有协变返回类型了,子类返回(? extends T)是可以的.不过意义不大,好的作法总应该返回抽象类型,有用处的例外是重写clone()方法时可以用,调用代码少写个转型.


相关推荐

Global site tag (gtag.js) - Google Analytics