1.继承
格式:
public class 子类名 extends 父类名{
}
优点:
1.可以将子类中重复的内容提取出来放到父类中, 达到了简化代码目的---->代码复用性
2.可以提高代码维护性
弊端:
削弱子类的独立性
名词:
父类: 被继承的类, 超类, 基类
子类: 继承的类,派生类
特点: 子类可以使用父类中的"内容",但不含私有的东西,父类不可以子类的东西
2.变量的访问特点:(了解!!!因为开发过程成员变量都被私有化了!!!)
public class Fu{
public int age = 50;
}
public class Zi extends Fu{
public int age = 30;
}
Zi zi = new Zi();
sout(zi.age) //打印的是30
记住继承中访问的特点, 遵循"就近原则";如果说非要访问子类成员区域的东西, 请你加this,如果非要访问父类相关的东西,请你加super
this:访问本类的成员(成员变量,成员方法),构造函数
super:访问父类的成员(成员变量,成员方法),构造函数
this虽然是找本类的成员,但是如果本类没有依然可以找父类的东西
3.子父类中构造函数的特点:(重点!!!)
构造函数作用: 给成员变量和成员方法进行初始化的, 也就是没有走构造函数所有的普通的成员变量和成员方法是不可以使用的,因为没有初始化
子类的构造第一行如果没有调用任何构造, 系统非常爱我们, 默认帮我们调用父类的无参构造, 为什么??? 因为父类构造没有走的话, 父类相关的不能被使用!!!
如果父类没有无参, 子类必须手动去调用父类的有参构造!!!
4.成员方法的访问特点:
遵循"就近原则";
5.方法重写:
重写: 子父类出现"一样"的方法声明,这种现象叫做重写
重载: 在同一个类中出现方法名相同, 参数列表不同的现象
使用场景: 我对父类的方法不满意,子类可以重写父类方法!!!
Override :可以帮助我们检测是否正确重写, 如果没有加这个注解,但是保证和父类声明一样也是重写!!!
注意:(了解!!!)
1.父类中私有的方法不能被重写
2.但是其实访问权限可以不一样, 保证子类的访问权限大于父类的就行!!!
3.返回值类型子类要小于父类返回值类型!!!
6.继承的注意事项
1.java支持单继承不支持多继承
2.java支持多层继承
public class Ye{
public void method(){
sout("ye")
}
public void method1(){
sout("method1")
}
}
public class Fu extends Ye{
public void method(){
sout("fu")
}
}
//典型错误, 子类如果有两个父类, 万一父类出现相同的内容, jvm不知道该用哪个父类的东西!!!!!
/*public class Zi extends Fu,Ye{
}*/
public class Zi extends Fu{
}
Zi zi = new Zi();
zi.method();
zi.method1();
7.常用的关键字
extends : 可以用来描述继承关系
super: 可以访问父类的内容
package: 声明这个类在哪个包下
import: 可以将其他包中的内容引入到本类中
注意: 1.要使用的类和本类在同一个文件夹 2.java.lang包下的内容, 都可以不用导包, 其他都需要导包
8.权限修饰符:
本类 本包 不同包子类 不同包无关类
public Y Y Y Y
protected Y Y Y
什么都不写 Y Y
private Y
9.final
作用: 能够修改类, 方法, 变量
1.修饰类: ---->这个类时最终类, 不能有子类.
使用场景: 当你觉得你的写类所有东西的很完美, 不需要别人在修改了, 你就可以用final修改你写的类
2.修饰方法: —> 这个方法是最终方法, 不能被子类重写
使用场景: 当你某个方法写的已经很完美了,不希望别人修改你的这个方法, 就可以在这个方法上加上final
3.修饰变量: ----> 变成了常量, 自定义常量, 作用:经常让普通的常量更具备可读性!!!
修饰局部变量:
命名规则: 和普通变量没啥区别,符合小驼峰式
这个变量只能被赋值一次!!!
修饰成员变量:
命名规则: 建议每个单词都大写, 多个单词之间用"_"隔开
这个变量只能被赋值一次!!!!!!
初始化两种方式:
1.直接给赋值(推荐)
2.通过构造函数赋值(开发中不要使用!!!!!!!,因为太恶心,
因为必须保证每一个构造都要对final修改的成员变量就行赋值)
注意: 如果final修饰基本数据类型, 值不能被改变
如果final修饰引用数据类型, 地址值不能变,但是内容可以变量
final Student s = new Student();
s.age = 10; //这个正确
s = new Student();// 这个错误
- static
作用: 能够修饰成员(成员变量,成员方法), 修饰代码块, 可以修饰成员内部类
特点: 都是随着类的字节码的加载而加载,在字节码加载好的时候已经完成初始化, 只会被加载一次!!!可以直接通过类名来使用
记住: 静态的东西不属于对象, 属于整个类共享的东西
修饰成员变量:
1.不属于对象,而是属于整个类, 随之类的加载而加载, 只会加载一次
2.可以直接通过类名调用
修饰成员方法
1.不属于对象,而是属于整个类, 随之类的加载而加载, 只会加载一次
2.可以直接通过类名调用
注意事项:
静态只能访问静态.因为静态的先加载, 而且可以直接类名来调用, 不用走构造函数!!!
public class A{
public A(){}
private int age = 20;
private static int a = 10;
public void method(){
sout(age);
sout(a);
}
public static void method1(){
sout(age);//错误
sout(a);
}
}
/* a = new A();
a.method();//正确
a.method1();//不正确*/
//A a = new A();
A.method1();
Student s = new Student();
s.getName();
静态代码块!!!!!!
格式:
static{
写代码!!!!
}
位置: 定义在类中方法外
特点:
随之类的加载而加载,只会执行一次!!!!!!!!
作用:
后期经常用来加载一次性的配置文件和驱动等等!!!!
构造代码块:(了解!!!!!)
格式:
{
抽取多个构造函数中的共性内容!!!!!
}
位置: 定义在类中方法外
特点: 只要走了任何的构造函数,一定先走构造代码块
作用: 来抽取构造函数中的共性内容