Java类设计(四)4.1 Java类的继承
1.类的继承
1)为描述和处理个⼈信息,定义类Person:
2)为描述和处理学⽣信息,定义类Student:
3)通过继承,简化Student类的定义:
4)类继承语法规则:
< 修饰符> class < ⼦类名称> [extends < ⽗类>] {
<;属性和⽅法的声明>
}
5)Java只⽀持单继承,不允许多重继承
---⼀个⼦类只能有⼀个⽗类
innocence mv---⼀个⽗类可以派⽣出多个⼦类
6)单继承举例:
7)⼦类继承了⽗类,就继承了⽗类的⽅法和属性。
在⼦类中,可以使⽤⽗类中定义的⽅法和属性,也可以创建新的数据和⽅法。
因⽽,⼦类通常⽐⽗类的功能更多。
8)在Java中,继承的关键字⽤的是“extends”,即⼦类不是⽗类的⼦集,⽽是对⽗类的“扩展”。
9)关于继承的规则:
⼦类不能继承⽗类中私有的(private)的成员变量和⽅法。
4.2访问控制
1.访问控制
可以对Java类中定义的属性和⽅法进⾏访问控制——规定不同的保护等级:public、protected、default、private
修饰符同⼀个类同⼀个包⼦类整体
private Yes
default Yes Yes
protected Yes Yes Yes
public Yes Yes Yes Yes
希腊神话故事全集
private:意思是私有的。这个访问控制修饰符的访问级别最低。使⽤关键字所进⾏的修饰的成员是不允许⾃⾝所在的类之外的其他类进⾏访问的。
default:意思是默认的。但是作为访问修饰符时,default指的是不加任何控制修饰符,并不是要使⽤关键字进⾏修饰。没有使⽤任⼀访问控制修饰符进⾏修饰的成员只能同⼀程序包中的类进⾏访问。
protected:意思是受保护的。使⽤这个访问控制修饰符进⾏修饰的成员只能由派⽣类或统⼀程序包中的类进⾏访问。对其他程序包的派⽣类⽽⾔,效果相当于共有的。对于其他程序的⾮派⽣类来说,效果相当于私有的。
public:意思是公有的、公共的。这个访问控制修饰符的访问级别最⾼。使⽤这个访问控制修饰符进⾏修饰的成员,被访问时不受任何限制。
注意:不能使⽤private和protected这两个访问控制修饰符去修饰类。
在应⽤程序设计上要遵循“尽可能保持数据的私有性”这个原则。
2.访问控制举例:
public class Parent {
private int f1=1;
int f2=2;
在编教师考在职研究生protected int f3=3;
public int f4=4;
private void fm1(){
during怎么读
System.out.println("in fm1() f1=" + f1);
}
void fm2() {System.out.println("in fm2() f2=" + f2);}
protected void fm3() {System.out.println("in fm3() f3=" + f3);}
public void fm4() {System.out.println("in fm4() f4=" + f4); }
}
public class Child extends Parent{
private int c1=21;
public int c2=22;
private void cm1(){System.out.println("in cm1() c1=" + c1);}
public void cm2(){System.out.println("in cm2() c2=" + c2);}
public static void main(String[] args) {
int i;
Parent p=new Parent();
i = p.f2;// i = p.f3; i = p.f4;
p.fm2();// p.fm3(); p.fm4();
Child c = new Child();
i = c.f2; // i = c.f3; i = c.f4;
passive
c.fm2();//c.fm3(); c.fm4()
i = c.c1; // i = c.c2;
<1(); //c.cm2(); c.fm2();
}
}
3.访问控制分析
⽗类Parent和⼦类Child在同⼀包中定义时:
4.3⽅法的重写、覆盖
1.覆盖⽅法
1)在⼦类中可以根据需要对从⽗类中继承来的⽅法进⾏改造-----覆盖⽅法(⽅法的重置、重写),在程序执⾏时,⼦类的⽅法将覆盖⽗类的⽅法。
2)覆盖⽅法必须与被覆盖⽅法具有相同的⽅法名称、参数列表和返回值类型。
3)覆盖⽅法不能使⽤⽐被覆盖⽅法更严格的访问权限。
2.覆盖⽅法举例
1)public class Person {
public String name;
public int age;
心理调整public String getInfo(){
return "Name: "+ name + "\n" +"age: "+ age;
}
}
public class Student extends Person{
exclusive是什么意思
public String school;
public String getInfo() { //覆盖⽅法
return "Name: "+ name + "\nage: "+ age
+ "\nschool: "+ school;
}
public static void main(String args[]){
Student s1=new Student();
s1.name="Bob";
s1.age=20;
s1.school="school2";
System.out.Info()); //Name:Bob age:20 school:school2
}
}
2)public class Parent {
public void method1() {
}
}
public class Child {
private void method1() {
要求的英文//⾮法,⼦类中的method1()的访问权限private⽐被覆盖⽅法的访问权限public弱
}
}
public class UBoth {
public void doOtherThing() {
Parent p1 = new Parent();
Child p2 = new Child();
// p2.method1();//⾮法,⼦类Child中的method1()的访问权限private⽐被覆盖⽅法的访问权限public弱 }
}
4.4super关键字
1.在Java类中使⽤super来引⽤⽗类的成分
---super可⽤于访问⽗类中定义的属性
---super可⽤于调⽤⽗类中定义的成员⽅法
---super可⽤于在⼦类构造⽅法中调⽤⽗类的构造⽅法
---super的追溯不仅限于直接⽗类
2.关键字super举例
public class Person {
public String name;
public int age;
public String getInfo(){
return "Name: "+ name + "\n" +"age: "+ age;
}
}
public class Student2 extends Person{
public String school="new school";exceptionally
public String getSchool() {
return school;
}
public String getInfo() { //覆盖⽅法
Info() + "\nschool: "+ school; //调⽤⽗类的⽅法
}
public static void main(String args[]){
Student2 s1=new Student2();
s1.name="Bob";
s1.age=20;
s1.school="school2";
System.out.Info()); //Name:Bob age:20 school:school2 }
}
3.构造⽅法不能继承
1)⼦类继承⽗类所有的成员变量和成员⽅法,但不能继承⽗类的构造⽅法。
2)在⼀个Java类中可以通过两种⽅式获得构造⽅法
----使⽤系统默认的⽆参数构造⽅法
----显式定义⼀个或多个构造⽅法
ece
3)⼀旦显式定义了构造⽅法,系统不再提供默认构造⽅法
4.构造⽅法不能继承
1)⼦类继承⽗类所有的成员变量和成员⽅法,但不继承⽗类的构造⽅法
2)在⼀个Java类中可以通过两种⽅式获得构造⽅法
---使⽤系统默认的⽆参数构造⽅法
---显式定义⼀个或多个构造⽅法
3)⼀旦显式定义了构造⽅法,则系统不再提供默认构造⽅法
5.调⽤⽗类构造⽅法
1)在⼦类的构造⽅法中可使⽤super(参数列表)语句调⽤⽗类的构造⽅法