一、方法重载

好处:规范代码,增强代码的可读性,提供多种解决问题的形式。

构成重载的条件:1. 在同一个类中; 2. 方法名相同; 3. 参数不同(参数数量不同或类型不同,至少满足一个)

同时满足以上三个条件就构成方法重载,方法重载和方法的返回值无关,但从开发的规范性考虑,方法重载尽量保证返回值类型一致。

二、方法覆写

 好处:改写父类的方法,满足不同的需求

构成覆写的条件:1. 父类和子类的关系;2. 方法名相同;3. 参数类型和数量都相同;4. 子类覆写的方法的访问权限不能比父类更严格(public、protected、default、private)

三、递归

 方法自己调用自己,递归程序的编写规律:1.参数和返回值分别是什么? 2. 递归的结束条件是什么? 3. 前后项的关系是什么?

范例:求1到100连续整数的和

分析:

Java易忽略的小知识点 java易混淆知识点_System

编写:

package com.mldn.test;

public class Demo01 {
	public static void main(String[] args) {
		System.out.println(getSum(100));
	}
	public static int getSum(int max) {
		// 1.递归的结束条件
		if (max == 1) {
			return max;
		}
		
		// 2.自调,前后项关系
		return getSum(max-1)+max;
	}
}

 四、封装继承、多态

封装:保证类内部的定义不被外部可见,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

  封装可以隐藏实现细节,使得代码模块化

继承:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。

  通过继承创建的新类称为“子类”或“派生类”。 被继承的类称为“基类”、“父类”或“超类”。 继承的过程,就是从一般到特殊的过程。在某些 OOP 语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。  继承可以扩展已存在的代码模块(类)

多态:是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。

  封装和继承,它们的目的都是为了“代码重用”。而多态则是为了实现另一个目的:接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。

五、public、protected、default、private

private:修饰完全隐藏类的成员,这样,就不能从类的外边直接访问他们,我们提供set和get方法,保证类中数据域的安全。

default:指默认修饰符,什么都不加,实际上它限制的范围就是一个包内可以访问。如果不在一个包内,即使继承关系任然是不能访问的。

protected:经常需要允许子类访问定义在父类中的数据和方法,但是不允许非子类访问这些数据和方法,这种情况下就可以使用protected,它允许任何包中的子类访问父类。

public:不用多说,最开放的平台…呵呵

六、构造方法和普通方法的区别

构造方法在实例化对象的时候调用一次,普通方法是在实例化对象之后可以任意多次调用;

类对象实例化的时候设置属性的初始化内容,即:构造方法是为属性初始化准备的,日后如果要改变属性,请使用getter/setter方法

七、== 与 equals

== 一般用于数值的比较,如果用在String 上,则表示对两者的内存地址的比较

equals用于字符串是否相等的比较,比较的是字符串本身,而不是内存地址

比如:

public class Demo01 {
	public static void main(String[] args) {
		String x = new String("hello");
		String y = "hello";
		System.out.println(x == y);		// false
	}
}
public class Demo01 {
	public static void main(String[] args) {
		String x = "hello";	
		String y = "hello";		// 已经存在相同的字符串,JVM不会开辟新的堆内存空间
		System.out.println(x == y);		// true
	}
}
public class Demo01 {
	public static void main(String[] args) {
		String x = "hello";	
		String y = "hello";					// 已经存在相同的字符串,JVM不会开辟新的堆内存空间
		System.out.println(x.equals(y));	// true
	}
}
public class Demo01 {
	public static void main(String[] args) {
		String x = new String("hello");	
		String y = "hello";					// 已经存在相同的字符串,JVM不会开辟新的堆内存空间
		System.out.println(x.equals(y));	// true
	}
}
public class Demo01 {
	public static void main(String[] args) {
		String x = new String("hello").intern();	// 手工入池	
		String y = "hello";
		System.out.println(x == y);	// true
	}
}

String一旦定义了就不会改变,如果定义了不用就会产生垃圾,下面的代码建议不要使用,会产生大量垃圾(改用StringBuffer或StringBuilder):

Java易忽略的小知识点 java易混淆知识点_实例化_02

八、static关键字

  可定义属性和方法,被static定义的属性无需通过实例化对象调用,非static属性要通过实例化对象来调用,使用static修饰的属性,就是共享属性,所有类的实例化对象

都指向它,无论哪个对象修改了这个属性,都同时修改了其他对象的这个属性,共享的。

   static修饰属性的使用时机:方便集体修改、不重复开辟内存空间

   static修饰方法:可通过类直接调用,不必实例化对象,方便,工具类一般都要static修饰

九、代码块、构造块、静态块

代码块:写在方法中的代码模块,用{}做为起始符号,这之间的代码就叫做代码块

public class Demo01 {
	public static void main(String[] args) throws Exception {
		new Book();
		{
			System.out.println("代码块");
		}
	}
}

构造代码块:写在类中的代码快就是构造代码块

package com.mldn.test;

class Book {
	public Book() {
		System.out.println("无参构造");
	}
	{
		System.out.println("构造块");
	}
}
public class Demo01 {
	public static void main(String[] args) throws Exception {
		new Book();
	}
}
构造块
无参构造

构造块比构造方法优先执行,并且有几个实例化对象就输出几次构造块,

静态块:使用static修饰的构造块叫做静态块

package com.mldn.test;

class Book {
	public Book() {
		System.out.println("无参构造");
	}
	{
		System.out.println("构造块");
	}
	static {
		System.out.println("静态块");
	}
}
public class Demo01 {
	public static void main(String[] args) throws Exception {
		new Book();new Book();
		System.out.println("主方法");
	}
}
静态块
构造块
无参构造
构造块
无参构造
主方法

  静态块比构造块还优先执行,优先于主方法执行,而且,不管实例化多少个对象,静态块只执行一次,静态块的作用:为类中static属性初始化

Java易忽略的小知识点 java易混淆知识点_子类_03

Java易忽略的小知识点 java易混淆知识点_Java易忽略的小知识点_04