面向对象的特征:封装(private)继承(extends) 多态
继承:子类扩展父类的功能并将父类的操作都继承下来。允许多层继承,
- 子类只允许继承父类的公有方法和公有成员
- 父类的私有方法和成员需要间接才能访问
如用直接用name则不行 需用getName
Code
class A
{
private String name ;
public void setName(String name)
{
this.name = name ;
}
public String getName()
{
return this.name ;
}
};
class B extends A
{
public void say()
{
System.out.println(getName()) ;
}
};
- 子类对象实例化时,先默认调用父类的无参构造函数(默认隐含了一个super()方法);子类对象实例化-----父类的无参构造函数-----子类的无参构造函数
Code
package com.miao.demo6;
class A
{
public A()
{
System.out.println("1、public A(){}") ;
}
};
class B extends A
{
public B()
{
// 此处隐含了一段代码
super() ;
System.out.println("2、public B(){}") ;
}
};
public class OODemo06
{
public static void main(String args[])
{
B b = new B() ;
}
};
- 方法的覆写:子类覆写父类方法时不能拥有比父类更严格的方法,方法名都一样,参数也一样,子类调用的永远是覆写后的方法
Code
class A
{
void fun1()
{
System.out.println("* 1、A --> public void fun1()") ;
}
};
class B extends A
{
public void fun1()
{
System.out.println("* 2、B --> public void fun1()") ;
}
};
public class OODemo07
{
public static void main(String args[])
{
B b = new B() ;
b.fun1() ;
}
};
权限:
- public
- default
- private只能在一个类中
重载:方法名称相同,参数的类型或个数不同,是发生在同一个类中 覆写:方法名称相同,访问权限最好相同参数的类型或个数一样,在子类中实现
- 可以通过super(),根据参数来来调用父类的构造方法。默认是无参的。
- 通过super().方法可以调用被子类覆写的方法。
Code
class A
{
public String say()
{
return "hello" ;
}
};
class B extends A
{
public String say()
{
return super.say()+" world!!" ;
}
};
public class OODemo09
{
public static void main(String args[])
{
System.out.println(new B().say()) ;
}
};
this与super的概念:
Codeclass A{ String name = "MIAO" ; public String say() { return "hello" ; }};class B extends A{ String name = "zhxiaomiao" ; public B() { super() ; System.out.println("HELLO") ; } public String say() { return super.say()+" world!! --> "+super.name ; }};public class OODemo10{ public static void main(String args[]) { System.out.println(new B().say()) ; }};
可以看到在super()的构造方法必须在首行,因为子类构造函数初试化之前先调用父类的构造函数。
看下完整的继承:
Code
class Person
{
// 先设计好一个完整的Person类
private String name ;
private int age ;
public Person(String name,int age)
{
this.setName(name) ;
this.setAge(age) ;
}
public void setName(String name)
{
this.name = name ;
}
public void setAge(int age)
{
this.age = age ;
}
public String getName()
{
return this.name ;
}
public int getAge()
{
return this.age ;
}
public String say()
{
return "姓名:"+this.name+",年龄:"+this.age ;
}
};
class Student extends Person
{
private String school ;
public Student(String name,int age,String school)
{
super(name,age) ;
this.setSchool(school) ;
}
public void setSchool(String school)
{
this.school = school ;
}
public String getSchool()
{
return this.school ;
}
public String say()
{
return super.say()+",学校:"+this.school ;
}
};
public class OODemo11
{
public static void main(String args[])
{
Student s = new Student("张三",30," 人才培养基地") ;
System.out.println(s.say()) ;
}
};
例子:
Code
// 为了代码的简单,程序暂时不封装
class Employee
{
String name ;
int age ;
float salary ;
// 表示一个雇员有一个领导
Manager mgr = null ;
public Employee(String name,int age,float salary)
{
this.name = name ;
this.age = age ;
this.salary = salary ;
}
public String say()
{
return "姓名:"+this.name+",年龄:"+this.age+",薪水:"+this.salary ;
}
};
class Manager extends Employee
{
// 管理的人员数
int number ;
public Manager(String name,int age,float salary,int number)
{
super(name,age,salary) ;
this.number = number ;
}
public String say()
{
return super.say()+",管理人员数:"+this.number ;
}
};
public class OODemo12
{
public static void main(String args[])
{
Employee e = new Employee("李四",20,15000) ;
Manager m = new Manager("张三",30,3000,5) ;
// m是e的领导
e.mgr = m ;
System.out.println("雇员信息:"+e.say()) ;
// 为了防止mgr的内容为空,如果为空则肯定出现NullPointerException
if(e.mgr!=null)
{
System.out.println("经理信息:"+e.mgr.say()) ;
}
}
};