java 向下造型有什么用(java抽象类中的构造方法作用如何理解)
大家好,关于java 向下造型有什么用很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于java抽象类中的构造方法作用如何理解的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!
java创建对象
不知道你学过C/C++没有?
book a
表示创建一个指向book类对象的指针/引用。详细来说,a本质上是一个unsigned int变量,但是这个整形变量不储存别的东西,就储存内存地址。并且因为JAVA这种语言的特点,使得系统(虚拟机)自动进行类型检查,保证a变量指向的是book类型或book类子类类型的对象。
new在JAVA里是一个特殊操作符,但是我们的操作系统是用C语言来写的,new必然对应C语言的某个或某组系统函数调用。这里一般是等价于C语言的malloc函数,作用是请求操作系统为对象分配一块内存空间。
book()是构造函数,是在new出来的内存区域填充数据,初始化book类对象的一些变量或状态。
book a=new notebook()可以,父类的指针/引用可以指向子类的对象。(多态)
反过来notebook a= new book()不行。因为对于子类对象,父类所声明的变量是子类对象的空间的一部分,这意味着父类对象的所占内存空间大小不超过子类对象的大小。所以,不可能让子类指针指向父类对象,否则会指向一块未被分配的内存空间,导致出错。
java抽象类中的构造方法作用如何理解
/*学好java基础,学深java基础,才能走的更远(为什么呢?百度有更好的解释),愿我们共同探讨学习,用通俗易懂的话语来了解java
1.抽象类也是类,只不过本身不能实例化,要通过子类实例化。
2.是类就有构造方法,如果我们没有给出构造方法,系统将自动提供一个无参构造方法,如果我们给出了构造方法,系统将不会提供。
那么问题来了,为什么非得有构造方法呢?
构造方法(函数)的作用:(1)用于创建对象,初始化参数;(2)接受子类传来的参数,初始化参数,子类堆内存的某块位置存放父类的初始化参数
那么问题又来了,问题1:抽象类有构造方法怎么不能创建对象?问题2:它与接口又有什么关系呢?
问题1:请看构造函数的作用,还要补充下,用抽象类就要写个继承它的子类,然后通过父类引用指向子类这也是多态的表现,Father f= new Son();引用地址f就可以调用抽象类中的一般方法;
那么问题又来了抽象类怎么访问子类的方法呢?好了,自己考虑去
对于抽象类和一般类,接口来个例子
话说我去兰州拉面馆吃面,拿着菜单
抽象类的说法:
我:老板来碗面
老板:你需要什么面?
我:就是面啊?---------->描述抽象,既然抽象类都这么抽象了,那它有什么作用呢?简单来说,就是抽取某个类的共性功能,方便分类调用(编程就需要逻辑思维清晰,可读性强,就像书为什么要目录);举个例子,假如有哥们想吃面,想吃辣点的(面的共性辣),就快速选个方向去四川面馆,到了面馆就有查渣面,鸡丝凉面(具体类)选择...
老板:...
类的说法:
我:老板来碗面
老板:你需要什么面?
我:油泼面------------>描述具体
接口:从广义的角度讲对外提供规则的都是接口,来个例子
话说你家大门锁,你可以用匹配的钥匙打开锁,可我不一定非得要用你那型号的钥匙去开你家大门,我可以用铁丝就可以了,想想,实际生活中当真可以么,去问盗贼,他们"接口"倒是学的不赖
为什么用铁丝也可以开门呢?因为实现了锁孔内几个顶针同时顶上然后什么什么的方法,现在我们来看,我们可以用钥匙这个对象可以开锁,用铁丝这个对象开锁,他们共同的特点就是实现了
开锁的一些规则要求,也就是实现了开锁的要求的方法
需要说明的是:接口是没有构造方法的,它只是用来对外提供规则,其他类都可以实现这个接口,重写里面的方法
问题2:抽象类和接口的关系?
一般类继承抽象类,extends
一般类也可继承一般类----->类与类可以继承,单继承,儿子和父亲的关系(一个儿子不能来自两个父亲的基因,能吗?)
一般类和抽象类可以实现一个或多个接口,implements--->....干儿子和干爹的关系
那么问题来了:有没有人有个奇葩的问题,接口可不可以有父亲?干爹呢?
......收住,回到正题
3.子类中所有的构造方法默认都会访问父类中空参构造方法-->为什么呢?
因为子类会继承父类中的数据,可能还会使用父类的数据,
所以,子类初始化之前,一定要先完成父类数据的初始化。
4.那么问题来了,要是父类没有无参构造呢?
不会有人认为父类没构有造方法吧?。。。
系统会默认加的(前面有提到),这里是指父类手动写了有参构造,子类继承也要手动写出构造方法(请看下面例子)
5.继承的注意事项
(1):子类只能继承父类所有非私有的成员(成员方法和成员变量)--->皇帝老儿的妃子,你太子能继承享用,恩...只代表大众的想法,特殊的除外,不钻牛角尖
(2):子类不能继承父类的构造方法,但是可以通过super关键字去访问父类构造方法。
*/
/* 1.父类没有无参构造方法,子类怎么办?
super解决
this解决
2.注意事项
super(…)或者this(….)必须出现在构造方法的第一条语句上
*/
class test{
public static void main(String[] args){
Son son= new Son("张三",23);
System.out.print(son.name+":"+son.age);
}
}
class Father{
String name="李四";//姓名
int age=24;//年龄
/*public Father(){//空参构造
System.out.println("Father空参构造");
}*/
public Father(String name,int age){//有参构造
//super();系统默认的,你知道是继承谁的吗?最高父类Object
this.name= name;
this.age= age;
}
public void setName(String name){//设置姓名
//super();系统默认的,你知道是继承谁的吗?最高父类Object
this.name= name;
}
public String getName(){//获取姓名
return name;
}
public void setAge(int age){//设置年龄
this.age= age;
}
public int getAge(){//获取年龄
return age;
}
}
class Son extends Father{
//String name="张三";
//int age=23;
/*public Son(){//由于父类没有无参构造(子类不继承父类构造放法),但是可以通过加this(值)或super(值)去访问父类构造方法
//super();系统默认的,你知道是继承谁的吗?可惜上面 Father类没有无参构造
//this(name,age);//注意,这种写法错误,虽然name,和age为成员变量,但是,无参构造方法没有参数传进来,(说到底无参构造方法终究还是个方法而已)
this("张三",23);//这种方法可以,为什么?因为它会在本类中寻找有参构造,通过 super(name,age)将值传入父类(因为父类只有有参构造)
//留下个疑问?要是下面有参构造,形参少了参数,即public Son(String name){ super(name,age);}还起作用吗?试试
//super(name,age);//同上
super("李四",24);//同上,注意this(值)和super(值)不能同时在构造方法的第一条语句上,但系统默认super()除外
}
public Son(String name,int age){
//super(name);
//super();系统默认的,你知道是继承谁的吗?可惜上面 Father类没有无参构造
super(name,age);
System.out.print(name+":"+age);
}
}
//子类构造方法另外种写法对吗?
class test{
public static void main(String[] args){
Son son= new Son("王五");
System.out.print(son.name+":"+son.age);
}
}
class Father{
String name;//姓名
int age;//年龄
/* public Father(){//空参构造
System.out.println("Father空参构造");
}
*/
public Father(String name,int age){//有参构造
//super();系统默认的,你知道是继承谁的吗?最高父类Object
this.name= name;
this.age= age;
}
public void setName(String name){//设置姓名
//super();系统默认的,你知道是继承谁的吗?最高父类Object
this.name= name;
}
public String getName(){//获取姓名
return name;
}
public void setAge(int age){//设置年龄
this.age= age;
}
public int getAge(){//获取年龄
return age;
}
}
class Son extends Father{
//String name="张三";
//int age=23;
/* public Son(){//由于父类没有无参构造(子类不继承父类构造放法),但是可以通过加this(值)或super(值)去访问父类构造方法
//super();系统默认的,你知道是继承谁的吗?可惜上面 Father类没有无参构造
//this(name,age);//注意,这种写法错误,虽然name,和age为成员变量,但是,无参构造方法没有参数传进来,(说到底无参构造方法终究还是个方法而已)
this("张三",23);//这种方法可以,为什么?因为它会在本类中寻找有参构造将值传入父类(因为父类只有有参构造)
//留下个疑问?要是下面有参构造,形参少了参数,即public Son(String name){ super(name,age);}还起作用吗?试试
//super(name,age);//同上
super("李四",24);//同上,注意this(值)和super(值)不能同时在构造方法的第一条语句上,但系统默认super()除外
}*/
public Son(String name){//我们说子类不继承父类的构造方法,也可以这样写对吗?
//super(name);
//super();系统默认的,你知道是继承谁的吗?可惜上面 Father类没有无参构造
super(name,24);
System.out.print(name+":"+age);
}
}
//就写这么多吧,不断的为什么,我都要疯了,有错误的和遗漏的希望指正
java中的强制类型转换
在Java中强制类型转换分为基本数据类型和引用数据类型两种,这里我们讨论的后者,也就是引用数据类型的强制类型转换。
在Java中由于继承和向上转型,子类可以非常自然地转换成父类,但是父类转换成子类则需要强制转换。因为子类拥有比父类更多的属性、更强的功能,所以父类转换为子类需要强制。那么,是不是只要是父类转换为子类就会成功呢?其实不然,他们之间的强制类型转换是有条件的。
当我们用一个类型的构造器构造出一个对象时,这个对象的类型就已经确定的,也就说它的本质是不会再发生变化了。在Java中我们可以通过继承、向上转型的关系使用父类类型来引用它,这个时候我们是使用功能较弱的类型引用功能较强的对象,这是可行的。但是将功能较弱的类型强制转功能较强的对象时,就不一定可以行了。
举个例子来说明。比如系统中存在Father、Son两个对象。首先我们先构造一个Son对象,然后用一个Father类型变量引用它:
Father father= new Son();
在这里Son对象实例被向上转型为father了,但是请注意这个Son对象实例在内存中的本质还是Son类型的,只不过它的能力临时被消弱了而已,如果我们想变强怎么办?将其对象类型还原!
Son son=(Son)father;
这条语句是可行的,其实father引用仍然是Father类型的,只不过是将它的能力加强了,将其加强后转交给son引用了,Son对象实例在son的变量的引用下,恢复真身,可以使用全部功能了。
前面提到父类强制转换成子类并不是总是成功,那么在什么情况下它会失效呢?当引用类型的真实身份是父类本身的类型时,强制类型转换就会产生错误。例如:
Father father= new Father();
Son son=(Son) father;
这个系统会抛出ClassCastException异常信息。
所以编译器在编译时只会检查类型之间是否存在继承关系,有则通过;而在运行时就会检查它的真实类型,是则通过,否则抛出ClassCastException异常。
所以在继承中,子类可以自动转型为父类,但是父类强制转换为子类时只有当引用类型真正的身份为子类时才会强制转换成功,否则失败。
扩展资料:public class TestCastClassException
{
public static void main(String[] args)
{
Father father= new Son();
//这两句话是不对的,因为一个father类型的引用(指针)是看不见、看不到son中新定义的数据成员或者成员函数的
//虽然这个对象的本质是Son类型的,它也确实有这样的数据成员和成员函数,但是指针的作用范围不够,它看不到。
//代码后面附上模型分析
//father.son= 2;
//father.show_son();
father.show_father();
father.show();
Father father1=(Father)father;//一个对象在内存中被new出来后,只能选择访问它的方式,不能修改它的布局(包含的成员的个数等)
father1.show();
}//main
}
class Father
{
public int father= 2;
Father(){}
void show()
{
System.out.println("This is father");
}
void show_father()
{
System.out.println("father!!");
}
}
class Son extends Father
{
public int son= 1;
Son(){}
void show()
{
System.out.println("This is son");
}
void show_son()
{
System.out.println("son!!");
}
}
关于java 向下造型有什么用和java抽象类中的构造方法作用如何理解的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。