面向对象
类和对象:面向对象的语言,面向对象的思想。 oop
this: 指向当前对象的内存。指向对象不准确,this在构造函数里的时候,这时候并没有对象。 this必须放在函数第一行。static里面不能用this。
static:方法区。 不管有多少对象,静态代码块只初始化一次。
final:所修饰的值在编译期间就会被确定。
对象的初始化方式:
- 提供一系列的 set get 方法。
class Person {
private int age;//数据
public void setAge(int age) {
this.age = age;//this当前类的对象
}
public int getAge() {
return age;
}
}
- 通过合适的构造函数进行初始化。构造函数是可以被重载的。
class Person {
private String name;
private String sex;
public Person(String name,String sex) {
this.sex = sex;
this.name = name;
}
}
- 静态块初始化(静态代码块):对象调用静态方法,编译器会发生警告,因为静态方法不属于对象。 static所修饰的方法或者静态成员不依赖于对象。通过类名直接调用。
static {
count = 10;
System.out.println("static {} init");
}
- 实例块初始化(构造代码块):
class Person {
{
this.name = "haha";
this.sex = "superman";
this.age = 18;
System.out.println("instance {} init");
}
}
- 面试问题1:对象的创建分为那几步?
对象的初始化顺序:静态块初始化>实例块初始化>构造函数初始化。
内部类
内部类定义在局部时(局部内部类):
- 不可以被成员修饰符修饰。
- 可以直接访问外部类成员,因为持有外部类的引用,但不可以访问他所在的局部中的变量,只能访问被final修饰的局部变量。内部类在使用函数的局部变量的时候,只能读不能写,也就是说可以把它的值赋给另外的值,但是不能修改他的值,jdk1.7之前,局部内部类所在的函数的变量如果要被内部类使用,必须显式的加final,1.7之后更加智能化,不需要加,如果调用,系统会默认的加final。
静态内部类:被static 修饰。
-
面试问题2:
-
如何访问外部类的非静态数据成员?
传入一个外部类的对象。
OuterClass outerClass = new OuterClass();
OuterClass.InnerClass innerClass1 = new OuterClass.InnerClass(outerClass);
- 静态内部类是否拥有外部内对象?
不拥有。
实例内部类:没static修饰 外部类名.内部类名 对象=外部类对象.new 内部类
OuterClass2 outerClass2 = new OuterClass2();
OuterClass2.InnerClass2 innerClass2 = outerClass2.new InnerClass2();
- 面试问题3:
- 实例内部类是否有额外的开销(实例内部类是否拥有外部类对象)?
有外部类对象。拥有两个this(一个外部类,一个自己的。两个可以同时调用)。
System.out.println(this.data3); //实例内部类的对象
System.out.println(OuterClass2.this.data3); //外部类的对象
- 实例内部类是否可以有静态数据成员?
可以有,必须加final。 但是这个静态数据成员需要在编译期间确定。 因为final所修饰的值在编译期间就会被确定。
匿名内部类:就是内部类的简写格式
前提:匿名内部类必须继承一个类或者实现接口。
格式:new 外部类名(父类/接口)(){ 定义(内部类)子类的内容 } 一般游戏按钮用的较多。
调用方法:new 外部类名(父类/接口)(){ 定义(内部类)子类的内容 } .匿名内部类的方法
其实匿名内部类就是一个匿名子类对象。
class OuterClass3 { //外部类
public void sayHello() {
System.out.println("hello");
}
}
public class TestInnerClassDemo2 {
public static void test(OuterClass3 out3) {
out3.sayHello();调用外部类的方法
}
public static void main(String[] args) {
new OuterClass3(){
public void sayHello() { //匿名内部类的方法,也就是重写外部类(父类)的方法
System.out.println("main : hello");
}
}.sayHello();
test(new OuterClass3());/创建一个外部类匿名对象并调用 test方法。
}
}