java基础-09

版权声明:中华人民共和国持有版权 https://blog.csdn.net/Fly_Fly_Zhang/article/details/83542539

面向对象

类和对象:面向对象的语言,面向对象的思想。 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修饰的局部变量。

静态内部类:被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();
  1. 面试问题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方法。
    }
}

猜你喜欢

转载自blog.csdn.net/Fly_Fly_Zhang/article/details/83542539