Java学习的第二天:
/包的创建/
我的理解是跟C++头文件的创建差不多,可以看这个视频https://www.bilibili.com/video/BV1h64y1i78N?p=81&share_source=copy_web
3.2.4 对象的封装:
类的封装是指,在定义一个类时将类中的属性进行私有化,即使用private关键字进行 修饰,私有化属性只能在当前所在类中被访问,如果外界想要访问私有属性,需要提供一些 public修饰的公共方法,其中包括用于获取属性值的 getter方法和设置属性值的setter 方法。
代码如下
package com.itheima.example02;
public class Car {
private String color; //将color属性私有化
private int num; //将num属性私有化
public String getColor(){
return color;
}
public void setColor(String color){
this.color=color; //this我这里理解是跟C++里的this指针差不多,后续会有讲解
}
public int getNum(){
return num;
}
public void setNum(int carNum){
if(carNum!=4)
{
System.out.println("输入轮胎数量不对");
} else {
num = carNum; //给属性赋值
}
}
public void run(){
System.out.println("该车的颜色是:"+color+",该车轮胎数量是:"+num);
}
}
/*******************************************************************************************/
package com.itheima.example02;
public class example02 {
public static void main(String[] args){
Car c=new Car();
c.setColor("red");
c.setNum(-1);
c.run();
}
}
运行结果:
3.3 构造方法
3.3.1 构造方法的定义
在实例化对象赋值时,不仅可以通过setter方法完成,还可以通过构造方法完成。所谓 的构造方法是类的一个特殊成员,它会在类实例化对象时被自动调用。在定义构造方法时, 必须同时满足以下三个条件。
(1)方法的名称和类名必须相同。
(2)在方法名称前没有返回值类型的声明。
(3)在方法体中不可以使用return语句返回一个值,但允许单独写return语句作为方法的结束。
无参构造:
package com.itheima.example03;
public class Car {
public Car() {
System.out.println("无参构造执行了。。。。");
}
}
/************************************************分割线******************************************************/
package com.itheima.example03;
public class example03 {
public static void main(String[] args){
Car c=new Car();
}
}
有参构造:
package com.itheima.example03;
public class Car {
String color;
public Car(String c) {
color=c;
}
public void run() {
System.out.println("该车的颜色是"+color);
}
}
/************************************************分割线******************************************************/
package com.itheima.example03;
public class example03 {
public static void main(String[] args){
Car c=new Car("red");
c.run();
}
}
3.3.2 构造方法的重载
构造方法与普通方法一样也可以实现重载,由于构造方法的方法名与类名相同,因此***只要每个构造方法的参数类型和参数个数不同即可实现构造方法的重载***。在创建实例对象 时,可以通过调用不同的构造方法为不同的属性进行赋值。
这里不做代码演示了(偷懒)
3.4 this关键字
在3.3.2节的案例中,成员变量使用的是num,构造方法使用的是c_num,这样类似的变量一旦增多,则可读性会变得很差,这时需要在一个类中使用统一的变量名称表示年龄。 为了解决这样的问题,Java中提供了一个this关键字表示当前对象,可以在方法中调用其 他的成员。
1.通过this关键字可以明确地访问一个类的成员变量,解决与局部变量名称相同的问题。
2.通过this关键字调用成员方法
此处的this关键字 可以省略不写,写成this.show()和show(),效果一样
3.可以在一个构造方法中使用“this([参数1,参数2…])”的形式调用其他构造方法。
需要注意的是,使用this关键字调用其他构造方法时只能出现在构造方法中, 并且只能位于构造方法的第一行且只能出现一次。另外,不能在两个构造方法中使用this 相互调用,否则会出现编译错误
3.5 static关键字
3.5.1 静态变量
通过前面的学习读者已经了解,如果使用一个类,则会在产生实例化对象时分别在堆内存中分配空间,在堆内存中要保存对象中的属性,每个对象都有自己的属性,如果有些属性希望被所有对象共享,就必须使用static关键字修饰成员变量,该变量被称为静态变量,可以直接使用“类名 变量名”的形式调用。
package com.itheima.example04;
public class Car {
static String CarName="大众";
}
/************************************************************************************************/
package com.itheima.example04;
public class example04 {
public static void main(String[] agrs){
Car car=new Car();
System.out.println("该辆车的厂商是:"+Car.CarName);
System.out.println("该辆车的厂商是:"+car.CarName);
}
}
static关键字只能用于修饰成员变量,不能用于修饰局部变量,否则编译会报错
3.5.2 静态方法
通过前面的讲解可知,要想调用某个方法,必须要创建一个对象,那么我们的头脑中一定会有这样一个疑问:有没有一种方法可以不创建对象就能直接调用呢? 实际上有一种方法可以这样操作,那就是静态方法,静态方法与普通方法的区别是在方法前面加一个static关键字,这种方法称为静态方法。
package com.itheima.example04;
public class Car {
public static void run(){
System.out.println("run()静态方法被执行了"); //静态方法
}
}
/*************************************************************************************************/
package com.itheima.example04;
public class example04 {
public static void main(String[] agrs){
Car.run(); //1.类名.方法 的方式调用静态方法
Car car=new Car();
car.run(); //2.实例化对象的方式调用静态方法
}
}
在一个静态方法中只能访问用static修饰的成员,原因在于没有被static修饰的成员需要先创建对象才能访问,而静态方法在被调用时不需要创建任何对象。
3.5.3 静态代码块
在Java类中,使用一对大括号包围起来的若干行代码被称为一个代码块,用static关键字修饰的代码块称为静态代码块。当类被加载时,静态代码块会被执行,由于类只加载一次,所以静态代码块只会执行一次。在程序中,通常会使用静态代码块对类的成员变量进行初始化。
3.6 类的继承
3.6.1 继承的概念
就是子类父类的关系, 懂吧?
在程序代码中,如果想定义一个类继承另一个类,需要使用extends关键字。如果一个 类没有使用extends关键字明确标识继承另一个类,那么这个类就是默认继承 Object类。 Object类是所有类的父类,该类中的方法适用于其所有子类,其类中常用的方法有toString() 和hashCode()方法等。
**注意:**在类的继承中,需要注意以下几个问题。
(1)在Java中**,类只支持单继承,不允许多重继承,也就是说一个类只能有一个直接父类**。例如 Cow 类继承 Animal类之后,就不允许继承其他类。
(2)多个类可以继承一个父类,例如 Cow 和Sheep类都可以继承Animal类。
(3)在Java中,多层继承是允许的,即一个类的父类可以再继承其他的父类,例 如 Zebra类继承自 Horse类,而 Horse类又可以继承 Animal类,即“子孙三代”。
3.6.2重写父类方法
注意,在子类中重写的方法必须与父类被重写的方法具有相同的方法名、参数列表以及返回值类型。
今天就先到这里吧。