day14
1.为什么使用static关键字修饰属性
/* 编写学生类,属性:名字,现住址(北京) */ class Student{ //构造方法 public Student(){ } public Student(String name){ this.name=name; } //属性 String name; String address="北京"; } //编写学生测试类 class StudentTest{ public static void main(String[] args){ //创建对象 Student s=new Student(); Student s2=new Student("张三"); System.out.println(Student.address);//北京 Student s=new Student(); System.out.println(s.name);//null System.out.println(s.address);//北京 s=null;//变为空值,对象变为垃圾 //System.out.println(s.name);//出现运行错误,不能访问对象中的实例变量 System.out.println(s.address); } }
//发现问题:
---多个对象中有相同值得属性,如:address="北京";
-----能否将相值得属性,在内存中只开辟一块空间,
并且所有对象都可以访问?---能
解决办法:
--将相同值得属性,存放在一个共享区(方法区)中,此时
多个对象都可以访问。
堆--栈---共享区---堆--栈
---好处:节省空间
---static String address="北京";///称为静态属性也叫做类的变量
---在方法区(共享区)中存储,并且所有对象都可以访问
---与类同生死,也就是说类在static修饰的属性就存在
---可以使用类名.属性名称;也可以使用引用名称.属性名称
---注意:当引用名称的值为null时,也可以访问静态属性,
不会出现空指针异常
---类优先于对象,也就是说类的生命周期比较长
2.static关键字修饰符方法
---称为静态方法也叫做类的方法
---与类同生死,也就是说类在static修饰的属性就存在
---可以使用类名。方法名称([参数列表]);
也可以使用引用名称.方法名称([参数列表]);
class Student{ //称为静态方法也叫做类的方法 public static void print(){ System.out.println("执行了println方法"); //System.out.println(name);//静态方法中只能访问静态属性,静态方法 } //称为非静态方法也叫做实例方法 public void show(){ System.out.println("执行了show方法"); } public Student(){ } public Student(String name){ this.name=name; } //属性 String name; String address="北京"; } //编写学生测试类 class StudentTest{ public static void main(String[] args){ Student.print(); Student s=new Student(); System.out.println(s.name);;//null s.show(); s.print(); } }
3.static修饰代码块
--- 主要完成对静态属性赋值
---静态代码块在类第一次被载入时则执行
class Student{ //静态属性代码块:完成对静态属性赋值 static{ address="北京市"; System.out.println("执行了静态代码块"); } }
4.为什么使用继承
/*
编写狗类:属性--名字、年龄、品种、颜色;方法:显示信息
编写猫类:属性--名字、颜色、性别、年龄;方法:显示信息
编写测试类:创建猫和狗的对象,并分别显示信息
分析得到:
如果多个类中有相同的属性和方法,能否单独编写一个类?----能
解决办法:
--将多个类中相同的属性和方法编写在单独一个类中,该类称为父类
--在子类继承父类,然后在子类中编写独有的属性和方法
动物类:
属性:名字、年龄、颜色
方法:显示信息
狗类 继承 动物类
独有属性:品种
猫类 继承 动物类
独有属性:性别
好处;减少代码的冗余性(重复性)
*/
5.编写继承代码步骤
---第一步:编写父类
[修饰符] class 类名{
//属性和方法
}
---第二步:编写子类
[修饰符] class 子类类名 extends 父类类名{
//编写独有属性和方法
}
---注意:当一个类没有指明继承具体哪个父类时,
则默认继承object类
object类是所有类的父类(超类)
6.继承中注意事项
--子类继承父类,但是不能继承父类的构造方法
--父类也叫做超类(基类),子类也叫做派生类
--继承具有两大特性:
**一个类只能继承一个直接的父类,也就是类的单根性
**类具有传递性
class Animal{ //属性 String name; int age; String color; //方法:显示信息 public void show(){ System.out.println("名字:"+name+" 年龄:"+age+" 颜色:"+color); } } //编写狗的子类继承动物父类 class Dog extends Animal{ //编写子类中独有属性和方法 String strain; } //等价于 /*class Dog extends object{ }*/ class Cat extends Animal{ //独有属性:性别 char sex; }