一、Java面向对象的三个特性:封装(private)、继承(extends)和多态。
父类:
package com.itstuday.javabean;
public class Person {
String name;
String sex;
int age;
//父类私有属性
private String address = "上海市浦东新区......";
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public void sleep(){
System.out.println("人要睡觉....................." );
}
}
子类:
(1)
public class Student extends Person {
String year;
public Student(String name, String sex, int age, String year) {
this.name = name;
this.age = age;
this.sex = sex;
this.year = year;
}
public void study() {
System.out.println(name+"在"+year+"上课..................");
}
}
(2)
public class Teacher extends Person {
public Teacher(String name,String sex,int age){
this.name = name;
this.sex = sex;
this.age = age;
}
public void say(){
System.out.println(name+"说好好学习.................." );
}
}
测试类:
package com.itstuday.javabean;
public class test01 {
public static void main(String[] args) {
Student s = new Student("乔巴","男",8,"三年级");
//父类继承过来的方法
s.sleep();
//学生特有的方法
s.study();
System.out.println("s = " + s.getAddress());
Teacher t = new Teacher("布鲁克","男",88);
t.sleep();
//老师特有的方法
t.say();
t.setAddress("北京朝阳区");
System.out.println("t = " + t.getAddress());
}
}
结果:
总结:
1.类与类之间的继承需要用到extends关键字。
2.子类继承父类后可以直接使用父类中的非私有的成员变量、方法。
3.子类继承父类后如果要用到父类中的私有变量,需要通过get set方法。
4.继承是把公共的代码提取到父类中,减少代码的冗余,提供代码复用性。
5.子类不能继承父类的构造方法,因为构造方法与类名相同性质导致。
二、继承特点
1.类和类之间支持单继承和多重继承
2.类和类之间不支持多继承
package com.itstuday.javabean;
public class grandMa {
String SexName = "Tome";
}
public class mother extends grandMa {
}
public class daughter extends mother {
//定义成员方法
public void name(){
System.out.println("SexName="+SexName);
}
}
三、继承中的成员特点
主要围绕:成员变量 成员方法 构造方法。
1.继承特性
父类:
package com.itstuday.javabean;
public class mother {
//定义成员变量
int x = 10;
//构造方法
public mother () {
System.out.println("父类的this="+this);
System.out.println("父类的无参构造方法,x="+x);
}
}
子类:
public class daughter extends mother {
//定义成员变量
int y = 20;
//定义构造方法
public daughter() {
System.out.println("子类的this="+this);
System.out.println("子类的无参构造方法,x="+x+",y="+y);
}
}
测试类:
public class test03 {
public static void main(String[] args) {
daughter daughter = new daughter();
System.out.println("daughter = " + daughter);
}
}
执行结果:
总结:
构造方法中都有隐式三步
1) super()调用父类的无参构造方法
2)显示给本类的所有的非静态成员变量赋值
3)执行本类的构造代码块
注:第一步固定执行,二三步执行顺序与书写顺序有关系。
2.重名成员变量
父类:
package com.itstuday.javabean;
public class Father {
int a = 10;
public Father() {
System.out.println("父类的无参构造方法"+a);
}
}
子类:
package com.itstuday.javabean;
public class Son extends Father {
int a = 20;
public Son(){
System.out.println("子类中的a = " + a);
System.out.println("子类中用super调用 = " + super.a);
}
}
测试:
package com.itstuday.javabean;
public class test02 {
public static void main(String[] args) {
Son son = new Son();
}
}
执行结果:
总结:
在子类中的变量名与父类一样,如果想调用父类中的成员变量,则需要用到super关键字。
super与this
public class Son extends Father {
int a = 20;
public Son(){
int a = 30;
System.out.println("子类中的a = " + a);//30
System.out.println("子类中用super调用 = " + super.a);//10
System.out.println("this = " + this.a);//20
}
}
1)this是操作本类的,super是操作父类的,只有继承的时候才有super。
2)this记录着地址值,而super不能记录地址值。
3.成员方法
1.子类继承父类可以调用父类的非私有的成员方法。
2.如果子类的方法中和父类的中的方法名称相同、返回值类型一样并、参数一样切子类方法修饰权限大于或等于父类,则父类方法被重写。
方法重写只有在继承中出现。
父类:
package com.itstuday.javabean;
public class Father {
//成员方法
public void say(){
System.out.println("爸爸说您好!");
}
}
子类:
package com.itstuday.javabean;
public class Son extends Father {
//成员方法
public void say(){
System.out.println("儿子说哈哈!");
}
}
测试类:
package com.itstuday.javabean;
public class test02 {
public static void main(String[] args) {
Son son = new Son();
son.say();
}
}
执行结果:
子类重写父类方法后,以子类方法为主。
4.继承后构造器的特点
父类:
package com.itstuday.javabean;
public class mother {
//1.成员变量
int x = 10;
//2.构造代码块
{
System.out.println("构造代码块,x="+x);
}
//3.构造方法
public mother() {
System.out.println("父类的无参构造方法,x="+x);
}
}
子类:
package com.itstuday.javabean;
public class daughter extends mother {
//1.成员变量
int y = 20;
//2.构造代码块
{
System.out.println("构造代码块,x="+x);
System.out.println("构造代码块,y="+y);
}
//3.构造方法
public daughter() {
System.out.println("子类的无参构造方法,x="+x);
System.out.println("子类的无参构造方法,y="+y);
}
}
测试:
隐式三步执行顺序:
1)super()调用父类的无参构造方法
2)显示给非静态成员变量赋值
3)执行本类的构造代码块
注意:隐式三步的2 3步执行顺序不固定,看书写前后顺序



