黑马程序员-关于类的继承问题与final关键字的一些感悟

------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------

在面向对象的语言中,类的继承无疑给编程带来更高的效率,所谓继承就是在定义新的类时,在已有类的基础上再定义些新的成员变量,只需通过extends继承原有类的方法和变量,原有的类我们就叫父类,新的类叫做子类。在java,关于类的继承有它自己特有的规则,本人在此做个小小的总结吧。

 1,java不支持多重继承,也就是说子类至多只能有一个父类,简单地讲打个比方,a是子类它的父类如果是b,则不会再有其它的父类。就像一个儿子只能有一个生你的爸爸一样。

2,可以多层继承,形象点讲就是A继承了B,B继承了C,那么A间接就继承了C。

3,子类中继承父类中非私有的成员变量和成员方法,但不继承构造方法,如果子类想继承父类的构造方法可以用super()来调用。

4,子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承。

5,子类中定义的成员方法,并且这个成员方法的名字,返回类型,及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。其实这个时候这个父类的方法被覆盖了。这个时候若想再调用父类中那个被覆盖的方法可以用super关键字。这里多说一句,覆盖父类中方法时,子类中的方法的访问权限不能比父类更严格。

现在来讲一下final关键字。

首先要说明的是在java中对类,方法,变量的声明都可以用final来修饰的。

1,类中的应用。

final修饰的类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的。我们在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会被扩展,那么我们就可以加final关键字来修饰。

2,变量的应用

 用final修饰的成员变量表示常量,而且只能赋值一次!final修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量。一旦给final变量赋初值后,值就不能再改变了。另外,final变量定义的时候,可以先声明,而不给初值,这种变量也称为空白final,无论什么情况,编译器都确保空白final在使用之前必须被初始化。但是,空白final在final关键字final的使用上提供了更大的灵活性,为此,一个类中的final数据成员就可以实现依对象而有所不同, 却有保持其恒定不变的特征。

3,方法中的应用

如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。也就是说,final修饰的方法不能被子类重写。方法中定义的内置类只能访问该方法内的final类型的局部变量。

使用final方法的原因有二:

第一、把方法锁定,防止任何继承类修改它的意义和实现。

第二、高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。

例如:

public class  Test1 {

public static  void main(String[] args) {

}

public void  f1() {

System.out.println("f1 ");

}

}

//无法被子类覆盖的方法

public final void f2() {

System.out.println("f2");

}

public void f3() {

System.out.println("f3"); }

private void  f4() {

System.out.println("f4 ");

}

}

public class Test2 extends  Test1 {

public void f1(){

System.out.println(" Test1父类方法f1被覆盖!" );

}

public static void main(String[] args) {

Test2 t = newTest2();

t.f1();

t.f2();

//调用从父类继承过来的final方法

t.f3();

//调用从父类继承过来的方法

//t.f4();

//调用失败,无法从父类继承获得

}

4,在参数中的应用

我们可以将形参用final来修饰,但这样我们就无法在方法中修改它了。例如:

public class  Test2{

public static void  main(String[] args) {

newTest1().f1(1);

}

public void f1( final int i)

{

//i++;    i是final类型的,值不允许改变的.

System.out.print(i);

    }

以上算是对final关键字和类的继承一些简单的感悟吧。

------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------





深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值