static
1.修饰属性
静态属性作为全局共享
调用格式:类名.静态属性
静态变量和非静态变量的区别:
静态变量当且仅当在类初次加载时会被初始化;非静态变量在创建对象的时候被初始化。
static的使用:
定义常量,避免魔鬼数字的产生。
魔鬼数字主要影响了代码可读性,读者看到的数字无法理解其含义,从而难以理解程序的意图。当程序中出现的魔鬼数字过多时,代码的可维护性将会急剧下降,代码变得难以修改,
并容易引入错误。
//魔鬼数字的定义:在代码中没有具体含义的数字、字符串。 int status = 1;//状态为1 表示开启 status = 0; //状态为0 表示关闭 //正确做法 public static final int STATUS_START = 1; public static final int STATUS_CLOSE = 1;
java定义常量
public static final 数据类型 常量名 = 值;
public 修饰:全局
常量命名规范:常量名全部大写
多个单词之间用_分割
public static final double PI = 3.14;
2.修饰方法
调用格式:类名.静态方法名()
静态方法只能调用静态资源 非静态方法可以调用任意
对资源回收不及时,等到程序结束后才会被gc回收
使用场景:工具类
3.静态代码块
执行顺序:static代码块(只执行一次)—> 代码块 —> 构造方法
static块可以用来优化程序性能:因为它只会在类加载的时候执行一次
4.修饰内部类
静态内部类的创建是不需要依赖外围类的创建;它不能使用任何外围类的非 static 成员变量和方法。
super
super.方法:调用父类的方法
super([参数]) 调用父类的构造方法
注意:super() 只能写在子类构造方法
只能写在子类构造方法第一行
不能和this()同在
-
调用父类的set方法给继承父类的属性赋值
this.setName(name); this.setAge(age);
-
调用父类的有参构造
super(name,age);
final
(1)修饰属性/变量
如果引用为基本数据类型,则该引用为常量,该值无法修改;
如果引用为引用数据类型,比如对象、数组,则该对象、数组本身可以修改,但指向该对象或数组的地址的引用不能修改。
如果引用时类的成员变量,则必须当场赋值,否则编译会报错。
(2)修饰方法当使用final修饰方法时,这个方法将成为最终方法,无法被子类重写。但是,该方法仍然可以被继承。
(3)修饰类
该类成为最终类,无法被继承。
比如常用的String类就是最终类。String类不能被继承 因为String是使用final修饰
原文链接:https://blog.csdn.net/guorui_java/article/details/119299329
this
this 谁调用就指向当前对象。
this的三种用法
1.this.属性名
this.name = name; //属性名 = 变量;如果发生局部变量和成员变量命名冲突时,总是指向局部的变量(就近原则)。
可以通过this.成员变量名的方式区分成员变量和局部变量。
若不同名无冲突,则可以省略this。
public class TestThis { int a = 20; public void Num(){ int a = 30;//局部变量与成员变量同名,成员变量被隐藏 System.out.println(a); System.out.println(this.a);//通过this.成员变量名 访问被隐藏的成员变量 } }
2. this.方法名()
public class Dog { // 定义一个jump()方法 public void jump() { System.out.println("正在执行jump方法"); } // 定义一个run()方法,run()方法需要借助jump()方法 public void run() { this.jump(); System.out.println("正在执行 run 方法"); } }
调用本类的其他方法——直接调用 可以省略this
当 this 出现在某个方法体中时,它所代表的对象是不确定的,但它的类型是确定的,它所代表的只能是当前类的实例。
static 修饰的方法中不能使用 this
,静态成员不能直接访问非静态成员。
3.this(参数) 调用本类的构造方法
使用this 只调用方法,不创建新的对象。
- 调用本类中的其他构造方法,调用时要放在构造方法的首行。
- this( ) 不能在普通方法中使用,只能写在构造方法中。
idea自动生成构造方法
alt+insert
有参的构造方法:点击第一个属性+shift+点击最后一个属性
访问修饰符
修饰符 | 意思 | 访问范围 | 是否能被子类继承 | |
private | 私有的 | 当前类可用 | 否 | |
(default) | 默认的 | 当前包内可用 | 能被同包子类继承 | |
protected | 受保护的 | 当前包内可用+非同包的子类 | 是 | |
public | 公有的 | 任何地方 | 是 |
extends
子类继承父类的关键字
通过 extends 关键字可以申明一个类是从另外一个类继承而来的
class 父类 {
}
class 子类 extends 父类 {
}
java只有单继承,没有多继承!可以多重继承
继承的特征
- 子类拥有父类非 private 的属性、方法。
- 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
- 子类可以用自己的方式实现父类的方法。
implements
是实现接口的关键字
Implement可以实现多个接口,接口中的方法为空的,必须重写才能使用
implement的意思是指在铅笔、毛笔、圆珠笔要有”写“的这个功能,就需要实现接口”笔“的”写“功能。而这个关键字implement就是实现的意思。
interface
定义接口的关键字
1、一个类只能继承一个类,一个类可以实现多个无关紧要的接口。
2、面向接口隔离,降低耦合度
3、使用接口实现标准化
jdk中的jdbc部分,全部是接口,屏蔽数据库的差异化
接口:一个更抽象的抽象类,接口中只能包含常量,抽象方法
不包含属性,String name—报错;没有构造方法;没有非抽象方法
关键字:interface
public interface 接口名(){
//常量 可以省略 public static final
//抽象方法 可以省略 public abstract
}
接口不能实例化,等着其他类去实现
class A implements 接口a,接口b
//jdk1.8 提出了默认方法
default void fun1(){
}
定义一个没有任何抽象方法的接口,该接口作为一种标志。实现这个接口,表示拥有这个标志。
接口中没有构造方法
子类 extends 父类 implements 接口a,接口b
abstract
修饰属性/变量:给属性赋初值,这个值不能变
修饰方法:这个方法不能被重写
修饰类: 表示这个类不能被继承
String类不能被继承 因为String是使用final修饰
接口的作用:
- 提高程序的重用性
- 提高程序的可扩展性
- 降低程序的耦合度
- 实现了多继承
接口和抽象类有什么区别?
(1)接口
接口使用interface修饰;
接口不能实例化;
类可以实现多个接口;①java8之前,接口中的方法都是抽象方法,省略了public abstract。②java8之后;接口中可以定义静态方法,静态方法必须有方法体,普通方法没有方法体,需要被实现;
(2)抽象类
抽象类使用abstract修饰,类不能同时被 abstract 和 final 修饰。;
抽象类不能被实例化;
抽象类只能单继承;
抽象类中可以包含抽象方法和非抽象方法,非抽象方法需要有方法体;
如果一个类继承了抽象类,①如果实现了所有的抽象方法,子类可以不是抽象类;②如果没有实现所有的抽象方法,子类仍然是抽象类。
原文链接:https://blog.csdn.net/guorui_java/article/details/119299329
抽象类的实现方法:重写、接口、抽象类和抽象方法。
一个类只能继承一个抽象类,而一个类却可以实现多个接口。
instanceof
对象名 instanceof 类名
结果: booleantrue: 表示这个对象 是类的对象或者是类子对象
false: 表示这个对象不是类的对象
instanceof 应用:需要用到对象的强制类型转换时,需要使用instanceof进行判断,防止出现ClassCastException。
使用注意事项:
- 先有继承关系,再有instanceof的使用。
- 当该测试对象创建时必须得与类是继承树的同一分支或存在继承关系,否则编译器会报错。
System.out.println(pet1 instanceof Pet); //true
/* Dog dog = new Dog();
System.out.println(dog instanceof Cat);*/
//报错 Dog类和Cat类不是继承关系
向上转型
Pet p = new Dog(); //向上转型 自动转换 //展示类型pet 真实类型 dog
缺点:无法调用子类特有的属性和方法
优点:实现多态
向下转型
父类转换成子类:强制类型转换
子类类型 变量 = (子类)父类对象;
目的:调用子类特有的属性和方法
Dog dog = (Dog)pet;
缺点:ClassCastException //类型转换异常