继承
java的继承与C++的继承的区分
java中的继承是单项继承,区分与C++的多项继承,这种继承避免了C++继承中可能出现的冲突的问题,单项继承父类所有的属性,子类对于好的属性可以进行使用,对于无用或者有危害的属性可以进行屏蔽隐藏,对于子类,可以产生自己的属性
class 子类名 extends 父类名
{
........
}
理论上 所有的类都隐含着继承关系,继承来自object,隐含的构造方法调用object(老祖宗)
parent class 父类
super 超类
base 基类(包含父类 父类的父类 父类的父类的父类的.......等等)
子类自动拥有父类声明为public和protected的成员,但是private不能继承,即私有的成员变量不能继承
类前加 final 或者 private 可以防范被继承,是一种安全手段
总结一
public class ParentChildTest {
public static void main(String[] args) {
Parent parent=new Parent();
parent.printValue();
Child child=new Child();
child.printValue();
parent=child;
parent.printValue();
parent.myValue++;
parent.printValue();
((Child)parent).myValue++;
parent.printValue();
}
}
class Parent{
public int myValue=100;
public void printValue() {
System.out.println("Parent.printValue(),myValue="+myValue);
}
}
class Child extends Parent{
public int myValue=200;
public void printValue() {
System.out.println("Child.printValue(),myValue="+myValue);
}
}
在这串代码中 如果孩子类调用父母和爷爷类的构造方法,顺序如何?
如果父类中存在变量,子类调用父类的构造方法对继承来自父类的变量进行初始化,那父类的构造方法要写在子类构造语句的第一句
public children()
{
Parent();
System.out.print("A");
}
原因是 初始化的时候类就出现了,父类与子类有继承关系
或者 也可以把 Parent();写为 Super();
不可变类的作用
可以方便和安全的运用于多线程环境中
访问他们可以不用加锁,因而能提供更高的性能
实例如下
public final class Address
{
private final String detail;
private final String postCode;
//在构造方法里初始化两个实例属性
public Address()
{
this.detail = "";
this.postCode = "";
}
public Address(String detail , String postCode)
{
this.detail = detail;
this.postCode = postCode;
}
//仅为两个实例属性提供getter方法
public String getDetail()
{
return this.detail;
}
public String getPostCode()
{
return this.postCode;
}
//重写equals方法,判断两个对象是否相等。
public boolean equals(Object obj)
{
if (obj instanceof Address)
{
Address ad = (Address)obj;
if (this.getDetail().equals(ad.getDetail()) && this.getPostCode().equals(ad.getPostCode()))
{
return true;
}
}
return false;
}
public int hashCode()
{
return detail.hashCode() + postCode.hashCode();
}
}
父类与子类的关联关系
扩充 子类定义的方法与父类没有同名
单向继承 父类不能调用子类特有的方法
避免循环调用
覆盖/重写 子类父类定义了完全一样的方法
覆盖方法的访问范围不能小于原来的方法
覆盖方法抛出的异常不能比原方法多
声明为final的方法不允许覆盖
例如 Object的getClass()方法不能覆盖
不能覆盖静态方法
重载 子类有父类的同名方法,但两者的参数类型或参数数目不一样
多态
简单来说 相同的一条语句在不同的运行环境中可以产生不同的运行结果
例如 对于动物园的管理系统
如果要给不同类型的动物进行喂食 由于动物的种类不同 调用后喂食的东西(即产生的结果)不同
子类对象可以被当成基类对象使用
但是不能交叉继承
接口与抽象类
接口的标准(插排)
自定义(非标准)
举例来说 苹果的充电线
标签:Java,parent,继承,子类,printValue,第五次,父类,2022.10,public From: https://www.cnblogs.com/Arkiya/p/16759671.html