1.关键字Static
static 有三个特点,这边先阐述一下,后面代码也会展示
- static 可以修饰方法(静态方法)、成员变量(静态变量),修饰不了类请注意!
- 随着类的加载而加载,优先于对象存在,说人话就是不new 对象也可以使用!
- 被所有这个类共享。直接看代码
public class study {
public static void main(String[] args) {
//tom 这个对象我将名字输入
Student Tom = new Student();
Tom.name = "汤姆";
Tom.callMe();
Student Lilei = new Student();
//Lilei 这个对象我将名字输入
Lilei.name = "李磊";
//调用tom 里的方法,你看变成了李磊,所以这个特性是取决于static能否使用的关键!
Tom.callMe();
}
}
//内部类
class Student {
public static String name;
public void callMe(){
System.out.println("我叫"+name);
}
}
这边需要说的是,静态变量在堆内存中自己开辟了一块内存进行存储,所有对象都是引用静态内存中的变量,这句话有点抽象,不理解也行!
静态方法的特点 :静态方法中只能访问静态成员,静态方法里面没有this关键字!至于为什么访问不到呢,总结来就是说我在的时候你没在,我怎么给你一巴掌。
(1.12~1.13)
2.继承相关特点
子类可以使用父类非私有的成员!总结就是能用父类让我用的方法。
当然子类只有一个生父!只能单继承,但是可以套娃。
这样做的好处呢,就是代码的复用性、以及可维护性。
但是有利有弊
继承的弊端是
- 1.继承是侵入性的,你不要也得要!
- 2.降低了代码的灵活性,就是多了一些父类带来的约束
- 3.增强了代码的耦合性,父类要是改错一个东西,那么所有子类都会报错!
2.1 子父类拥有相同属性时的特点
就近原则,直接贴代码,便于理解。
3.super和this的用法
这边有个注意的就是,如果this想要访问本类的对象没有的话,还是会访问父类的对象。
(2.01~2.06)
3.1 继承中构造方法的访问特点
子类的所有构造方法都会先访问父类的无参构造
为什么这么设计,就是子类初始化的时候可能要用到父类里面的成员变量,如果不初始化父类那么就用不了父类里面的东西。这么顺带要提一嘴就是所有对象都继承了Object这个对象。
//子类继承父类
class YaSuo extends Hero{
private String age;
public YaSuo() {
//这语句只能在构造方法的第一行
super();
System.out.println("我是子类的无参构造");
}
public YaSuo(String name, String age) {
super();
System.out.println("我是子类的带参构造");
this.age = age;
}
}
上面说了子类都会访问父类的无参构造,如果父类没有无参构造的话,那么子类就会报错,解决方式就是子类的构造方法第一行必须访问父类的有参构造。
第二种不太合规的解决方式,其实也是可以解决的
这种方式有个注意点需要强调一下,this(...)与super(...)是不能在一个构造方法里面同时出现,因为这个两个方法必须在构造方法的第一行。
4.重写与重载
重写 :在继承体系中,子类出现了与父类一模一样的方法声明(方法名、参数类型、返回值类型)
重载:在同一个类中 ,出现方法名相同、参数列表相同。(与返回值没有关系)
4.1 重写方法的注意事项
@Override 同学们发现这个注解加与不加,实际上对逻辑没有什么说法,这个注解实际上就起了一个校验的作用。
- 如果父类的方法不是静态方法,子类重写的时候也不能将该方法变成静态方法。
- 子类的访问权限必须大于父类,父类是public 子类是默认的修饰符肯定是不行的。
- 父类的静态方法不能被重写。(实际上可以通过不加注解的方式实现重写的效果,但实际上不是重写)这个最后会贴个图看下效果
5.权限修饰符
这个也是我们开发中比较容易忽略的知识点
private | 只能在本类里面访问,在其他类里面没有办法访问到,子类也访问不到 |
public | 随便在哪里都可以访问 |
默认修饰符 | 默认修饰只能在一个包里面访问 |
protected | 只能和子类能访问不管在不在一个包里面 |
6.抽象类
抽象类特点
- 抽象方法只能存在与抽象类中,抽象类里面不仅仅只有抽象方法。出了红色的限制,抽象类和普通的类没什么差别。
- 抽象类不能实例化,如果可以实例化那么就可以调用抽象方法了,没有意义,所以肯定是不能调用的。
- 可以有构造方法、成员变量,这个第三点也可以这么理解,抽象类与普通的类其实没什么两样,抽象类特殊点,或者说功能多了个抽象方法,除了不能实例化。
- 子类继承抽象类,必须实现抽象方法,如果不想实现,那么子类也可以搞成一个抽象方法(不推荐)