当前位置: 首页 > news >正文

Java学习笔记四(继承)

1 继承

继承的实现:public class 子类 extends 父类 {… }

注释:子类可直接使用,父类(保护,公开)的属性和方法

优点:减少重复代码,缺点:只能单继承

// 父类
public class Test {private String str1; //私有String str2;         //默认protected String str3;// 保护public String str4;    //公开private void fn1() {} //私有void fn2() {}         //默认protected void fn3() {}// 保护public void fn4() {}   //公开
}
// 子类
public class SubTest extends Test {public void subFn1() {String t3 = str3;String t4 = str4;fn3();fn4();}
}

2 子类实例化

子类构造器默认先调用父类无参构造器(可省略),父类没有无参构造器(必须先显示调用有参构造器)

public class 子类 extends 父类 {public 子类() {[super();] // 可省略子类处理…}
}

3 方法重写

注释:子类定义了与父类相同的方法(方法重写)

// 父类
public class Test {public String name = "张三";public void doTest() {System.out.println(name);}
}

测试类1:子类未重写方法,调父类方法使用的是父类属性(不会输出子类同名属性)

// 子类
public class SubTest1 extends Test {public String name = "李四";
}
public class Main {public static void main(String[] args) {SubTest1 s = new SubTest1(); System.out.println(s.name); //输出 李四s.doTest();  //输出 张三(子类没有该方法,父类该方法输出父类名字)}
}

测试类2:子类重写属性方法后,使用的是子类的属性

//子类
public class SubTest2 extends Test {public String name = "李四";public void doTest() {System.out.println("son:"+name);} 
}
public class Main {public static void main(String[] args) {SubTest2 s = new SubTest2();System.out.println(s.name); // 输出 李四s.doTest();// 输出 son:李四}
}

测试类3:子类对象定义为父类类型,输出父类属性,调用的是子类方法

//子类
public class SubTest2 extends Test {public String name = "李四";public void doTest() {System.out.println("son:"+name);} 
}
public class Main {public static void main(String[] args) {Test s = new SubTest2();System.out.println(s.name);  // 输出 张三s.doTest();   // 输出 son:李四}
}

测试类4:子类对象强转父类类型,输出父类属性,调用的是子类方法

//子类
public class SubTest2 extends Test {public String name = "李四";public void doTest() {System.out.println("son:"+name);} 
}
public class Main {public static void main(String[] args) {SubTest2 s = new SubTest2();Test ss = (Test)s;System.out.println(ss.name);  // 输出 张三ss.doTest();  // 输出 son:李四}
}

4 方法重载

方法名(相同)参数(个数或类型)(不同)与返回值无关

public class Test {public String fn(String str){ }// 重载1,参数类型不同public String fn(int num) {}// 重载2,参数个数不同public String fn(int age, int num) {}}

5 super关键字

注释:只可在子类内部使用,使子类可以使用父类原生方法与属性

(1) 调用父类构造器:super([参数…]);

(2) 调用父类属性:super.属性; // 获取与更改父类的属性,不影响子类同名属性

(3) 调用父类方法:super.方法(); // 调用父类的方法,与子类是否重写无关

// 父类
public class Test {private String str1 = "私有";String str2 = "默认";protected String str3 = "保护";public String str4 = "公开";private String fn1() { return str1; }String fn2() { return str2; }protected String fn3() { return str3; }public String fn4() { return str4; }
}
// 子类
public class SubTest extends Test {protected String str3 = "保护(son)";public String str4 = "公开(son)";protected String fn3() { return str3; }public String fn4() { return str4; }// 调用父类构造器(默认不写也调用)public SubTest() {super();}// 调用父类方法public void test() {System.out.println(super.str3);  // 输出 父类 保护System.out.println(super.str4);  // 输出 父类 公开System.out.println(super.fn3());  // 输出 父类 保护System.out.println(super.fn4());  // 输出 父类 公开}public void testSub() {System.out.println(str3);  // 输出 子类 保护(son)System.out.println(str4);  // 输出 子类 公开(son)System.out.println(fn3());  // 输出 子类 保护(son)System.out.println(fn4());  // 输出 子类 公开(son)}
}

6 代码执行顺序

6.1 静态方法

// 初次调用:类名.静态方法() 

1.类加载(静态变量初期化,只执行1次)

2.类加载(静态代码块,只执行1次)

3.静态方法执行

// 之后再调用:类名.静态方法() // 只重复执行3

3.静态方法执行

6.2 实例化对象

// 初次实例化:new 对象()

1.类加载(静态变量初期化,只执行1次)

2.类加载(静态代码块,只执行1次)

3.代码块(执行)

4.构造器(执行)

// 之后再实例化:new 对象()  // 只重复执行3,4

3.代码块(执行)

4.构造器(执行)

6.3 子类静态方法

// 初次调用:子类.静态方法() 

1.父类加载(静态变量初期化,只执行1次)

2.父类加载(静态代码块,只执行1次)

3.子类加载(静态变量初期化,只执行1次)

4.子类加载(静态代码块,只执行1次)

5.子类静态方法(执行)

// 之后再调用:子类.静态方法()  // 只重复执行5

5.子类静态方法(执行)

6.4 子类实例化对象

// 初次调用:new 子类对象() 

1.父类加载(静态变量初期化,只执行1次)

2.父类加载(静态代码块,只执行1次)

3.子类加载(静态变量初期化,只执行1次)

4.子类加载(静态代码块,只执行1次)

5.父类代码块(执行)

6.父类构造器(执行)

7.子类代码块(执行)

8.子类构造器(执行)

// 之后再调用:new 子类对象()  // 只重复执行5,6,7,8

5.父类代码块(执行)

6.父类构造器(执行)

7.子类代码块(执行)

8.子类构造器(执行)

总结:1 只有初次类加载初始化静态变量,执行静态代码块。2 父类(变量,代码块,构造器)优先于子类执行。3 代码块优先于构造器执行。


文章转载自:

http://6hvND1hk.wLbwp.cn
http://V5nvlyW0.wLbwp.cn
http://36ySJ2EQ.wLbwp.cn
http://fbaklDOI.wLbwp.cn
http://NnVnEdHc.wLbwp.cn
http://f3c63zl0.wLbwp.cn
http://4XgHSFzB.wLbwp.cn
http://zDUKHPhY.wLbwp.cn
http://J2kmF8dZ.wLbwp.cn
http://ijYA3CBo.wLbwp.cn
http://jHFIJec1.wLbwp.cn
http://p6zxfXsH.wLbwp.cn
http://vNU8QqzD.wLbwp.cn
http://0ZHNk24M.wLbwp.cn
http://qc4YRTZ8.wLbwp.cn
http://4kGdiBC3.wLbwp.cn
http://hiSdan4g.wLbwp.cn
http://xvTHZfVo.wLbwp.cn
http://aFbXarEQ.wLbwp.cn
http://13foSOLB.wLbwp.cn
http://klYFc2OG.wLbwp.cn
http://UpR0m5ML.wLbwp.cn
http://xlySzl69.wLbwp.cn
http://22E3d5Qp.wLbwp.cn
http://UhBZHcWs.wLbwp.cn
http://a44ukya1.wLbwp.cn
http://565QUkJa.wLbwp.cn
http://ynmxgsZf.wLbwp.cn
http://B8RBAINz.wLbwp.cn
http://cZyvRdqM.wLbwp.cn
http://www.dtcms.com/a/378190.html

相关文章:

  • Redis分布式锁的try-with-resources实现
  • 广东省省考备考(第九十七天9.11)——言语(刷题巩固第三节课)
  • ReentrantLock 源码深度解析
  • 机器人驭风而行:低空经济如何开启智能新纪元
  • 【系统架构设计(27)】信息安全技术集成
  • spring mvc 拦截器 (HandlerInterceptor )
  • 【Nginx】- 日志定期清理设置
  • 102、23种设计模式之装饰器模式(11/23)
  • SwiftData3 一剑封喉:WWDC25 的“数据剑谱”精讲,让 Core Data 老侠原地退休
  • [硬件电路-180]:集成运放,在同向放大和反向放大电路中,失调电压与信号一起被等比例放大;但在跨阻运放中,失调电压不会与电流信号等比例放大。
  • IDEA连接redis数据库时出现Failed to connect to any host resolved for DNS name.
  • kafka:【2】工作原理
  • ctfshow_web14------(PHP+switch case 穿透+SQL注入+文件读取)
  • 中电金信携手海光推出金融业云原生基础设施联合解决方案
  • 【Linux】初始Linux:从计算机历史发展、操作系统历史脉络的角度详谈Linux相关的话题,附Linux安装和用户创建(环境准备)详解
  • 软件设计师_第十章:软件工程(上)
  • ptx 简介03,ldmatrix 的应用实例解析
  • CSS的平面转换transform
  • CSS 居中
  • Golang进阶(二):设计先行
  • 腾讯深夜“亮剑”,AI编程“王座”易主?CodeBuddy发布,Claude用户一夜倒戈
  • 突破机器人通讯架构瓶颈,CAN/FD、高速485、EtherCAT,哪种总线才是最优解?
  • 【开题答辩全过程】以 _基于SSM框架的植物园管理系统的实现与设计为例,包含答辩的问题和答案
  • 哈希表封装myunordered_map和myunordered_set
  • 9.9网编项目——UDP网络聊天室
  • 单表查询-having和where区别
  • LVGL:基础对象
  • 【LeetCode - 每日1题】将字符串中的元音字母排序
  • 签名、杂凑、MAC、HMAC
  • C++与QT高频面试问题(不定时更新)