我们熟悉的一个概念是,“子类不能继承父类私有的属性或方法”,但其实是可以继承的,只是因为修饰符的原因,我们不能直接调用。

代码解释:

父类/超类/基类 Persons :

package OOP.atguigu.extend;

public class Persons {
	private int age;  // 私有的属性
	public String name; // 共有的属性
	
	// 定义一个共有的方法
	public void eat() {
		System.out.println("吃饭");
		sleep(); // 在eat方法里面调用sleep方法
	}
	
	// 定义一个私有的方法
	private void sleep() {
		System.out.println("睡觉");
	}

	/**
	 * @return the age
	 */
	public int getAge() {
		return age;
	}

	/**
	 * @param age the age to set
	 */
	public void setAge(int age) {
		this.age = age;
	}

}

子类/派生类 Students:

package OOP.atguigu.extend;

// 让Student继承Persons类
public class Student extends Persons {
	public String grade; // 定义一个共有的属性,学生的年级
	
	// 打印学生的年级信息
	public void showGrade() {
		System.out.println("学生的年级为:" + this.grade);
	}
}

测试类:

package OOP.atguigu.extend;

public class StudentTest {
	public static void main(String[] args) {
		// 实例化一个Student对象
		Student s = new Student();
		
		s.grade = "一年级"; // student自己所具有的属性
		s.setAge(10); // 通过set方法设置继承来的私有属性
		s.name = "tom"; // 直接对继承来的共有属性进行赋值
		
		s.eat();
// 		s.sleep(); sleep() 是私有方法,不能被调用,否则会报错
		System.out.println("学生年龄为:" + s.getAge()); // s调用getAge()方法来获得age属性
	}
}

结果截图:

java调用子类私有方法 java子类调用父类私有属性_System

总结:

通过运行结果看出,eat方法输出了自己的语句,同时又调用了sleep方法,eat方法是被继承的,但是sleep方法的执行也说明了sleep方法也被继承了。只是由于修饰权限导致不能直接调用。set和get 方法也是被继承的,通过他们对age属性进行了赋值,说明age 属性也被继承了。