static
可以修饰成员变量与成员方法
随着类的加载而加载,优先于对象加载
只加载一次,就会一直存在,不再开辟新空间, 直到类消失才一起消失
静态资源也叫做类资源,全局唯一,被全局所有对象共享
可以直接被类名调用
静态只能调用静态,非静态可以随意调用
static不能和this或者super共用,因为有static时可能还没有对象
静态区域内不允许使用this和super。
/**
* 本类用于测试静态的调用关系
* 总结:1.普通资源既可以调用普通资源,也可以调用静态资源
* 2.静态资源只能调用静态资源
*
*/
public class TestStatic2 {
public static void main(String[] args) {
}
}
class Teather{
String name;//名字
public void teach(){
/* 普通资源可以调用静态方法 */
ready();
System.out.println("授课ing...");
}
static int id; //工号
public static void ready(){
//静态资源能都否调用普通资源?不能
System.out.println("备课ing...");
}
public static void eat(){
/**
* 静态资源能否调用静态资源?可以
*/
System.out.println(id); //静态方法调用静态属性
ready(); //静态方法调用静态方法
}
}
重写:
重写的原则:两同,两小,一大
*两同:子类方法的方法名 与参数列表 和父类方法相同
* 一大:子类方法的 方法修饰权限>=父类方法的
* 量小:子类方法的返回值类型<=父类方法的返回值类型
* 注意:这里所说的<=是指子类方法返回值是父类返回值类型的子类
* 或者与父类的返回值保持一致,如果父类方法的返回值类型是void,子类保持一致即可
/**
* 本类用与测试继承中方法的使用
* 重写
*/
public class ExtendsDemo {
public static void main(String[] args) {
Father f=new Father();
Son s=new Son();
f.eat();
s.eat();
f.play();
s.eat();
}
}
class Father{
public void eat(){
System.out.println("爸爸爱吃肉~");
}
public void play(){
System.out.println("爸爸爱放风筝~");
}
}
class Son extends Father {
/**
* 重写的原则:两同,两小,一大
*两同:子类方法的方法名 与参数列表 和父类方法相同
* 一大:子类方法的 方法修饰权限>=父类方法的
* 量小:子类方法的返回值类型<=父类方法的返回值类型
* 注意:这里所说的<=是指子类方法返回值是父类返回值类型的子类
* 或者与父类的返回值保持一致,如果父类方法的返回值类型是void,子类保持一致即可
*/
@Override //注解,用来加在方法上,表示这是一个重写的方法
public void eat(){
System.out.println("儿子爱吃蔬菜~");
}
@Override
public void play(){
System.out.println("儿子爱玩游戏~");
}
}
爸爸爱吃肉~
儿子爱吃蔬菜~
爸爸爱放风筝~
儿子爱吃蔬菜~
静态代码块:
格式:
static{}
位置:类里方法外
执行时机:静态代码块也属于静态资源,随着类的加载而加载,优先于对象加载,并且静态资源只会加载一次。
作用:用于加载那些需要第一时间就加载,并且只加载一次的资源,常用来初始化
执行顺序:静态代码块,构造代码块,构造方法,普通方法 局部代码块
/**
* 本类用于测试代码块
* 静态代码块,构造代码块,构造方法,普通方法 局部代码块
*/
public class TestBlock {
public static void main(String[] args) {
new Apple();
new Apple();
}
}
class Apple{
/**
* 位置:类里方法外
* 执行时机:静态代码块也属于静态资源,随着类的加载而加载,优先于对象加载,并且静态资源只会加载一次。
* 作用:用于加载那些需要第一时间就加载,并且只加载一次的资源,常用来初始化
*/
static{
System.out.println("我是一个静态代码块");
}
{
/**
* 类里方法外
* 创建对象时,并且优于构造方法执行
* 用于提取所有构造的共性功能
*/
System.out.println("我是代码块");
}
public Apple(){
System.out.println("我是一个无参构造");
}
public void clean(){
System.out.println("我是一个普通方法");
/**
* 方法里
* 每次调用局部代码块所处的方法时,才会执行
* 用于控制变量的作用范围
*/
}
}
我是一个静态代码块
我是代码块
我是一个无参构造
我是代码块
我是一个无参构造
final:
1.final可以用来修饰类,被fianl修饰的类是最终类,不可以被继承
2.可以把被final修饰的类看成树结构中的叶子节点
3.final可以用来修饰方法,被final修饰的方法是这个方法的最终实现,不可以被重写
4.被final修饰的是常量,常量的值不可以被修改
注意:不管是成员位置还是局部位置,常量定义的时候必须赋值
注意:常量的名称必须是全大写,单词与单词之间使用—分割
总结:
1.修饰类:
2.修饰方法:这个方法的最终实现,不可以被重写
3.修饰常量:值不可以被更改,并且常量定义时必须赋值
/**
* 本类用于测试final关键字
*/
public class TestFinal {
public static void main(String[] args) {
new Son2().work();
}
}
class Father2{
public void work(){
System.out.println("在工厂上班~");
}
}
class Son2 extends Father2{
/**
* 被final修饰的是常量,常量的值不可以被修改
* 注意:不管是成员位置还是局部位置,常量定义的时候必须赋值
* 注意:常量的名称必须是全大写,单词与单词之间使用—分割
*/
final int A=100;
public void work(){
int a=10;
a=100;
final int B=100;
// B=200; 报错:常量不可以被修改
System.out.println("在互联网大厂上班~");
}
}
在互联网大厂上班~
多态:
特点:
- 多态的前提1:是继承
- 多态的前提2:要有方法的重写
- 父类引用指向子类对象,如:Animal a = new Cat();
- 多态中,编译看左边,运行看右边
- 解释:必须要在父类定义这个方法,才能通过编译,编译时,把多态对象看做是父类类型,必须要在子类重写这个方法,才能满足多态,实际是子类。
- 多态的前提:继承+重写
- 口诀:父类引用指向子类对象
- 编译看左边,运行看右边
-
public class TestDemo { public static void main(String[] args) { Animal animal=new Animal(); Cat cat=new Cat(); Dog dog=new Dog(); animal.eat(); //调用的是父类自己的功能 cat.eat(); //调用的是自己重写的功能 dog.eat(); //调用的是自己重写的功能 // animal.jump(); 父类对象不可以使用子类特有的功能 cat.jump(); dog.run(); /** * 创建多态对象 * 父类引用指向子类对象 * 解释:创建出来的子类对象的地址值,交给父类类型的引用类型变量来保存 */ Animal a2=new Cat(); //子类对象地址交给父类类型变量来保存 Animal a3=new Dog(); /** * 编译看左边,运行看右边 */ a3.eat(); } } class Animal{ public void eat(){ System.out.println("小动物Animal吃啥都行~"); } } class Cat extends Animal{ @Override public void eat(){ System.out.println("小猫爱吃小鱼干~"); } public void jump(){ System.out.println("小猫cat跳的老高了~"); } } class Dog extends Animal{ @Override public void eat(){ System.out.println("小狗爱吃肉骨头~"); } public void run(){ System.out.println("小狗dog跑的老快了~"); } } 小动物Animal吃啥都行~ 小猫爱吃小鱼干~ 小狗爱吃肉骨头~ 小猫cat跳的老高了~ 小狗dog跑的老快了~ 小狗爱吃肉骨头~
注意:多态中使用的成员变量是父类的。
-
package oop; /** * 本类用于测试多态成员的使用情况 */ public class TestDemo2 { public static void main(String[] args) { Dog2 dog2=new Dog2(); System.out.println(dog2.sum); //20 dog2.eat(); //小狗爱吃肉包子 /** *口诀1:父类引用指向子类对象 * 口诀2:编译看左边,运行看右边 */ Animal2 a=new Dog2(); /** * 多态中使用的成员变量是父类的。 */ System.out.println(a.sum); //父类的成员变量 a.eat(); //小狗爱吃肉包子 /** * 多态中调用的静态方法是父类的,因为多态对象把自己看作是父亲类型,直接使用父类中的静态资源 */ a.play(); //没有提示,玩啥都行 Animal2.play(); } } class Animal2{ int sum=10; public void eat(){ System.out.println("吃啥都行~"); } /** * 定义父类的静态方法 */ public static void play(){ System.out.println("玩啥都行~"); } } class Dog2 extends Animal2{ int sum=20; public void eat(){ System.out.println("小狗爱吃肉包子~"); } /** * 静态方法不存在重写的功能 // */ // @Override 这不是重写的方法,只是恰巧在两个类中出现了一模一样的两个静态方法, // 在哪个类里定义,就在哪个类的资源使用。 public static void play(){ System.out.println("小狗喜欢玩皮球"); } } 20 小狗爱吃肉包子~ 10 小狗爱吃肉包子~ 玩啥都行~ 玩啥都行~
多态综合案例:
package oop; public class DesignCar { public static void main(String[] args) { Car c=new Car(); System.out.println(c.getColor()); c.start(); c.stop(); // c.swim(); 父类对象不可以调用子类的特有功能 BMW bmw=new BMW(); System.out.println(bmw.color); System.out.println(bmw.getColor()); bmw.start(); bmw.stop(); Car c2=new TSL(); System.out.println(c2.getColor()); c2.stop(); c2.start(); } } class Car{ private String brand; private String color; private int id; private double price; public void start(){ System.out.println("我的小车车启动了~"); } public void stop(){ System.out.println("哎呀妈呀熄火了~"); } public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public int getId() { return id; } public void setId(int id) { this.id = id; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } } class BMW extends Car{ String color="五彩斑斓的黑"; @Override public void start(){ System.out.println("都让开,我的车要起飞了~"); } } class TSL extends Car{ public void stop(){ System.out.println("哎呀妈,怎么停不下来呢~"); } public void swim(){ System.out.println("没想到吧,我还是个潜水艇~"); } } null 我的小车车启动了~ 哎呀妈呀熄火了~ 五彩斑斓的黑 null 都让开,我的车要起飞了~ 哎呀妈呀熄火了~ null 哎呀妈,怎么停不下来呢~ 我的小车车启动了~