数组length方法
在一维数组中,length方法返回数组的长度。比如a[] = {1,2,3,4,5} ,则a.length = 5
在二维数组中,b[] []中,b.length方法返回的是二维数组的行数
b[0].length 方法返回的是第0行的长度
静态方法和非静态方法的关系
静态方法:直接通过类名.方法名()调用
非静态方法:1.先实例化这个类 :对象类型 对象名 = 对象值 2.然后对象.方法名
Student student = new student;
student.say();
静态方法不能调用非静态方法,比如下面的例子b();会报错。因为static和类一起加载,没有static类会之后再加载,因此用a( )去调用b( )时,因为b( )还没有加载出来会报错。
public static void a(){
b();// 会报错
}
public void b(){
a();
}
值传递和引用传递
// 值传递
public class Demo02 {
public static void main(String[] args) {
int a = 1;
System.out.println(a);// 1
Demo02.change();
System.out.println(a);// 1
}
// 返回值为void 为空
public static void change(){
int a = 10;
}
}
//引用传递
public class Demo03 {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person.name);// null
Demo03.change(person);
System.out.println(person.name);// 名字
}
public static void change(Person person){
person.name = "名字";
}
}
class Person{
String name;
}
构造器
构造器有两个条件:构造器的名字必须和类名相同;也不能有返回值,void也不行
一个类什么都不写,也会存在一个方法:
使用new关键字本质实在调用构造器(无参构造器或者有参构造器):
要注意:有参构造器一旦定义,无参构造就必须显示定义。快捷键是alt + insert
this关键字
B站视频(明日科技讲的 this关键字):
)写代码的过程中,方法参数(局部变量)和对象属性名会同名,由于方法参数的优先级高于对象属性,会优先使用方法参数。如果要访问对象属性,就必须用“对象. ”的方法,此时需要用this。
并且要注意this只能在对象内部使用,也不能在静态方法中使用。
继承super
super访问父类的内容,调用父类的name:
调用父类的构造器super(),必须放在子类构造器的第一行
在执行方法时会先调用父类Person的方法,再调用子类Student。
this和super的区别:
this 本身调用对象,super代表父类的调用
this 没有继承也可以使用,super 只能在继承下使用
this( )是在本类的构造,super( )是父类的构造
封装(属性私有,get/set)
在设置属性时,有些属性是private私有属性,则需要用get / set方法:
private String name;//名字
private int id;//学号
private char sex;//性别
private int age;//年龄
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age > 120 || age < 0) {
this.age = 3;
} else {
this.age = age;
}
}
public static void main(String[] args) {
Student s1 = new Student();
s1.setName("sss");
s1.setAge(999);
System.out.println(s1.getName());
System.out.println(s1.getAge());
}
//输出结果:sss
// 3
方法重载(参数列表不同)
方法重写(只和非静态方法有关系)
重写:需要有继承关系,父类的功能子类不一定需要或者不满足,所以子类要重写父类的方法。
- 方法名必须相同
- 参数列表必须相同
- 修饰符范围可以扩大,从private -> protected -> default -> public
- 重写会抛出异常,范围可以缩小但不能扩大:Exception -> ClassNotFoundException
- 方法重写中,静态方法和非静态方法区别很大。
静态方法:不能重写,方法的调用只和左边定义的数据类型有关。
非静态方法:在A中,子类(A)重写了父类(B)的方法,因此
多态
同一个方法可以根据发送对象的不同而采用多种不同的行为方式。
条件:继承关系、方法重写、父类的引用指向子类
Father f1 = new son(); // 父类的引用指向子类
- s1属于子类Student,子类可以调用父类的方法,如果子类重写了父类的方法,则执行子类的方法。
- s2属于父类Person,只能调用父类的方法,无法直接调用子类独有的方法eat()
- s3属于Object类
instanceof关键字(判断是否有父子关系)
X instanceof Y,判断X是否是Y的子类,能否编译通过
抽象类abstract
- 抽象类的所有方法,继承了他的子类都必须要实现他的方法,除非子类本身也是抽象类
- 只要存在抽象方法,类必须是抽象的
- 不能去new抽象类,只能通过子类去实现它
- 继承了抽象类就必须重写他的方法:(Override)
接口
- 接口通过interface定义,抽象类通过abstract定义
- 子类要实现接口通过implements关键字,implements可以实现多个接口,侧面实现了多继承;extends只能单继承
- 实现接口的类,就需要重写(Override)接口的方法
内部类
- 成员内部类
2. 局部内部类
3. 匿名内部类:不用将实例保存到变量中,直接new 类名.方法名