但是,有一点需要注意的是,在方法的重载中只是根据参数类型或个数来区分的,与返回值是否相同无关
数组操作相关的方法:java.util.Arrays.sort(数组名称)、System.arraycopy()数组拷贝
每一个对象拥有各自的内存空间,所以不会互相影响,而且可以发现一点,每一个对象中实际上保存的只是属性,
并没有保存方法,因为所有的方法都是每个对象所共同拥有的,保存在全局代码区之中。
栈内存保存的是对堆内存的引用地址,而堆内存中保存的是每一个对象所拥有的属性,
而全局代码区之中保存的是所有类中的方法,表示公共调用。
构造方法的定义:在一个类中定义的方法名称与类名称相同,且无返回值声明的方法,称为构造方法。
但是,在一个类中如果没有明确的定义一个构造方法的话,则会自动生成一个无参的,什么都不做的构造方法。
两种比较的区别:==和equals()
• ==:用于数值比较,比较的是两个字符串的地址值
• equals():用于内容的比较,比较两个字符串的内容是否相等
个字符串肯定是保存在堆内存之中的,所以一旦一个字符串声明之后,则无法改变。
public class StringDemo08 {
public static voidmain(String args[]){
String str ="hello" ;
str = str + "world" ;
str += "!!!" ;
System.out.println(str);
}
};
通过内存图可以发现一点,每一个字符串的内容原本并没有发生任何的改变,
改变的是只一个字符串的内存地址的指向,而且操作完成之后会发现有很多的垃圾产生,
所以,以后对于频繁修改字符串的代码应该尽可能的回避,所以以下的代码是极其垃圾的:
public class StringDemo09 {
public static voidmain(String args[]){
String str ="hello" ;
for(intx=0;x<10000;x++){
str += x ;
}
System.out.println(str);
}
};
字符串串中的 mail.indexValue("@")==-1则mail中不存在 @的符号!
如果现在在一个类中调用了本类的方法的话,可以使用“this.方法()”,
但是对于方法的调用,使用this也可以调用类中的构造方法,但是只局限于在一个构造方法中调用其他构造方法的形式。
this()调用本类中无参构造!
如果使用this调用本类中其他构造方法的话,则此语句必须放在构造方法的首行
个类中如果有多个构造方法的话,则肯定保留有一个是不用this调用其他构造的情况,以作为出口”。
字符串的内容无法改变,改变的只是内存地址的指向。
//对象之间的比较使用compare 比较的是地址相等
public boolean compare(Person person){
if(this == person){ // 地址相等了
return true ;
}
if(this.name.equals(person.name)&& this.age==person.age){
return true ;
} else {
return false ;
}
}
static本身声明方法或声明属性,但是在方法的访问上本身也存在着问题。
1、 使用static声明的方法,不能访问非static的操作(属性或方法)
2、 非static声明的方法,可以访问static声明的属性或方法
1、 如果说现在一个类中的属性或方法都是非static类型的,肯定是要有实例化对象才可以调用。
2、 static声明的属性或方法可以通过类名称访问,可以在没有实例化对象的情况下调用。
在程序中使用“{}”括起来的一段代码就称为代码块,根据代码块出现的位置或声明的关键字的不同,分为四种:
•普通代码块:在一个方法中定义的代码块,称为普通代码块
•构造块:在一个类中定义的代码块
构造块会优先于构造方法执行,而且每当一个新的实例化对象产生时,都会调用构造块,会调用多次
•静态块:使用static关键字声明的代码块
在主类中定义的静态块将优先于主方法执行,而且可以发现静态块优先于构造块执行,而且只执行一次
• 同步代码块:留到线程再讲
从实际的开发来看,代码块的使用并不多
一个在方法中定义的内部类,依然可以访问外部类中的属性,但是对于方法的参数,这个内部类是无法直接访问的,如果要访问,则在参数前面必须使用final关键字进行声
class Outer {
private String info = "hello" ;
public void fun(final int x){
final int y = 100 ;
class Inner { // 方法中声明内部类
public void print(){
System.out.println(info);
System.out.println("x= " + x) ;
System.out.println("y= " + y) ;
}
};
new Inner().print() ;
}
};
public classInnerDemo06 {
public static void main(String args[]){
new Outer().fun(30) ;
}
};
重载及覆写的区别
No. | 区别点 | 重载 | 覆写 |
1 | 定义 | 方法名称相同,参数的类型或个数不同 | 方法名称、参数的类型或个数、返回值相同 |
2 | 权限 | 没有权限要求 | 被覆写的方法不能拥有比父类更严格的权限 |
3 | 范围 | 发生在一个类之中 | 发生在继承关系中 |
4 | 单词 | OverLoading | Override |
this与super的区别
No. | 区别点 | this | super |
1 | 使用 | 调用本类中的属性或方法 | 从子类调用父类中的属性或方法 |
2 | 构造 | 可以调用本类构造,且有一个构造要作为出口 | 从子类调用父类的构造方法,不管子类如何安排最终一定会去调用,默认调用的是父类中的无参构造方法 |
3 | 要求 | 调用构造的时候一定要放在构造方法首行 | 放在子类构造方法首行 |
使用super和this调用构造方法的语句是不可能同时出现的 | |||
4 | 特殊 | 表示当前对象 | 无此概念 |
抽象类的定义比较简单,包含一个抽象方法的类就是抽象类,抽象类必须使用abstract关键字进行声明。
抽象方法:只声明而未定义方法体的方法称为抽象方法,抽象方法也必须使用abstract关键字声明。
1、 抽象类不能直接实例化。
2、 抽象类必须有子类,子类(如果不是抽象类)的话,则必须覆写抽象类中的全部抽象方法。
3、 如果一个抽象类中没有任何一个抽象方法,依然是抽象类
1、 抽象类能使用final声明吗?
· 不能:final声明的类不能被继承,而抽象类又必须要有子类。
2、 抽象类中能有构造方法吗?
· 可以存在,而且依然符合于子类对象的实例化过程的要求
抽象类和普通类相比,只是增加了抽象abstractclass的声明,和增加了抽象方法而已。
1、 方法的重载及覆写
2、 对象多态性:指的是父类对象和子类对象之间的转型操作
· 向上转型(子类 à 父类):父类名称 父类对象 = 子类实例 ; ,自动完成
· 向下转型(父类à 子类):子类名称 子类对象 = (子类名称)父类实例 ;