成员变量与局部变量:
具体定义不再赘述,记录一些以前忽视的差异;
成员变量在声明过程中会被系统默认初始化,默认值0;
局部变量在声明过程中不会被系统默认初始化;
(final 修饰的为特殊情况,不会初始化)
局部变量和成员变量命名可以重复,当调用过程中冲突时,符合就近原则。(优先调用局部变量)
静态变量、静态方法:
静态变量可以通过对象名直接访问,也可以直接通过类名访问。
非静态类不能以此方式调用,需要声明类后,通过类调用。
public class HelloWorld {
static int staticInt = 99;
public static void main(String[] args) {
System.out.println(staticInt);
System.out.println(HelloWorld.staticInt);
}
}
与静态变量一样静态方法可以通过类名直接调用,而不需要实例化类的对象。
弊端:
静态方法是属于类的,内存必须为它分配内存空间,这个空间一直由静态方法占用,内存管理器不会由于静态方法没有被调用而将静态方法的存储空间收回,这样如果将所有的方法都声明为静态方法,就会占用大量的内存空间。
关于内部类的概念:
静态内部类:
静态相关访问非静态内容都会受到限制,如静态内部类不能直接访问外部类的非静态成员。同样,静态内容声明较为直接,创建静态内部类的对象时,不需要外部类的对象,可以直接创建 内部类 对象名= new 内部类();
方法内部类:
方法内部类就是内部类定义在外部类的方法中,方法内部类只在该方法的内部可见,即只在该方法内可以使用。
Object类:
ToString():
ToString()方法时Object类中的方法,因为所有的类默认继承Object类,所以在将类作为字符串输出时,都会默认调用ToString()方法,一般时将对象转换为关于内存地址的哈希数。如果我们希望返回对象的属性,则需要在对象中对ToString()方法进行重写。
equals():
A.equals(B) 比较的是A,B两个对象的引用是否指向同一个内存区域。
当然,该方法可以由IDE自动重写。
多态:
引用的多态:
父类引用指向本类;
父类引用指向子类;
Animal animal1 = new Animal();
Animal animal2 = new Dog();
方法的多态:
本类方法的调用;
子类对父类方法的继承、重写等。
类型转化:
Animal animal ;
Dog dog = (Dog)new Animal(); //强制类型转化 animal->dog
animal = dog; //自动类型转化dog ->animal
Cat cat1 = (Cat) animal; // 虽然不报错,但是错误。 转化关系相当于dog->cat
通过instanceof 关键字判断是否包含,从而决定是否可以转化。所以在使用强制转化时,最好通过instanceof关键字判断一下。
if(animal instanceof Cat){
System.out.printf("animal 对象含有 Cat 类");
}
接口相关:
匿名内部类:
IPlayGame 为接口,接口中的方法只能声明,无法做具体描述。所以在new对象的时候,需要将抽象方法具体化。
IPlayGame iPlayGame = new IPlayGame() {
@Override
public void PlayGame() {
System.out.printf("使用匿名内部类");
}
};
iPlayGame.PlayGame();
new IPlayGame(){
@Override
public void PlayGame() {
System.out.println("使用匿名内部类2");
}
}.PlayGame();