【零基础 快速学Java】韩顺平 零基础30天学会Java

跨类调用方法:先创建对象 再用对象去调用方法(跨类调用变量也一样)
引用类型作为参数调用会改变数据本身(因为引用类型数据传递时传递的是地址---引用传递 指针)
方法重载(方法名必须相同,参数列表必须不同 返回类型无要求)
可变参数:
同一类中的多个同名同功能但形参个数不同的方法封装成一个方法使用可变参数时可以当做数组来使用,形参视为数组,实参可以是0个或多个,可变参数可以和普通参数一起放在形参列表但是必须保证可变参数在最后,一个形参列表最多一个可变参数)
public int sum(int...nums){return nums.length}
构造器(构造方法):
完成对新对象的初始化,方法名和类名相同,没有返回值,创建对象时系统自动调用构造器完成对对象的初始化,构造器可以重载(多次定义)
Person p1 = new Person("king", 40);
public Person(String pName, int pAge){
name = pName;
age = pAge;
}
当你没定义构造器时系统会给你定义一个默认无参构造器,这也就是为什么我们定义对象时是这么定义的,Dog dog1 = new Dog();,而一旦自己定义了构造器就会覆盖默认的构造器,除非显示定义一下Dog(){}--重要
Dog(){
}
对象初始化:默认初始化->显式初始化->构造器初始化
this本质就是个指向该对象本身的指针,哪个对象调用,this就代表哪个对象,访问构造器语法---this(参数列表)只能在构造器中使用(即只能在构造器中访问另一个构造器,必须放在第一条语句),this不能在类定义外用,只能在类定义的方法中用
this(形参列表)<-这个就是个 构造器 会去调用相关的那个构造器
包 import
package的作用是声明当前类所在的包,需要放在类(或文件)的最上面,其实包就是那个包含java文件的文件夹
访问修饰符
本类 同包 子类 不同包
public 1 1 1 1
protected 1 1 1 0
默认(无修饰符) 1 1 0 0
private 1 0 0 0 (私有的属性要通过公共的方法在子类中访问;私有的方法只能在类定义中访问,子类中不可见)
(只有默认和public可以修饰类)
封装:
将属性私有化private->提供一个公共的(public)set方法,用于对属性判断并且赋值->提供一个公共的(public)get方法,用于获取属性的值 (这两个功能可以通过快捷键alt+insert来直接编写出来,构造器也可以通过alt+insert直接生成)
将setName方法写入构造器中则在使用构造器初始化时仍然可以通过set函数来进行判断和赋值,例如,this.setName();
继承---extends 实现代码复用
class 子类 extends 父类{ //它这个extends的使用顺序这样记,是继承吧,那就是子类继承(extends)了父类,子类 extends 父类
}
子类会拥有父类定义的属性和方法;父类又叫超类,基类;子类又叫派生类
子类必须调用父类的构造器完成对父类的初始化,如果没有写系统则默认使用了super()调用了父类的无参构造器
当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的每一个构造器中用super去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不通过
super在使用时必须放在构造器的第一行,super()和this()不能同时使用,因为都要放在构造器的第一行
Object是所用类的基类,所谓的继承就是通过地址查找,一层一层向上去查找,直到找到Object基类
super:可以访问父类的属性,方法,构造器;super这几个字母其实就相当于父类名那几个字母,this那几个字母其实就相当于本类名那几个字母,所以当子类中有和父类中的成员(属性和方法)重名时,为了访向父类的成员,必须通过 super。如果没有重名,使用 直接访向,super、this,是一样的效果
super其实不仅仅局限于父类(爷爷类也行)但当继承关系中存在多个同名属性或方法时,super遵循就近原则
this和super this super
访问属性 访问本类中的属性,如果本类没有此属性则从父类中继续查找 从父类开始查找属性
调用方法 访问本类中的方法,如果本类没有此方法则从父类继续查找 从父类开始查找方法
调用构造器 调用本类构造器,必须放在构造器的首行 调用父类构造器,必须放在子类构造器的首行
特殊性 表示当前对象 子类中访问父(爷)类对象
方法重写(方法覆盖):子类的方法的参数,方法名称要和父类方法的参数方法名称完全一样。子类方法的返回类型和父类方法返回类型一样,或者是父类返回类型的子类,比如父类返回类型是 Object,子类方法返回类型是 String,子类方法不能缩小父类方法的访问权限
发生范围 方法名 形参列表 返回类型无要求 修饰符
方法重载(overload) 本类中 必须相同 个数或顺序必须有不同 无要求 无要求
方法重写(override) 父类与子类 必须相同 必须相同 和父类相同或被其包含 子类方法不能缩小父类方法的访问范围
多态---提高代码复用性
方法多态---例如方法重写和重载
对象多态->(1)一个对象的编译类型和运行类型可以不一致(2)编译类型在定义对象时,就确定了,不能改(3)运行类型是可以变化的(4)编译类型看定义时 = 号的左边,运行类型看 = 号的右边,执行时是看你的运行类型而非编译类型
多态的前提:两个对象(类)存在继承关系
多态的向上转型->本质:父类的引用指向了子类的对象;->语法: 父类类型 引用名 = new 子类对象();->特点:编译类型(编译时)看左边,运行类型(运行时)看右边,(1)可以调用父类中的所有成员(需要遵守访问权限)(2)不能调用子类中的特有成员(即子类中有而父类中没有的),这是因为在编译阶段时,能调用哪些成员是由编译类型来决定的,而最终运行时看的是子类(运行类型)的具体实现,且调用方法时,按照从子类(运行类型)开始查找方法,然后调用
Animal animal = new Cat();
向下转型是为了解决向上转型后不能调用子类特有对象的问题即上上行的(2)
多态的向下转型->(1)语法:子类类型 引用名 = (子类类型)父类引用;(2)只能强转父类的引用,不能强转父类的对象;(3)要求父类的引用必须指向的是当前目标类型的对象;(4)当向下转型后,可以调用子类类型中所有的成员
Cat cat = (Cat)animal;此时cat的编译类型和运行类型都是Cat
属性没有重写,属性的值看编译类型
instanceof 比较操作符,用于判断对象的运行类型是否为xx类型或者xx类型的子类型