java课内容2019.3.1
java的相关了解博客:答疑
https://www.cnblogs.com/aishangJava/p/6862917.html
一.构造方法:
1.构造方法只能被编译器调用一次,并且是在创建对象时
2.任何一个类都有,如果未定义,系统会自动默认一个无参的构造方法
3.构造方法的方法名应与类名一致,无返回类型,允许重载
4.创建一个子类对象,会自动先调用父类对象的构造方法,再是子类自身的构造方法。(这并不是创建了两个对象,其实只有一个子类对象;之所以需要调用父类的构造方法是因为在父类中,可能是因为在父类中,可能存在私有属性需要在其构造方法内初始化;)
对于Java开发人员来说,这是一个很常见的编译错误:
"Implicit super constructor is undefined for default constructor. Must define an explicit constructor"
例如下面的代码例子:
class Super{
String s;
public Super(String s){
this.s=s;
}
}
public class Sub extends Super{
int x=200;
public Sub()
{
System.out.println("Sub");
}
public static void main(String[] args){
Sub s=new Sub();
}
}
之所以出现这个编译错误,是因为父类的默认构造方法未定义。在Java中,如果一个类没有定义构造方法,编译器会默认插入一个无参数的构造方法;但是如果一个构造方法在父类中已定义,在这种情况,编译器是不会自动插入一个默认的无参构造方法,这正是以上demo的情况;
对于子类来说,不管是无参构造方法还是有参构造方法,都会默认调用父类的无参构造方法;当编译器尝试在子类中往这两个构造方法插入super()方法时,因为父类没有一个默认的无参构造方法,所以编译器报错;
要修复这个错误,很简单:
1、在父类手动定义一个无参构造方法:
public Super(){ System.out.println("Super"); }
2、移除父类中自定义的构造方法
3、在子类中自己写上父类构造方法的调用;如super(value);
我说一下我的理解:
首先看main函数,创建了一个Sub型的变量s,但是构造方法是这种的类型Sub(),然后看Sub类中,确实存在Sub()类型的构造函数(注明:即使不存在,系统应该也会有自定义一个无参构造方法),子类的构造方法没错,错在父类那里,
之前说了子类一定会引用到父类的构造方法,看父类,也定义了构造方法Super(String s),这就是问题,由于父类自身定义了构造方法,所以系统可能不会去再定义一个无参构造方法,但是这与子类的构造方法不一致(子类是无参,
其所需要的父类构造方法也应是无参的),就是父类与子类构造方法不一致。
在子类构造方法中,不管是程序员手动调用父类构造方法还是编译器自动调用,
子类构造方法必须要调用父类的某个构造方法;
被子类调用的父类构造方法在父类中必须是存在的;
二.java低层建筑的变化不会影响上层建筑的运行
三.接口
1.作用接受所有实现类的实例,可去访问具体对象方法
2.可以继承,且允许多重j继承(因为接口里面什么都没有,多重继承也不会产生混乱的关系而导致错误)
3.比抽象类更抽象,不能有变量,只有常量(描述不变信息),不能有已实现方法。
4.接口来实现类的引用
四.异常
子类抛出异常比父类更细致(更小的一个点),且父类异常写在子类异常后面(即先写子类异常,后写父类异常),否则还没到子类异常,在父类异常那里直接被捕捉。
五.Circle p = new Circle();
其中p不是对象,是变量,是一个引用,与对象首地址有关
六.继承
方法重载:方法名相同,但参数列表不一致。
只要求参数的个数或参数的类型不一致就说两个函数是重载函数,而至于返回值是否一样,没关系。同时,重载可以发生在同一个类中也可以发生在继承关系中。
方法重写:方法名,返回类型,参数列表一致
七.抽象类
1.可包含抽象方法的类,但没有抽象方法的类也可为抽象类(这种一般定义为抽象类的原因是单纯不让它实例化,不能形成对象,也就是不能被new.
2.抽象类若需实例化,可交给它的非抽象子类
3.抽象类可看作是一个残类,功能不全。
4.抽象方法只有功能(方法)定义,没有功能(方法)实现,即抽象方法 abstract void f(); 抽象方法不能包含有任何方法的BODY 。
5.抽象类中可以有非抽象方法(非抽象方法是可以存在功能实现)。
八.向上转型,向下转型
向上转型:通俗地讲即是将子类对象转为父类对象。此处父类对象可以是接口
向下转型:即是把父类对象转为子类对象。父类引用复制给子类对象引用,但不一定成功,原因是编译器
具体理解可看:在java 中,什么叫向上转型
https://zhidao.baidu.com/question/176791556213151844.html