public abstract class i { public abstract void fight(); i aa=new i(); }
上述代码会出现以下错误
若是子类要继承抽象父类,那么它必须继续标示该方法为abstract,或者是操做抽象方法。html
public String toString() { return String.format("剑士(%s,%d,%d)",this.name,this.blood,this.level); }
(若是方法中没有同名函数,this能够省略)
如上代码段,(其中String.format语句:String类的format()方法用于建立格式化的字符串以及链接多个字符串对象。详见以下连接).在父类中定义以下函数,便可引用子类的函数。java
public static void drawFight(d role) { System.out.println(role.toString()); }
至此,已经学习了java中关于权限的三个关键字,分为四个权限范围,以下表git
关键字 | 类内部 | 相同包内 | 不一样包类 |
---|---|---|---|
public | 可存取 | 可存取 | 可存取 |
private | 可存取 | 不可存取 | 不可存取 |
protected | 可存取 | 可存取 | 不可存取但子类可存取 |
无 | 可存取 | 可存取 | 不可存取 |
public class i{ public static void main(String[] args) { other ss=new other(); ss.toString(); } static class a{ a() { System.out.println("some()被调用"); } a(int i) { System.out.println("some(int i)被调用"); } } static class other extends a { other() { super(); System.out.println("other()被调用"); } } }
结果如图在new other()时,先调用了other版本的构造函数,super(10)表示调用父类some(int i)版本的构造函数,故有上述输出。若是子类在构造函数中没有指定执行父类中的那个构造函数,默认会调用父类中无参数构造函数。以下代码段会显示编译出错bash
static class a{ a(int i) { System.out.println("some(int i)被调用"); } } static class other extends a { other() { System.out.println("other()被调用"); }
以下由于父类中定义了a(int i)构造函数,不会自动加入任何构造函数,而子类默认调用父类中无参数的构造函数,所以编译失败。(若是定义了有参数的构造函数,也能够加入无参数构造函数为往后使用上的弹性)。ide
Object o1="taylor swif"; Object o2=new Data() ;
System.out.println(swords.toString()); System.out.println(swords);
是相同的。函数
public interface swimmer { public abstract void swim(); }
package src.week3; public class human implements swimmer{ public static void main(String[] args) { human a=new human("hjasdh"); a.swim(); } private String name; public human(String name) { this.name=name; } public String getName() { return name; } @Override public void swim() { System.out.printf("人类%s游泳%n",name); } }
human操做了swimmer,因此都拥有Swimer定义的行为,但他们没有继承Fish。类要操做接口,必须使用implement关键字,操做某接口时,对接口中定义的方法有两种处理方式,一是操做接口中定义的方法,二是再度将该方法表示为abstract。注意:java中子类只能继承一个父类。学习
public class Ocean { public static void main(String[] args) { doswim(new human("ads")); doswim(new shark("ads")); doswim(new submarine("ads")); } static void doswim(swimmer a)//只要对象拥有Swimer行为,就能够直接引用,无需作新的方法撰写 { a.swim(); }
在java中类能够操做两个以上的类,拥有两种以上的行为。代码以下:ui
public class airplane implements swimmer,flyer{}
public abstract void swim(){}
interface Action { void execute(); } interface some extends Action{ void dosome(); } interface other extends Action{ void doother(); } public class n implements some,other{ public static void main(String[] args) { n aa=new n(); aa.dosome(); aa.doother(); aa.execute(); } @Override public void execute() { System.out.println("execute"); } @Override public void dosome() { System.out.println("some"); } @Override public void doother() { System.out.println("other"); } }
接口能够继承别的接口,也能够同时使用两个以上的接口,一样是使用extends关键字。this
成员内部类定义在成员位置上,局部内部类定义在局部位置与方法上。内部类的成员能够直接访问外部的成员,而外部类要访问内部类,必须创建内部类对象。当内部类定义了static成员,该内部类必须是static。局部内部类方文局部变量必须用final修饰,由于局部变量会随着方法的调用而被调用,随着方法调用完毕而消失,加上final后,这个变量就变成了常量。匿名内部类是一个继承了该类或者是实现了该接口的子类匿名对象。它必须继承一个类或者是实现了接口。格式为new 父类或者接口(){重写方法}。能够将其理解为带内容的对象。匿名内部类中定义的方法最好不要超过三个。.net
f jiansh=new d();//d类是父类,f类是子类。这行代码编译出错。
public class f extends d{ public static void main(String[] args) { fight(); } public static void fight(){ System.out.println("挥剑攻击"); d role1=new f();// f jianshi=(f) role1;//告诉编译程序,f是一种d。 f jiansh=new d();// } }
其中第11行代码编译成功,由于你告诉编译程序,f是一种d。
package src.week3; public class RPG { public static void main(String[] args) { f qq=new f(); qq.setName("Justin"); qq.setLevel(1); qq.setBlood(200); showblood(qq); a bb=new a(); showblood(bb); } static void showblood(d role) { System.out.printf("%s血量 %d%n",role.getName(),role.getBlood()); }
没法从bb包内取得信息,不然编译不经过,上述代码能够获得以下结果:
同时能够借此回顾上一周学的字符串初始化为null。
package src.week3; import java.util.Scanner; public class guest { public static void main(String[] args) { k name1=new k(); collectnameto(name1); System.out.println("访客名单:"); pp(name1); } public static void collectnameto(k names) { while(!(names.equals("quit"))){ System.out.print("访客姓名: "); Scanner console=new Scanner(System.in);//新建一个Scanner实例 String name=console.nextLine(); if(names.equals("quit")); break; } names.add(names);//收集name } public static void pp(k name1) { for(int i=0;i<name1.size();i++) { String name=(String) name1.get(i); System.out.println(name.toUpperCase()); } } }
此代码只能输入一次,虽能够编译但运行出错。提示错误所在代码以下
String name=(String) name1.get(i);
因此索性直接改成
System.out.println(name1.get(i));
但输出变成想着是呀忘了把它转换成String类型就直接输出了。因而继续修改
System.out.println((String) name1.get(i));
但仍是出错,如图:根据输出判断应该和第一次代码的错误相同。估计错误不在此处,因而与书上比较是否有粗心输错的地方,果真我把
name1.add(cc);
放到了循环外侧,因而把语句拖入循环中,觉得应该对了,结果直接出错以下:UNreachable statement的意思是不能到达的语句。我想是否是他的位置有问题,就把它移到了if()语句上面,能够编译和运行了,可是只能输入一个名字,如图:
我想确定是循环哪里出了毛病,因而在这个函数开头设断点开始单步调试,一开始都是正确的以下图:
但在下一步就是
if(cc.equals("quit")); { break; }
语句处,明明不相等的两个语句,可是却break了。因而我开始着手解决if()条件语句。尝试屡次都在出错,错误都是相同的就是直接跳出循环。此处的问题还没搞清楚。因而放弃if()语句,将代码段修改以下
public static void collectnameto(k name1) {int i=0; Scanner console=new Scanner(System.in);//新建一个Scanner实例 while (i==0){ System.out.printf("访客姓名: "); String cc=console.next(); console.nextLine(); name1.add(cc); i=ww(cc); } } public static int ww(Object o) { if(o.equals("quit")) return 1; else return 0; }
显示正确。最后能够正确输入与输出以下图:最后关于
cc=console.next(); console.nextLine();
语句,我曾怀疑是这里出错,上网百度后,发现了.nextLine()和.next()其实没什么大的分别,但可能出现吃回车问题,因而我在cc=console.next();语句后又加入了console.nextLine();能够避免这个问题。
public class Game { public static void main(String[] args) { System.out.println(""+52+25); System.out.println(52+25+""); } }
对上述代码的输出理解
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 120/120 | 1/1 | 16/16 | 开始了JAVA学习的第一步! |
第二周 | 346/466 | 1/2 | 23/36 | 了解并学习了Java基础语法 |
第三周 | 364/830 | 1/3 | 21/57 | 进一步了解java设计语句 |
第四周 | 570/1300 | 2/5 | 20/77 | 初步学习了继承与多态,接口与多态知识。 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进本身的计划能力。这个工做学习中很重要,也颇有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
计划学习时间:18小时
实际学习时间:20小时
改进状况:这周学习任务量比较大,花费的时间比预期要多,但效率还不错。