一.static关键字
1.静态static关键字的特点:
(1)随着类的加载而加载
(2)优先于对象存在: 它不能this共存 (this:代表当期类对象的地址值引用)对象还没有new的时候,当前被static修饰的成员就已经内存了;
(3)被静态修饰的可以被多个对象共享:有共享共用的意思
举例:饮水机中的水(适合)
水杯共享(不适合)
(4)被静态修饰的变量,方法----->静态变量或者静态方法
我们所说的成员变量和成员方法:都指的是非静态
静态的成员的访问方式:类名.变量
类名.方法名()
2.关于static关键字的使用注意事项
(1)非静态的方法既可以访问静态变量,也可以访问非静态的变量,既可以调用静态方法,也可以调用
非静态方法.
(2)静态的方法:只能访问静态变量,只能调用静态方法.
3.例题:使用Person类来描述人的属性(暂时先不私有化) 姓名,年龄, 国籍;
提供一个show方法,显示,姓名,年龄,和国籍
问题描述:
每一个人都"中国",在创建对象的时候,每一次都需要给成员变量空间,浪费空间,如何优化呢?
Java提供关键字:static: 最基本概念:共享,共用 那么就国籍前面加上static修饰.
//定义一个Person类
class Person{
String name ;//姓名
int age ; //年龄
//String country ;//国籍
static String country ;//国籍 (类变量:这种变量随着类的加载而加载,优先于对象存在!)
//提供无参
public Person(){}
//提供有参
public Person(String name,int age,String country){
this.name = name ;
this.age = age ;
this.country = country ;
}
public Person(String name,int age){
this.name = name ;
this.age = age ;
}
//提供一个show方法显示人的信息
public void show(){
System.out.println("当前这个人的姓名是:"+name+",年龄是:"+age+",以及国籍是:"+country);
}
}
//测试类
public class PersonDemo {
public static void main(String[] args){
Person p1 = new Person("小明",22,"中国") ;
p1.show();
System.out.println("----------------------------");
Person p2 = new Person("小红",23);
p2.show();
System.out.println("-----------------------------");
Person p3 = new Person("小王",24) ;
p3.show();
System.out.println("-----------------------------");
Person p4 = new Person("小亮",20) ;
p4.show();
}
}
二.代码块
概念:在Java中,使用{}包裹棋起来的内容,成为代码块.
代码块的分类:
a.局部代码块:在方法中出现;限定变量生命周期,及早释放,提高内存利用率.
b.构造代码块:在类中方法外出现;多个构造方法方法中相同的代码存放到一起,
每次调用构造都执行,并且在构造方法前执行.
c.静态代码块: 在类中方法外出现,加了static修饰:在类中方法外出现,并加上static修饰;
用于给类进行初始化,在加载的时候就执行,并且值执行一次.
考点:优先级:静态代码块 > 构造代码块 > 局部代码块
静态代码块:先执行,而且就执行一次(因为类就加载一次)
class Student{
public Student(){
System.out.println("Student的无参构造方法");
}
{
System.out.println("Student的构造代码块");
}
public Student(String name){
System.out.println("Student的有参构造方法");
}
static{
System.out.println("Student的静态代码块");
}
}
public class Test {
static{
System.out.println("我厉害吧!!!!");
}
public static void main(String[] args) {
System.out.println("我是main方法");
Student s = new Student() ;
Student s2 = new Student("哆啦A梦") ;
}
}
三.继承 (extends)
1.概念:将多个类的共性内容抽取到一个独立的类中,然后这多个类和独立的这个
类产生一种关系: 继承关系,关键字: extends
2.好处:提高代码的维护性
提高代码的复用性
让类和类之间产生的关系,是"多态的前提条件"
3.特点:类与类之间的关系,继承关系,只支持单继承.
格式:class 子类名 extends 父类名{}
虽然不能支持多继承,但是可以支持多层继承
//使用继承的写法:
//将Student类和Worker类的共性内容抽取到:Person类 人类
class Person{
public void eat(){
System.out.println("饿了,就需要吃饭...");
}
public void sleep(){
System.out.println("困了,就需要休息...");
}
}
//将学生类和工人类:继承自Person
class Student extends Person{}
class Worker extends Person{}
//测试类
public class ExtendsDemo {
public static void main(String[] args) {
//测试
Student s = new Student() ;
s.eat() ;
s.sleep();
System.out.println("----------------------") ;
Worker worker = new Worker();
worker.eat();
worker.sleep();
System.out.println("----------------------");
//加入的继承
Student s2 = new Student() ;
s2.eat();
s2.sleep();
Worker w2 = new Worker() ;
w2.eat();
w2.sleep();
}
}
4.继承中使用的注意事项:
(1)子类继承父类:可以继承父类的非私有的成员,私有的成员外界不能访问的,只能在本类中访问,但是可以通过公共方法间接访问.
(2)构造方法是不能被继承的,但是子类可以间接通过 super关键字访问父类的构造方法.
5.一个类的组成:成员变量,构造方法,成员方法.
6.继承中,每一个成员变量的关系问题
成员变量:
(a)子类继承父类,如果子类中的成员变量名称和父类的成员变量名称不一致,分别访问即可;
(b)子类继承父类,如果子类的成员变量名称和父类的成员变量名称一致:如何访问呢? (重点)
(1)首先在子类的局部位置找,是否存在局部变量名称,如果有,就使用;
(2)如果没有,就在子类的成员位置找,是否存在这个变量,如果存在,就使用;
(3)如果在子类的成员位置中没有找到,直接在父类的成员位置中找,如果有,就是使用;
(4)如果父类的成员位置都没有,就没有这个变量,报错;
遵循一个原则:就近原则
7.继承中构造方法的访问:
(1)子类继承父类,子类的所有的构造方法都会默认的访问父类的无参方法
子类的所有构造方法的第一句话:默认隐藏了super() ;
因为子类中肯能会使用到父类的数据,所以在继承关系中得先让父类初始化---->构造方法 :
分层初始化;(先父类无参构造方法,在执行子类的构造方法)
super:代表的父类对象的空间表示(父类对象的地址值引用)
(2)如果父类中的无参构造方法没有,子类会怎么样?如何解决呢?
答:子类的所有的构造都会报错(因为子类所有构造方法默认父类的无参构造方法)
解决办法:(推荐)手动给出父类的无参构造方法
8.代码案例
定义一个动物类Animal,动物类中有name属性,age属性,color属性。按照标准类的书写该类,猫类和狗类都继承自动物类,自己分析猫和狗的特有功能并且提供AnimalTest测试类进行测试
//动物类
public class Animal {
private String name ;
private int age ;
private String color ;
public Animal() {
}
public Animal(String name, int age, String color) {
this.name = name;
this.age = age;
this.color = color;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public void eat(){
System.out.println("动物都需要吃饭...");
}
public void sleep(){
System.out.println("动物都需要睡觉...");
}
}
//cat类
public class Cat extends Animal {
public Cat() {
}
public Cat(String name, int age, String color) {
super(name, age, color);
}
public void playGame(){
System.out.println("猫爱玩毛线...");
}
}
//Dog类
public class Dog extends Animal {
public Dog() {
}
public Dog(String name, int age, String color) {
super(name, age, color);
}
public void lookDoor(){
System.out.println("狗看门..");
}
}
//测试类
public class ExtendsTest {
public static void main(String[] args) {
Dog d = new Dog() ;
d.setName("小白");
d.setAge(5);
d.setColor("白色");
System.out.println("狗的姓名是:"+d.getName()+",年龄为:"+d.getAge()+",颜色是:"+d.getColor());
d.eat();
d.sleep();
d.lookDoor();
System.out.println("-----------------------------------------");
Dog d2 = new Dog("小黑",3,"黑色") ;
System.out.println("狗的姓名是:"+d2.getName()+",年龄为:"+d2.getAge()+",颜色是:"+d2.getColor());
d2.eat();
d2.sleep();
d2.lookDoor() ;
}
}