java学习日记2022.6.21

面向对象语言的三大特征

一、封装

1)概念:封装,简单来说就是将类的某些信息(属性、方法)隐藏在类内部,不允许外部程序直接访问,
而是通过该类提供的各种方法来实现对隐藏信息的操作和访问。

2)封装操作用访问权限修饰符来控制,如private。

public class Animal{
    private int a;
    public void getA(int a){
        this.a=a;
    }
    public void getA(){
        System.out.println(this.a);
    }
}

二、继承

一、继承的概念

继承是面向对象最显著的一个特性,继承就是从已有的类派生出新的类,子类继承父类的特征和行为,
并能扩展新的能力,特征和行为也就是已有类的成员变量和成员方法,子类继承父类可继承的属性和方法
子类就可以拥有和父类相同的行为,相同的属性。声明一个类继承另一个类的方法需要使用extends关键字。

二、继承的好处

比如我们有两个类 一个是家猪一个是野猪,这俩类不用想里面都是相同的属性,比如属性都有颜色,体重,方法也就是行为是都能吃,所以这两种类在编写的时候会出现代码重复的现象,比如猪的颜色属性都会有一个 String color;方法都有一个

public void eat{
System.out.println(color+“的猪正在吃“);
}

那从这俩代码看,两个类中出现了代码重复,导致的后果就是代码量大 维护性不高,维护性就是要修改的时候,需要修改大量代码,容易出错,最简单的例子就是 相当于c语言有个宏定义,如果常量不进行宏定义 那你改的时候就得一个一个改还容易漏,从根本上解决问题就是继承,所以可以设计一个Animal类,把两个类的相同部分提取出来组成一个父类,提高了代码复用性和开发效率。

三、继承的特性

1)单继承 多重继承 不同类继承一个类 但是没有多继承(就是一个子类继承多个父类);

2)继承之后子类可以调用父类的所有非私有属性和非私有方法;

3)在JAVA中使用extends关键字来表示继承关系;

四、继承的传递性

C类从B类继承,B类又从A类继承,C类就具有B类和A类的所有非私有的属性和方法,当一个类没有继承任何一个类时,jvm会默认让类继承Object类,Object是 java为所有类提供的基类,可以说java中的所有类都间接的继承了Object类。

五、继承中的构造方法

1)子类构造方法会先调用父类构造方法,因为继承后是要初始化父类里所有非私有的属性和方法;
2)使用super关键字调用父类任意一个构造方法时必须写在子类构造方法的第一行;
3)如果子类的构造方法中没有显式地调用基类构造方法,则系统默认调用基类无参数的构造方法;

六、super关键字

我们使用super关键字访问父类成员或方法
1)用super.成员变量名来引用父类成员变量;
2)用super.方法名(参数列表)访问父类的方法;
3)用super.构造方法(参数列表)访问父类构造方法;
切记: super不是父类对象.在创建子类对象时,不会创建父类对象. 只会将父类中的信息加载到子类对象中存储。

七、方法的重写

当父类的方法实现不能满足子类需求时,可以对方法进行重写,在子类中可以根据需要对从基类中继承来的方法进行重写。
方法重写规则:
1)方法名相同、参数列表相同;
2)返回值类型相同;
3)访问权限不能小于父类权限;
注意:构造方法,静态方法不能重写,成员变量不存在重写

三、抽象类和接口(继承相关知识)

一、抽象类

如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类
特点:

1)抽象类不能被实例化,但可以有构造方法,因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象;
2)抽象类只能用作基类,表示的是一种继承关系。继承抽象类的非抽象类必须实现其中的所有抽象方法,也就是重写,否则,该类也必须声明为抽象类;

3)抽象类不一定有抽象方法,但有抽象方法的类必须用abstract修饰为抽象类;

4)抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方
法和构造方法;

public abstract class Car{
    int name;
    public abstract void run();
    }
public class BenChi extends Car{
    //如果不重写run方法必须把BenChi类也声明为抽象类
    public void run(){
        
    }
}
二、接口

从本质上讲,接口是一种特殊的抽象类,这种抽象类中包含抽象方法。

接口的定义:使用 interface 关键字用来声明一个接口。

public interface MyInterface {
int num = 10;           //所有属性默认为: public static final
public void foo()//抽象方法是:public abstract
public static void test(){            //jdk8之后添加静态方法,接口可直接调用
}
public default void test1(){             //jdk8之后添加默认方法,通过子类调用
}
}

接口中有声明常量 抽象方法 静态方法 默认方法,但是没有成员变量。

接口可以继承多个接口:

[访问修饰符] interface 接口名称 [extends 其他的接口名1,….其他的接口名n]
{
// 声明常量 抽象方法 静态方法 默认方法
}

一个类可以实现多个接口:

[访问修饰符] class 类名 implements 接口名1,接口名2……{

}

结合继承:

[访问修饰符] class 类名 extends 父类名 implements 接口名1,接口名2……{

}

总结接口的特性:

1、 接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字
2、接口中方法可以是抽象的,静态的,默认的
3、接口中声明的属性默认为 public static final 的
4、 接口不是被类继承了,而是要被类实现
5、接口不能实例化对象
6、与继承关系类似,接口与实现类之间存在多态性
7、一个接口能继承其它多个接口
8、当类实现接口的时候,类要实现接口中所有的抽象方法。否则,类必须声明为抽象的类

四、多态

一、多态的概念

多态概念:同一种事物,在不同时刻表现不同的状态
多态存在的三个必要条件:
(1)要有继承(包括接口的实现)(前提条件)

​ (2)要有重写(前提条件)

​ (3)父类引用指向子类对象

当编译期类型是父类,运行期类型是子类时,被称为父类引用指向子类对象

class Car{
    ~
}
class BenChi extends Car{
    ~
}
class BaoMa  extends Car{ 
    ~
}
Car x = new BenChi() //Car类的引用指向BenChi类的对象
二、多态环境下对成员方法的调用
class Car{
public void run() {
System.out.println(“汽车跑");
}
}
class BenChi extends Car{
public void run() {
System.out.println(“奔驰车跑");
}
}
~~main(){                   
Car benchi = new BenChi();
benchi.run()//调用的是子类中的方法
}  

上述代码,如果父类中没有run方法,那么用benchi.run()是调用不到子类中的run方法的。编译时期他是父类的引用,所以只能调用父类已有的方法,但运行时因为指向的是子类对象所以调用的是子类的方法,如果子类没有重写,那么将调用父类的方法。

Car benchi = new BenChi(); 可以理解为编译看左边,运行看右边。

但是需要注意的是,父类静态方法和成员变量都是运行和编译都看左边,成员变量不存在覆盖这一说法。

三、方法参数具有多态性

方法参数多态性的好处:提高代码的扩展性

class Car{
public void run() {
System.out.println(“汽车跑");
}
}
class BenChi extends Car{
public void run() {
System.out.println(“奔驰车跑");
}
}
class BaoMa extends Car{
public void run() {
System.out.println(“宝马车跑");
}
}
//方法的形式参数类型是父类类型,而传递的实际参数可以是任意
子类的对象
method(Car car){
Car.run();
}
四、向上转型和向下转型

向上转型的作用是:提高程序的扩展性

向下转型的作用是:为了使用子类中的特有方法

五、final关键字

(1)final关键字用于声明属性,方法和类。
属性:定义就必须直接赋值或者在构造方法中进行赋值,并且后期都不能修改。
方法:子类里不可以重写。
类:不能被定义为抽象类或是接口,不可被继承

(2)final属性赋值
1)在声明时同时赋值,往往与static 一起使用;
2)声明时可以不赋值,但必须在构造方法中逐一赋值,否则会报错。
总的原则:保证创建每一个对象的时候,final属性的值是确定的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值