Java 编程思想 - 第七章 复用类

该博客围绕复用类展开,介绍了组合、继承、代理等概念。组合是在新类中产生现有类对象,有多种初始化位置;继承涉及无参和带参构造器。还讲解了protected、final等关键字的作用,以及向上转型、初始化及类的加载等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第七章 复用类

1.组合

概念:在新类中产生现有类对象。
PS:每一个类都有一个toString()方法,而且当编译器需要一个String时而代码中却只有一个对象,该方法就会被调用。例如:

Student stu = new Student();
System.out.print("Student info:"+stu);

1.1 组合语法对象初始化位置

1.定义对象的地方

String s = "string";

2.在类的构造器中
3.惰性初始化

class A{
	private String name;
	public String toString(){
		return name;
	}
}

class B{
	private A a;
	public String lazy(){
		a = new A();
	}
}

public class LazyTest{
	public static void main(String[] args){
		B b = new B();
		//使用时才去初始化对象a
		b.lazy();
		System.out.print(b.a);
	}
}

4.实例初始化

Student stu = new Student();

2.继承

2.1 无参构造器

当创建了一个导出类的对象时,该对象包含了一个基类的子对象。这个子对象和你用基类直接创建出来的是一样的,它们二者唯一的区别是一个来自外部,一个被包装在导出类内部。

从下述代码可以看见,类的构建过程是从基类开始往外扩散的。所有基类在导出类构造器可以访问它之前,就已经完成了初始化。即使不为类创建构造器,编译器也会合成一个默认的无参构造器,该构造器会调用基类构造器。

public class ConstructorTest extends B{
  public ConstructorTest() {
       System.out.println("This is class ConstructorTest");
   }

   public static void main(String[] args) {
       ConstructorTest constructorTest = new ConstructorTest();
  }
}

class A {
   public A(){
       System.out.println("This is class A");
   }
}

class B extends A{
   public B(){
       System.out.println("This is class B");
   }
}
/*output:
This is class A
This is class B
This is class ConstructorTest
*/

从下述代码可以看出,实例化对象时,类先加载属性,然后才是构造方法。

public class Test5 {
   public static void main(String[] args) {
       C c= new C();
   }
}

class A{
   public A() {
       System.out.println("This is class A");
   }
}

class B{
   public B() {
       System.out.println("This is class B");
   }
}

class C extends A{
   private B b = new B();
   public C() {
       System.out.println("This is class C");
   }
}
/*output:
This is class A
This is class B
This is class C
*/

2.2 带参构造器

如果基类没有默认的无参构造器,或者想调用一个带参构造器,导出类的构造器中就需要显示的使用super关键字调用基类构造器并匹配合适的参数列表。

3.代理

类似于实现接口,将方法的实现细节封装起来。

public class Test11 {
   public static void main(String[] args) {
       MyServiceImpl myServiceImpl = new MyServiceImpl();
       myServiceImpl.up();
       myServiceImpl.down();
   }
}

class MyService{
   public MyService() {
   }
   void up(){
       System.out.println("up");
   }
   void down(){
       System.out.println("down");
   }
}

class MyServiceImpl{
   private MyService myService = new MyService();
   public MyServiceImpl() {
   }
   void up(){
       myService.up();
   }
   void down(){
       myService.down();
   }
}
/*output:
up
down
*/

4.名称屏蔽(方法重载、重写)

如果基类拥有多个同名重载方法,并不影响导出类新建同名重载方法。但是如果导出类重载方法参数列表与基类重载方法一致,那么导出类会重写(@Override)该方法而不是重载(@Overload)。如果添加了@Override注解,但是基类或没有同样参数列表的同名方法,那么编译器会报错。例:

public class OverloadTest {
   public static void main(String[] args) {
       People p = new People();
       p.talk();
       System.out.println(p.talk("s"));
       System.out.println(p.talk(1));
       System.out.println(p.talk(1.0));
   }
}

class Human{
   void talk(){
       System.out.println("Human talk");
   }
   int talk(int i){
       return i;
   }
   double talk(double d){
       return d;
   }
}

class People extends Human{
   String talk(String s){
       return s;
   }
   /*重写基类方法*/
   @Override
   void talk(){
       System.out.println("people talk");
       super.talk();
   }

}
/*output:
people talk
Human talk
s
1
1.0
*/

7.protected关键字

protected关键字用来为导出类提供基类的访问权限,同时protected还拥有包访问权限。

8.向上转型

概念:
把导出类引用转换为基类引用的动作称为向上转型。由于导出类是基类的超集,基类拥有的属性方法导出类都会有,所以向上转型总是很安全的。在向上转型的过程中,类接口唯一可能发生的事就是丢失方法,而不是获取他们。

9.final关键字

final可能会在数据、方法和类上使用到,每个地方都有不同的含义。

9.1 final数据

1.用final声明数据时,指明该数据为常量。(final修饰的数据在新建对象时初始化)
2.在对常量进行定义时必须对其赋值。(可以在常量的定义处赋值或者每个构造器中赋值)
3.使用static final 定义的常量为编译时常量。(static final修饰的数据在装载时就被初始化且不可改变)

使用static final修饰的数据并不会因为新建对象而改变,因为它在加载类的时候就已经被初始化并指向固定地址。使用final修饰的数据并不能一定在编译时就知道该数据的值,因为它在新建对象的时候才被初始化。例如:

public class FinalTest {
   private static Random rand = new Random();
   private final int A = rand.nextInt();
   private static final int B = rand.nextInt();

   public static void main(String[] args) {
       System.out.println(new FinalTest());
       System.out.println(new FinalTest());
       System.out.println("B="+B);
   }

   @Override
   public String toString() {
      return "A=" + A;
  }
}
/*output:
A=229042376
A=-486992066
B=-267339427
*/

9.2 final参数

使用final来修饰参数列表中的参数,意味着你对传进来的参数只有只读权限,不可更改。这一特性主要用来向匿名内部类传递数据。

9.3 final方法

使用final修饰方法,表明该方法不能被覆写。

9.4 final类

使用final修饰类,表明该类不能被继承。

10.初始化及类的加载

类加载通常发生于创建类的第一个对象时。但是当访问类中的static域(成员变量)或者static方法时,类也会被加载。

10.1 继承与初始化

下述代码表明了当运行LoadOrder.main()方法时,加载器会启动并找出LoadOrder类的编译代码(.class文件),在对它进行加载时发现它有一个基类,于是它对基类进行加载,加载First.x1的时候,为了获取其值,执行了printInit()方法。然后再加载LoadOrder类,加载LoadOrder.x2时至性printInit()方法。加载完后执行LoadOrder.main()方法中的语句,新建对象时先执行基类构造器,再执行导出类构造器。

public class LoadOrder extends First{
   private int k = printInit("LoadOrder.k initialized");

   public LoadOrder() {
       System.out.println("k="+k);
       System.out.println("j="+j);
   }
   private static int x2=printInit("static LoadOrder.x2 initialized");

   public static void main(String[] args) {
       System.out.println("LoadOrder constructor");
       LoadOrder f = new LoadOrder();
   }
}

class First{
   private int i = 9;
   protected int j;
   public First() {
       System.out.println("i="+i+",j="+j);
       j=39;
   }
   private static int x1=printInit("static First.x1 initialized");
   static int printInit(String s){
       System.out.println(s);
       return 47;
   }
}
/*output:
static First.x1 initialized
static LoadOrder.x2 initialized
LoadOrder constructor
i=9,j=0
LoadOrder.k initialized
k=47
j=39
*/

总结:无论是加载类还是初始化类,始终会先加载基类(根基类),然后才是一个一个的导出类。初始化类也会从基类开始按顺序加载属性。

内容概要:本文档提供了关于“微型车间生产线的设计与生产数据采集试验研究”的毕业设计复现代码,涵盖从论文结构生成、机械结构设计、PLC控制系统设计、生产数据采集与分析系统、有限元分析、进度管理、文献管理和论文排版系统的完整实现。通过Python代码和API调用,详细展示了各个模块的功能实现和相互协作。例如,利用SolidWorks API设计机械结构,通过PLC控制系统模拟生产流程,使用数据分析工具进行生产数据的采集和异常检测,以及利用进度管理系统规划项目时间表。 适合人群:具有机械工程、自动化控制或计算机编程基础的学生或研究人员,尤其是从事智能制造领域相关工作的人员。 使用场景及目标:①帮助学生或研究人员快速搭建和理解微型车间生产线的设计与实现;②提供完整的代码框架,便于修改和扩展以适应不同的应用场景;③作为教学或科研项目的参考资料,用于学习和研究智能制造技术。 阅读建议:此资源不仅包含详细的代码实现,还涉及多个学科领域的知识,如机械设计、电气控制、数据分析等。因此,在学习过程中,建议读者结合实际操作,逐步理解每个模块的功能和原理,并尝试调整参数以观察不同设置下的系统表现。同时,可以参考提供的文献资料,深入研究相关理论和技术背景。
本次的学生体质健康信息管理网站,按照用户的角色可以分为教师与学生,后台设置管理员角色来对学生的信息进行管理。,设计如下: 1、后台管理系统 后台管理系统主要是为该系统的管理员提供信息管理服务的系统,具体包括的功能模块如下: (1)管理员信息管理 (2)教师信息管理 (3)学生信息管理 (4)健康信息统计(图形化进行健康,亚健康等学生的信息数量统计) 2、教师角色的功能模块设计 教师角色所需要的功能模块主要包括了如下的一些内容: (1)个人资料修改 (2)学生体质健康管理:录入相关数据,包括但不限于身高、体重、肺活量、视力等生理指标以及运动能力、身体成分、骨密度等健康指标,并且设置健康,亚健康状态 (3)学生健康建议:根据体质信息,进行学生健康的建议 (4)健康预警:对健康出问题的学生,进行健康预警 (5)饮食和锻炼情况管理,查看 3、学生角色 学生角色可以通过该信息网站看到个人的基本信息,能够看到教师给与学生的健康建议等,功能模块设计如下: (1)个人资料修改 (2)我的健康建议查看 (3)我的健康预警 (4)饮食和锻炼情况管理,记录平时的饮食和锻炼情况 完整前后端源码,部署后可正常运行! 环境说明 开发语言:Java后端 框架:ssm,mybatis JDK版本:JDK1.8+ 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:eclipse/idea Maven包:Maven3.3+ 部署容器:tomcat7.5+
网站前台: (1)站内新闻:及时发布康复中心动态、行业资讯等,让用户了解最新消息。 (2)用户注册,登录:支持用户注册新账号并登录系统,开启预约等操作。 (3)科室介绍:详细介绍康复中心各科室,含功能、特色治疗等信息。 (4)医生列表,详情:展示医生信息,如履历、擅长领域,助用户选医生。 (5)老年生活风采:呈现老年人康复生活照片等,展示康复后的精彩状态。 (6)预约入院:用户填写姓名、电话等信息,提交入院预约申请。 网站后台: 管理员 (1)管理员密码修改:管理员可自主修改登录密码,保障账号安全。 (2)用户注册管理,审核:对新用户注册信息审核,确保信息真实合规。 (3)站内新闻管理:发布、编辑、删除站内新闻,把控资讯更新与质量。 (4)科室信息管理:维护科室信息,包括介绍、设备等内容的增删改。 (5)医生信息管理:管理医生资料,可更新履历、擅长方向等信息。 (6)老年生活风采管理:上传、整理、替换老年生活风采相关展示内容。 (7)预约入院管理:处理用户入院预约,安排入院时间和流程。 用户 (1)用户资料修改:用户可修改个人注册资料,保证信息准确性。 (2)我的预约住院结果:查询预约入院审核结果,了解住院安排情况。 完整前后端源码,部署后可正常运行! 环境说明 开发语言:Java后端 框架:ssm,mybatis JDK版本:JDK1.8+ 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:eclipse/idea Maven包:Maven3.3+ 部署容器:tomcat7.5+
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值