Add:
当实例化一个子类时,其所有父类的属性方法都在这个对象的内存中,但是能否直接访问需要根据具体属性、方法的访问修饰符来确定。
package com.use.myextends;
import com.use.myextends.exercise.Student;
/*
* 继承细节
* 1、子类继承父类所有的属性和方法,但是私有属性和方法不能在子类中直接访问 要通过公共的方法去访问
* 2、子类必须调用父类的构造器,完成父类的初始化
* 3、当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器
* 如果父类没有提供无参构造器,则必须在子类的构造器中用super去指定使用父类的哪个构造器
* 完成对父类的初始化工作,否则,编译不会通过
* 4、如果希望指定去调用父类的某个构造器,则需要使用 super(参数) 显式调用
* 5、super在使用时,必须放在构造器的第一行(只能在构造器中使用)
* 6、super() 和 this() 都只能放在构造器的第一行,因此这两个方法不能共存在一个构造器
* 7、所有的类都是Object类的子类
* 8、父类构造器的调用不限于直接父类,将一直往上追溯到Object类(顶级父类)
* 9、子类最多只能继承一个父类(直接继承),java中是单继承机制
* 如果C类想继承B类和A类,需要C继承B,B继承A,则C也可以调用A中的可调用属性和方法
* 10、子类和父类之间必须满足 is-a 的逻辑关系
*/
public class MyExtendes {
public static void main(String[] args) {
// Student student = new Student();
// 不同包下的类,默认和protected级别不能直接访问
// System.out.println(student.name + student.age + student.score);
// Sub sub = new Sub();
// 在创建子类对象时 默认会调用父类中的无参构造器
// sub.subInfo();
System.out.println("======第2个对象======");
Sub sub01 = new Sub(1);
// sub继承父类的父类
sub01.topBaseFunc();
}
}
class MyStudent extends Student{
//不同包下的子类 默认级别不能直接访问 protected可访问
public void showInfo(){
// System.out.println(name+age+score);
}
}
package com.use.myextends;
public class Sub extends Base{
public Sub(int n1){
// 若父类中不存在无参构造器,需要用 super(参数) 来显式调用父类中指定的构造器
super(n1);
System.out.println("子类中的Sub(int n1)构造器");
}
// public Sub(){
super();
// // 创建对象时,会默认使用此函数 调用父类中的无参构造器,此函数无需显式调用,系统编译时默认调用
// System.out.println("子类中的Sub()构造器");
// }
public void subInfo(){
test100();
test200();
test300();
testPrivate();
// test400(); // 私有属性/方法不能在子类中直接调用
}
}
package com.use.myextends;
public class Base extends TopBase{
public int n1=100;
protected int n2 = 200;
int n3 = 300;
private int n4 = 400;
public Base(int n1){ //父类中的无参构造器
System.out.println("父类中的Base(int n1)构造器");
}
// public Base(){ //父类中的无参构造器
// System.out.println("父类中的Base()构造器");
// }
// 父类中的私有属性&方法 需要通过父类提供的方法访问
public void testPrivate(){
System.out.println(n4);
test400();
}
public void test100(){
System.out.println("test100().....");
}
protected void test200(){
System.out.println("test200().....");
}
void test300(){
System.out.println("test300().....");
}
private void test400(){
System.out.println("test400().....");
}
}
package com.use.myextends;
public class TopBase {
public void topBaseFunc(){
System.out.println("topBaseFunc() 被调用");
}
}
package com.use.myextends;
public class ExtendsExercise {
public static void main(String[] args) {
B b = new B();
}
}
class A{
A(){System.out.println("a");}
A(String name){System.out.println("a name");}
}
class B extends A{
B(){this("abc");System.out.println("b");};
// this("abc") 会调用下方构造器,构造器中默认有 super() 函数,会调到父类A中的无参构造器
B(String name){System.out.println("b name");}
}