目录
-
static关键字
-
静态变量在类加载的时候初始化,不创建对象,内存就开辟了;存储在方法区内存当中;
-
什么时候成员变量为实例变量?什么时候声明为静态变量?
——所有对象都有这个属性,但这个属性的值会随着对象的变化而变化【不同对象的这个属性具体的值不同】。——所有对象都有这个属性,并且所有对象的这个属性的值是一样的,定义为静态变量以节省内存的开销。
-
-
静态代码块:
-
语法格式:static{ java语句; }
-
静态代码块在类加载时执行,并且只执行一次
-
静态代码块在一个类中可以缩写多个,并且遵循自上而下的顺序依次执行
-
静态代码块的作用?怎么用?用哪?什么时候用?
——这当然和具体的需求有关,例如项目要求类加载的时刻/时机执行代码完成日志的记录,那么这段记录日志的代码就可以写在静态代码块中,完成日志
public class StaticTest { static { System.out.println("类加载1"); } static { System.out.println("类加载2"); } static { System.out.println("类加载3"); } public static void main(String[] args) { System.out.println("main begin"); } }
-
-
实例代码块(了解)
-
实例代码块可以缩写多个,也是自上而下依次执行
-
实例代码块在构造方法执行之前执行,构造方法依次执行,实例代码块对应执行一次
-
实例代码块也是java语音为程序员准备一个特殊的时机,这个特殊时机被称为:对象初始化时机
public class StaticTest { public StaticTest() { System.out.println("StaticTest类的缺省构造器执行"); } { System.out.println(1); } { System.out.println(2); } { System.out.println(3); } public static void main(String[] args) { System.out.println("main begin"); new StaticTest(); new StaticTest(); } }
如图:
-
-
继承:
-
继承的“基本”作用是:代码复用。但继承“最重要”的作用是:有了继承才有了以后”方法覆盖“和”多态机制“
-
语法格式:
[修饰符列表] class 类名 extends 父类名{ 类名=属性+方法 }
-
java语言当中的继承只支持单继承,一个类不能同时继承很多类,只能继承一个类,在c++中支持多个继承
-
术语:B类继承A类,其中,A类称为:父类、基类、超类、superclass。B类称为:子类、派生类、subclass
-
在java语音当中子类是继承父类都继承哪些呢?
——私有的不支持继承、构造方法不支持、其他数据可以继承
-
一个类可以间接继承其他类,如:C直接继承B类,但C类间接继承T、A类
C extends B { } B extends A { } A extends T { }
-
java语音中假设没有一个类显示的继承任何类,该类默认继承JavaSE库当中提供的java.lang.Object类
public class ExtendsTest { public static void main(String[] args) { ExtendsTest et = new ExtendsTest(); String s = et.toString(); //编译通过,这说明可以调用toString方法,ExtendsTest类中有toString方法,从Object类中继承过来的 System.out.println(s);//结果:ExtendsTest@1db9742 } }
-
-
方法重写(方法覆盖)
-
当父类中的方法已经无法满足当前子类的业务需求,子类有必要将父类中继承过来的方法进行重写,这个重新编写的过程称为方法重写/覆盖
-
需要满足的条件:方法重写发生在具有继承关系的父子类之间。返回值类型相同,方法名相同、形参列表相同。子类的访问权限不能更低,只能更高。【如果Animal中的move()的修饰符是public,那么子类的move()的修饰符不能为private、protected,如果Animal中的move()的修饰符是protected,那么子类的move()的修饰符可以为public】
-
抛出异常不能更多,可以更少。建议方法重写时尽量复制粘贴,不要编写,容易出错,防止没有产生覆盖
-
私有方法不能继承,so不能覆盖;构造方法不能继承,so不能覆盖;静态方法不存在覆盖;覆盖只针对方法,不谈属性
//有问题,十万个为什么。。 /* import hh.*; OverrideTest.java:4: 错误: 无法访问Animal Animal a = new Animal(); ^ 错误的源文件: .\Animal.java 文件不包含类Animal 请删除该文件或确保该文件位于正确的源路径子目录中。 */ import hh.Animal; import hh.Bird; import hh.Cat; public class OverrideTest { public static void main(String[] args) { Animal a = new Animal();//动物类 a.move(); Cat c = new Cat();//猫类 c.move(); Bird b = new Bird();//鸟类 b.move(); } } //方法覆盖就是子类可以修改父类的方法的内容吧 package hh; public class Animal { public void move() { System.out.println("动物在移动"); } } package hh; /*public class Cat extends Animal { }*/ public class Cat extends Animal { public void move() { System.out.println("猫在走猫步"); } } package hh; /*public class Bird extends Animal { }*/ public class Bird extends Animal { public void move() { //super.move();此结果为“动物在移动” //super();报错:对super的调用必须是构造器中的第一个语句 System.out.println("鸟在飞"); } } //结果: /*未进行方法覆盖 动物在移动 动物在移动 动物在移动 */ /*进行了方法覆盖 动物在移动 猫在走猫步 鸟在飞 */
-
-
final关键字
-
final修饰的类无法被继承,修饰的方法无法被覆盖,修饰的变量一旦被赋值后就不可重新赋值
public class FinalTest { public static void main(String[] args) { } } class MyString extends String { } //结果报错:无法从最终String进行继承,String是被final修饰的类
-