目录
前言:
类和对象的组成成分大致如下:
一.static关键字
1.static修饰成员变量
static修饰的成员变量,称为静态成员变量,静态成员变量最大的特性:不属于某个具体的对象,是所有对象所共享的。也就是说所有对象都可以调用。我们知道对象存储在堆中,而对象变量并不存储在栈中,而在方法区中。
静态成员变量特性:
- 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
- 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
- 类变量存储在方法区当中
- 生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)
如果这个num变量被修饰为static之后,此时每个对象当中的成员就不包含这个属性了。
2..static修饰成员方法
Java中,被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的。静态成员一般是通过静态方法来访问的。例如:
class Student {
private String name;
private int age;
private static String classrooom = "Java101";
public static String getClassrooom(){
return classrooom;
}
}
public class TestStudent{
public static void main(String[] args) {
System.out.println(Student.getClassrooom());
}
}
输出结果:
静态方法特性:
- 不属于某个具体的对象,是类方法
- 可以通过对象调用,也可以通过类名.静态方法名(...)方式调用,更推荐使用后者
- 不能在静态方法中访问任何非静态成员变量
- 静态方法中不能调用任何非静态方法,因为非静态方法有this参数,在静态方法中调用时候无法传递this引用
3.静态代码块
使用static定义的代码块称为静态代码块。一般用于初始化静态成员变量 。一般是static开头,例如下图方框内:
静态成员变量一般不会放在构造方法中来初始化,构造方法中初始化的是与对象相关的实例属性。 静态成员变量的初始化分为两种:就地初始化 和 静态代码块初始化。 这就引出我们的代码块—>静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的。
注意事项:
- 静态代码块不管生成多少个对象,其只会执行一次
- 静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的
- 如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行
- 实例代码块只有在创建对象时才会执行
二.代码块
使用 {} 定义的一段代码称为代码块。
- 普通代码块
- 构造块
- 静态块
- 同步代码块(属于后面部分的,暂时不提及)
1. 普通代码块
如图中红圈所示:
这就是一个普通代码块。
2.静态代码块
构造块:定义在类中的代码块(不加修饰符)。也叫:实例代码块。构造代码块一般用于初始化实例成员变量。如下图红圈内所示
3.静态代码块
在上文中有提到,这里就不多说啦!
三.继承
1.什么是继承
继承(inheritance)机制:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加新功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构, 体现了 由简单到复杂的认知过程。继承主要解决的问题是:共性的抽取,实现代码复用。
2.为什么要继承
请看下面代码:
class Cat{
public String name;
public int age;
public void mao(){
System.out.println(name+"正在喵喵喵!");
}
}
class Dog{
public String name;
public int age;
public void bark(){
System.out.println(name+"正在汪汪汪! ");
}
}
Cat类和Dog类有很多相同的成员变量,假如有100种这样的动物的话,那么就需要写几百行的代码,那我们有没有一个方法可以让一个东西来管理这两个类呢?当然有的,这就是继承
3.继承的使用
我们一般将需要继承的类如Animal称为父类/超类/基类,而Dog称为子类/派生类。继承之后,子类可以复用父类中成员,子类在实现时只需关心自己新增加的成员即可。
继承格式:需要使用关键extends(注意不要漏掉s)
使用继承之后的代码:
public class Animal {
public String name;
public int age;
}
class Cat extends Animal{
public void mao(){
System.out.println(name+"正在喵喵喵!");
}
}
class Dog extends Animal{
public void bark(){
System.out.println(name+"正在汪汪汪! ");
}
}
小tips:子类继承父类之后,必须要新添加自己特有的成员,体现出与基类的不同,否则就没有必要继承
4.父类的访问(super关键字)
由于设计不好,或者因场景需要,子类和父类中可能会存在相同名称的成员,如果要在子类方法中访问父类同名成员时,该如何操作?直接访问是无法做到的,Java提供了super关键字,该关键字主要作用:在子类方法中访问父类的成员。
请看如下代码:
class Animal {
public String name;
public String color;
public int age;
public int a = 222;
public int b = 333;
}
class Cat extends Animal {
public int a = 111;
public String var;
public void test(){
System.out.println("1:"+a);
System.out.println("2:"+this.a);
System.out.println("3:"+super.a);
System.out.println("4:"+this.b);
System.out.println("5:"+super.b);
}
}
public class Main{
public static void main(String[] args) {
Cat cat = new Cat();
cat.test();
}
}
运行结果:
一些小细节分享:
- 当父类不存在与子类同名的成员时,子类直接访问父类成员。
- 如果父类与子类成员同名时,优先访问子类自己的。
- 朋友们此时如果使用this,会发现也是访问当前对象也就是子类成员。
- 而使用super关键字,就可以访问父类成员,成员方法也是如此。
5. 子类构造方法
子类也会默认初始化无参构造方法,但当我们在构造子类构造器时会报错,这就是传说中的"救急不救穷",系统不会再初始化无参构造器,所以我们要为父类添加构造器。可以记为:没有父哪有子?
- 在子类构造方法第一行默认有隐含的super()调用,即调用父类构造方法。
- 在子类构造方法中,super(...)调用父类构造时,必须是子类构造函数中第一条语句。 super(...)只能在子类构造方法中出现一次,并且不能和this同时出现。
6.代码执行顺序
静态代码块----->实例代码块----->构造方法
请看下面代码,看看输出顺序是什么
class Animal {
public String name;
public int age;
static {
System.out.println("Animal::static {} 4");//4
}
{
System.out.println("Animal::{} 5");//5
}
public Animal(String name,int age) {
this.name=name;
this.age=age;
System.out.println("Animal带2个参数的构造方法 6");//6
}
}
class Cat extends Animal {
static {
System.out.println("Cat::static {} 1");//1
}
{
System.out.println("Cat::{} 2");//2
}
public Cat(String name,int age) {
super(name,age);
System.out.println("Cat带2个参数的构造 3");//3
}
}
public class Main{
public static void main(String[] args) {
Cat cat = new Cat("小花",4);
}
}
运行结果: 415623 希望你能够理解
7.组合
和继承类似, 组合也是一种表达类之间关系的方式, 也是能够达到代码重用的效果。组合并没有涉及到特殊的语法 (诸如 extends 这样的关键字), 仅仅是将一个类的实例作为另外一个类的字段。
例如:
//汽车
class Car {
private Tire t;
private Engine e;
}
//轮胎
class Engine {
public int a;
public int b;
public int c;
public int d;
}
//发动机
public class Tire {
public int a;
public int b;
public int c;
public int d;
}
但是组合时,整体类不能自动获得局部类同样的接口,需要再创建类对象,不像继承无需再创建。
四.小结
本次分享到此结束,感谢您的阅读,如果您觉得我写的还不错或者对您有帮助,请留下您宝贵的点赞,如果您发现我写的有什么错误,欢迎评论区留言!!!!
标签:Java,成员,对象,子类,代码,int,详解,static,public From: https://blog.csdn.net/2402_83799883/article/details/143212611