JAVA的继承与封装
继承的概念
–继承是面向面向对象三大特征之一,是实现软件复用的重要手段–通过继承,可以根据已有类来定义新类,新类拥有已有类的所有功能(属性和方法)–Java的继承通过extends关键字来实现,实现继承的类称为子类(派生类),被继承的类称为父类(基类、超类)–父类和子类的关系,是一般和特殊的关系继承的语法
class childClass extends parentClass
{
//类体
}
例子
public class Person {
public String name;
public String getName() {
return name;
}
}
public class Employee extends Person {
public int employeeNumber;
public int getEmployeeNumber() {
return employeeNumber;
}
}
public class Manager extendsEmployee {
public String responsibilities;
public String getResponsibilities() {
return responsibilities;
}
}
说明:子类不能直接访问从父类中继承的私有属性及方法,但可使用公有(及保护)方法进行访问
public class B {
public int a = 10;
privateintb = 20;
protected int c = 30;
public intgetB() { return b; }
}
public class A extends B {
public int d;
public void tryVariables() {
System.out.println(a); //允许
System.out.println(b); //不允许
System.out.println(getB()); //允许
System.out.println(c); //允许
}
}
3,方法的重载与覆写重载–Java允许同一个类里定义多个同名方法,只要形参列表不同即可。如果同一个类中包含了两个或两个以上方法的方法名相同,但形参列表不同,则称为方法重载–方法重载的要求就是两同、一不同:同一个类中方法名相同,参数列表不同。至于方法的其他部分,如方法返回值类型、修饰符等,与方法重载没有任何关系–由于Java的方法调用可以忽略返回值,故不能使用返回类型来区分重载的方法
方法覆写(override)–如果子类不需使用从父类继承来的方法的功能,则可以声明自己的同名方法,称为方法覆写–覆写方法的返回类型,方法名称,参数的个数及类型必须和被覆写的方法一摸一样–只需在方法名前面使用不同的类名或不同类的对象名即可区分覆写方法和被覆写方法–覆写方法的访问权限可以比被覆写的宽松,但是不能更为严格
方法覆写的应用场合–子类中实现与父类相同的功能,但采用不同的算法或公式–在名字相同的方法中,要做比父类更多的事情–在子类中需要取消从父类继承的方法必须覆写的方法–派生类必须覆写基类中的抽象的方法,否则派生类自身也成为抽象类.不能覆写的方法–基类中声明为final的终结方法调用被覆写的方法–super.overriddenMethodName();public class Ostrich extends Bird {
public void fly() {
System.out.println(“我只能在地上奔跑…”);
}
public void callOverridedMethod() {
//fly();
super.fly();
}
public static void main(String args[]) {
Ostrich os = new Ostrich();
// do something
}
}
创建子类对象时会隐式创建父类对象
class Father {
public Father() {
System.out.println(“Father Create”);
}
}
public class Child extends Father {
public Child() {
System.out.println(“Child Create”);
}
public static void main(String args[]) {
Father fa = new Fahter();
Child ch = new Child();
}
}
输出:
Father Create
Father Create
Child Create
以下方法为基类的一个方法:
void method() { }
请问以下哪些是子类中覆写该方法的正确形式?
请选择所有正确答案(多选题):
A. void method() { }
B. int method() { return 0; }
C. void method(inti) { }
D. private void method() { }
A. 方法覆写的基本原则是保持参数列表和返回值类型不变。B是错的,因为返回类型不一致。C是错的,因为参数列表不一致。D是错的,因为子类中覆写的方法缩小了访问控制范围。
有继承时的构造方法遵循以下的原则–子类不能从父类继承构造方法–好的程序设计方法是在子类的构造方法中调用某一个父类构造方法,调用语句必须出现在子类构造方法的第一行,可使用super关键字–如子类构造方法的声明中没有明确调用父类构造方法,则系统在执行子类的构造方法时会自动调用父类的默认构造方法(即无参的构造方法)
重载和覆写的差异–重载方法彼此之间独立,实质上是不同的方法;覆写和被覆写方法之间是取代的关系–重载方法存在同一个类中,其数量无限制;而覆写方法和被覆写方法分别存在于子类和父类中,其子类最多有一个覆写方法–重载方法之间必须具有不同的参数列表;而覆写和被覆写方法之间必须具有相同的参数列表
隐藏和封装
–指的是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问–例如Person对象的age属性,只能随着岁月的流逝,age属性才会增加,通常不能随意修改Person对象的age属性。实现良好的封装的目的:–隐藏类的实现细节–让使用者只能通过事先预定的方法来访问数据,从而可以在该方法里加入控制逻辑,限制对属性的不合理访问–可进行数据检查,从而有利于保证对象信息的完整性–便于修改,提高代码的可维护性 访问控制符 public protected default private 同类 O O O O同包 O O O子类 O O通用性 O–Java类里属性的setter和getter方法有非常重要的意义,例如某个类里包含了一个为abc的属性,则其对应的setter和getter方法名应为setAbc和getAbc。如果一个Java类的每个属性都被使用private修饰,并为每个属性都提供了public修饰setter和getter方法,这个类就是一个符合JavaBean规范的类。因此,JavaBean总是一个封装良好的类。
l为了实现良好的封装,需要从两个方面考虑:–将对象的属性和实现细节隐藏起来,不允许外部直接访问–把方法暴露出来,让方法来操作或访问这些属性
因此,封装实际上有两个方面的含义:把该隐藏的隐藏起来,把该暴露的暴露出来