- 2024.02.29
数组
- 数组中的元素可以是任何数据类型,包括基本类型和引用类型,但不能混用
- 数组创建后,如果没有赋值,有默认值,boolean是false,String是null
- 使用数组的步骤:声明数组并开辟空间,给数组各个元素赋值,使用数组
- 数组在默认情况下是引用传递,赋的值是地址
面向对象编程
-
创建对象的过程:
-
一个方法最多有一个返回值,要返回多个结果需要返回数组
-
基本类型传入参数,传递的是值(值拷贝),形参的任何改变不会影响实参
-
引用数据类型传入参数,传递的是地址,可以通过改变形参来影响实参
-
构成方法重载要满足:
方法名必须相同;
形参列表必须不同(形参类型/个数/顺序,至少有一个不同,参数名称无要求);
返回类型无要求 -
可变参数:
可以有0个或多个;可变参数的实参本质就是数组,所以实参可以是数组;
一个形参列表只能出现一个可变参数
-
全局变量(属性)可以不赋值,直接使用,因为有默认值;局部变量必须赋值后使用,因为没有默认值
-
属性和局部变量可以重名,使用时遵循就近原则
-
属性的生命周期较长,伴随着对象的创建而创建,对象的销毁而销毁;局部变量的生命周期较短,伴随着它的代码块的执行而创建,伴随着代码块的结束而销毁,即在一次方法调用的过程中
-
构造方法(器):
是完成对象的初始化,而不是创建对象;
在创建对象时,系统自动的调用该类的构造方法;
如果程序员没有显示定义构造器,系统会自动给类生成一个默认的无参构造器;
一旦显示定义了自己的构造器,系统提供的默认无参构造器就被覆盖了,除非再显示写出无参构造器
-
this关键字:可以用来访问本类的属性、方法、构造器;用于区分当前类的属性和局部变量;this访问构造器的语法是this(参数列表),只能在构造器中使用(即只能在构造器中访问另一个构造器,且必须放在第一条语句位置);this不能再类定义的外部使用,只能在类定义的方法中使用
-
访问修饰符:公开级别public,对外公开;受保护级别protected,对子类和同一个包中的类公开;默认级别,向同一个包的类公开;私有级别private,只有类本身可以访问,不对外公开
-
只有默认和public可以修饰类
-
子类继承了父类的所有属性和方法,非private的属性和方法可以在子类中直接访问,但是private的属性和方法不能直接访问,要通过父类提供的公共方法去访问
-
子类必须调用父类的构造器,完成父类的初始化(即在子类构造器的第一行默认隐藏的有super(),表示调用父类的构造器,不管有没有显示写出,都默认隐藏存在)
-
当创建子类对象时,不管使用的是子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用super()去指定使用父类的哪个构造器完成对父类的初始化工作,否则编译不通过
-
super代表父类的引用,用于访问父类的属性(但不能访问父类的private属性)、方法(但不能访问父类的private方法)、构造器(只能出现一句,且只能放在构造器中的第一句)
-
super()在使用时,必须放在构造器的第一行(super只能在构造器中使用)
-
super()和this()都必须放在构造器的第一行,因此两个方法不能共存于一个构造器中
-
父类构造器的调用不限于直接父类,将一直追溯到Object类(顶级父类)
-
一个对象的编译类型和运行类型可以不一致,编译类型在定义时就确定了,不能改变,运行类型是可以变化的,编译类型看定义时=的左边,运行类型看=的右边
-
属性没有重写一说,属性的值看编译类型
public class PolyDetail02 {
public static void main(String[] args) {
//属性没有重写之说!属性的值看编译类型
Base base = new Sub();//向上转型
System.out.println(base.count);// ? 看编译类型 10
Sub sub = new Sub();
System.out.println(sub.count);//? 20
}
}
class Base { //父类
int count = 10;//属性
}
class Sub extends Base {//子类
int count = 20;//属性
}
- instanceOf 比较操作符,用于判断对象的运行类型是否为XX类型或XX类型的子类型
什么是多态?多态的具体体现?
- 多态:即方法或对象具有多种形态是OOP的第三大特征
- 方法多态:体现在方法重载和方法重写
- 对象多态:对象的编译类型和运行类型可以不一致(父类引用可以指向子类对象);对象的运行类型是可以变化的,可以通过getClass()方法查看运行类型
public class PolyDetail {
public static void main(String[] args) {
//向上转型: 父类的引用指向了子类的对象
//语法:父类类型引用名 = new 子类类型();
Animal animal = new Cat();
Object obj = new Cat();//可以吗? 可以 Object 也是 Cat 的父类
//向上转型调用方法的规则如下:
//(1)可以调用父类中的所有成员(需遵守访问权限)
//(2)但是不能调用子类的特有的成员
//(#)因为在编译阶段,能调用哪些成员,是由编译类型来决定的
//animal.catchMouse();错误
//(4)最终运行效果看子类(运行类型)的具体实现, 即调用方法时,按照从子类(运行类型)开始查找方法
//,然后调用,规则我前面我们讲的方法调用规则一致。
animal.eat();//猫吃鱼.. animal.run();//跑
animal.show();//hello,你好
animal.sleep();//睡
//老师希望,可以调用 Cat 的 catchMouse 方法
//多态的向下转型
//(1)语法:子类类型 引用名 =(子类类型)父类引用;
//问一个问题? cat 的编译类型 Cat,运行类型是 Cat
Cat cat = (Cat) animal;
cat.catchMouse();//猫抓老鼠
//(2)要求父类的引用必须指向的是当前目标类型的对象
Dog dog = (Dog) animal; //可以吗?不可以,因为animal当前指向的是cat
System.out.println("ok~~");
}
}
java的动态绑定机制是什么
- 当调用方法时,该方法会和对象的内存地址/运行类型绑定
- 当调用属性时,没有动态绑定机制,哪里声明,哪里使用
- 方法重写/覆盖:子类中有一个方法和父类的方法名称、返回类型、参数一样;需要满足:子类方法的形参列表和方法名要和父类的形参列表和方法名完全一样;子类方法的返回值要和父类方法的返回值一样,或者是父类方法返回值的子类;子类方法不能缩小父类方法的访问权限 public > protected > 默认 > private