继承:
1、一个类的私有成员变量和方法,靠实例化对象是不能调用的;
通过类中的公有方法调用私有成员变量,一般是set()
和get()
方法;
通过反射机制调用类中的私有方法;
2、继承机制只能继承父类的公有方法和变量,相应的也只能重写父类的公有方法和变量;
3、由于子类会继承父类的成员变量,因此实例化对象时需要先调用父类的构造方法来初始化父类的成员变量;
如果父类有无参构造方法,可以不用显式的用super()
,系统自动添加;
如果父类没有无参的构造方法,且有多个,需要在子类中的*每一个*构造方法第一行显式的用super()
,根据需要调用其中一个构造方法;
class TestA
{
public String A;
public int B;
public TestA(String A,int B){
this.A = A;
this.B = B;
System.out.println("父类的二参构造方法");
}
public TestA(String A){
this.A = A;
System.out.println("父类的一参构造方法");
}
public void action1(){
System.out.println("父类的公有方法");
}
}
class TestB extends TestA{
public int B;
public TestB(){
super("uuu");
System.out.println("子类的无参构造方法");
}
public TestB(int B){
super("ttt",10);
System.out.println("子类的有参构造方法"); //此处主函数没有调用,所以是多余的
}
public void action3(){
System.out.println("子类的公有方法");
}
private void action4(){
System.out.println("子类的私有方法");
}
public void setA(String A){
this.A = A;
}
public String getA(){
return A;
}
}
public class Test{
public static void main(String[] args){
TestB c = new TestB();
System.out.println(c.getA());
//System.out.println(c.B);
c.action1();
c.action3();
//c.action4();
}
}
多态:
首先多态性的三个必要满足的条件:
1.有继承
2.有方法的重写
3.有父类引用指向子类对象
class Father
{
int r;
Father()
{
r=4;
}
void printname()
{
System.out.println("I'm father");
System.out.println(2*r);
}
}
class Child extends Father
{
int r;
Child()
{
r=5;
}
void printname()
{
System.out.println("I'm Child");
System.out.println(3*r);
}
}
public class Test
{
public static void main(String[] args)
{
Father obj=new Child();
System.out.println(obj.r);
obj.printname();
}
}
输出结果:
4
I’m Child
15
表明:
属性是访问父类的,方法是访问子类的;
若子类方法中含有父类的属性,如果该属性未被重写,用父类的值,若被子类重写,用子类的值;
在Father obj=new Child();这个语句中,obj是Father类型的,Father含有printname()这个函数,就为obj建立一个用于调用printname()函数的指针。而且,因为obj指向的是new Child(),是个Chld类的实例。所以调用obj.printname()时调用了Child类中定义的printname()。