关于java比较全面的面向对象概念 如果所有的构造方法在最开始的时候有相同的一部分代码,不妨将这个公共的代码提取到构造代码块当中,这样代码可以得到复用 this 本质上是一个引用,this 中保存的也是对象的内存地址 this 中保存的也是对象的内存地址 this 中保存的是当前对象的内存地址 this.是可以省略的. 默认访问的就是当前对象的name this 存储在: 栈帧的局部变量表的第0个槽位上. this 大部分情况下可以省略,用于区分局部变量和实例变量时不能省略. this 不能出现在静态方法中. - this 代表的是当前对象,static的方法中没有当前对象,所以static的方法中不能使用this this(实参) 语法: 1.只能出现在构造方法的第一行 2.通过当前构造方法去调用本类中其他的构造方法. 3.作用: 代码复用 static 修饰的变量:静态变量 static 修饰的方法:静态方法 所有static修饰的,访问的时候,直接采用 "类名",不需要 new 对象 什么情况下把成员变量定义为静态成员变量? 静态变量存储在哪里? 静态变量什么时候初始化? (= 什么时候开辟空间?) 答: JDK8之后: 静态变量存储在堆空间中. 类加载时初始化. 静态变量可以采用引用访问,(但不建议,会给程序员造成困惑,程序员会认为 country 是一个实例变量). 静态方法中不能使用 this 关键字,因此无法直接访问实例变量和调用实例方法. 静态代码块在类加载时执行,一个类中可以编写多个静态代码块,遵循自上而下的顺序依次执行. 静态代码块代表了类加载时刻,如何你有代码需要在此刻执行,可以将该代码放到静态代码块中. 使用引用.访问静态相关的即使引用为null,也不会出现空指针异常. 在同一个类中,类名. 是可以省略的. 成员方法只能通过 实例变量和实例方法才可以调用 静态代码块: 为程序员预留的特殊的时间点:类加载时刻 如果你需要在类加载时刻执行一段程序的话,这段代码就可以写到静态代码块当中 例如: 有这样一个需求,请在类加载时,记录日志.那么记录日志的代码就可以编写到静态代码块当中. 继承作用: extends 翻译为 扩展, 表示子类继承父类后,子类是对父类的扩展 继承相关的术语: java只支持单继承,一个类只能继承一个类. java不支持多继承,但支持多层继承, 子类继承父类,除私有的,构造方法不支持继承,其他的全部会继承. 一个类没有显示继承任何类,默认会继承 java.lang.Object类 方法覆盖/ 重写 / 什么是向上转型和向下转型? java允许具有继承关系的父子类型之间的类型转换 向上转型: 子 ---> 父 向下转型: 父 ---> 子 无论是向上转型还是向下转型? 前提条件是: 两种类型之间必须存在继承关系. 这样编译器才能通过. 什么是多态? 父类型引用指向子类对象: 程序分为编译阶段和运行阶段: 多态指的是: 多种形态, 编译阶段 一种形态, 运行阶段 一种形态, 因此称为多态. 向下转型我们需要注意什么? instanceof 运算符的使用构造代码块有什么用?
public class Student {
{
for(int = 0; i< 10; i++);
System.out.println("i = " + i);
}
public Student() {
System.out.println("Student类的无参构造方法执行了")
}
}
public class ConstructorTest {
public static void main(String[] args) {
new Student();
new Student("张三");
}
}
初识 this
实例变量
局部变量
静态变量
静态代码块 :特殊时间点(类加载时刻)
初始化代码块
static 关键字
继承
// 方法覆盖说的实例方法,和实例变量无关.
// 实例变量不存在覆盖这一说, a.name 编译阶段绑定的是 A类的 name属性,运行的时候也会输出A类的name属性值
public class Test2 {
public static void main(String[] args) {
A a = new B();
System.out.println(a.name);
}
}
class A {
// 实例变量
String name = "张三";
}
class B extends A {
// 实例变量
String name = "李四";
}
多态
Animal a = new Cat(); a.move()
抽象类
创建一个名为 Person 的类,在其中定义方法 greet(),用于问候对方. 在此基础上,创建一个名为 EnglishPerson的子类和名为 ChinesePeron的子类
分别复写 greet() 方法, 分别使用英文和中文问候对方. 在main方法中 创建一个名为person的数组,添加一个 EnglishPerson对象和一个 ChinesePerson对象
使用greet() 方法问候对方.
public abstract class Person {
public Person() {
}
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract void greet(); // 抽象方法
}
class ChinesePerson extends Person{
@Override
public void greet() {
System.out.println("你好呀,我的名字是 " + this.getName() + " 我很好!");
}
}
public class EnglishPerson extends Person{
@Override
public void greet() {
System.out.println("Hello, My name is " + this.getName() + " How are you ?");
}
}
public class Test {
public static void main(String[] args) {
Person englishPerson = new EnglishPerson();
englishPerson.setName("Frank");
englishPerson.greet();
System.out.println("---------------------");
Person chinesePerson = new ChinesePerson();
chinesePerson.setName("吴彦祖");
chinesePerson.greet();
}
}
Super 关键字
Stay Curious, Stay Naive.