一、方法重载
好处:规范代码,增强代码的可读性,提供多种解决问题的形式。
构成重载的条件:1. 在同一个类中; 2. 方法名相同; 3. 参数不同(参数数量不同或类型不同,至少满足一个)
同时满足以上三个条件就构成方法重载,方法重载和方法的返回值无关,但从开发的规范性考虑,方法重载尽量保证返回值类型一致。
二、方法覆写
好处:改写父类的方法,满足不同的需求
构成覆写的条件:1. 父类和子类的关系;2. 方法名相同;3. 参数类型和数量都相同;4. 子类覆写的方法的访问权限不能比父类更严格(public、protected、default、private)
三、递归
方法自己调用自己,递归程序的编写规律:1.参数和返回值分别是什么? 2. 递归的结束条件是什么? 3. 前后项的关系是什么?
范例:求1到100连续整数的和
分析:
编写:
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):
八、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属性初始化