Java的构造方法

 

   看下面的例子,觉得应该输出什么?

  

public class A {
	public A() {
//先把下面这句去掉
//System.out.println(this.getClass());
		set();
	}
	
	void set() {
		System.out.println("A");
	}
	
	static class B extends A {
		 B() {
			set();	
		 }
		 
		void set() {
			get();
		 	 System.out.println("B");
		 }
		void get(){
		}
	}
	
	public static void main(String[] args) {
		B b = new B();
	}
	
}

    当时,看到这个题目,犯了两个错误:

       1. 不知道new B() 的时候,如果没有指定父类的构造方法,就会默认的调用A(), 也就是super();

           new B的时候,必须B这个类加载到内存,可是B是继承自A的,也可以理解为依赖

          所以,当然首先得把A加载到内存!

       2. 知道会默认的调用父类的构造方法后,不确定调用的到底是哪个set()方法!

 

    其实 ,上面代码打印的应该是两个B,不会调用A中的set

    通过在A中的构造方法打印在调用set方法的对象时,注意不是A , 而是A$B

    所以,调用的是B中的set方法!

    可是,为什么会这样了?

      是不是可以这样理解,把B() 中的super()调用看成是"this.super()(实际上子类是不能访问父类的构造方法的,除了使用super)"

      super()和它里面的set()都是同一个级别的,也就是都是通过同一个this访问的

      这就好比调用B自己类中实现了的set() , 然后set()中又有一个新的方法 get() , 这个get()不就等同于super()中的set()吗?

### Java 构造方法的用法及其示例 #### 什么是构造方法? 在 Java 中,构造方法是一种特殊的方法,用于创建并初始化对象的状态。它具有与类相同的名称,并且不返回任何数据类型(甚至 `void`)。当通过 `new` 关键字实例化一个新对象时,相应的构造方法会被调用来完成必要的初始化工作。 #### 默认构造方法 如果开发者未显式定义任何构造方法,则编译器会自动提供一个无参的默认构造方法[^1]。然而,一旦定义了一个自定义构造方法,默认构造方法将不再由编译器生成。 ```java public class MyClass { int value; // 自动提供的默认构造方法(如果没有定义其他构造函数) public MyClass() { this.value = 0; } } ``` #### 参数化的构造方法 参数化的构造方法允许传递初始值给对象属性,在创建对象的同时设置其状态。 ```java public class Person { String name; int age; // 带有参数的构造方法 public Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Person{name='" + name + "', age=" + age + "}"; } } // 使用带参数的构造方法来创建对象 Person person = new Person("Alice", 30); System.out.println(person.toString()); // 输出: Person{name='Alice', age=30} ``` #### 静态工厂方法 vs 构造方法 尽管可以通过静态工厂方法替代传统的构造方法实现对象创建,但它们之间存在一些差异。例如,静态工厂方法可以拥有有意义的名字、返回缓存的对象或者子类型的实例等特性[^3]。 ```java class MyBeanFactory { private static final Map<String, MyBean> cache = new HashMap<>(); public static synchronized MyBean getMyBeanInstance(String key) { if (!cache.containsKey(key)) { cache.put(key, new MyBean()); } return cache.get(key); } } // 调用静态工厂方法获取对象实例 MyBean myBean = MyBeanFactory.getMyBeanInstance("uniqueKey"); ``` #### 复合模式中的构造方法应用 某些设计模式如单例模式也依赖于私有的构造方法防止外部随意实例化该类[^1]。 ```java public class SingletonExample { private static SingletonExample instance; // 私有化构造方法阻止外界直接访问 private SingletonExample() {} public static SingletonExample getInstance() { if(instance == null){ instance = new SingletonExample(); } return instance; } } ``` #### 注意事项 - 如果尝试除以零的操作将会抛出 ArithmeticException 异常;但是有一种特殊情况即最小整数值被负一相除不会引发异常而是保持原样[^4]。 - 功能测试关注的是应用程序的功能需求是否满足预期行为而不涉及内部结构细节[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值