代码以下:↓↓↓javascript
package test1; public class Employee implements Cloneable { private String name; private double salary; public Employee(String name,double salary){//构造函数 super(); this.name=name; this.salary=salary; } @Override public String toString() { return "Employee [name=" + name + ", salary=" + salary + "]"; } public Employee clone() throws CloneNotSupportedException{//覆盖clone方法,声明为public Employee cloned=(Employee)super.clone(); return cloned; } }
package test2; import test1.*; public class TestProtected { public static void main(String[] args){ Employee employee1=new Employee("chenjinxia",100.00); Employee employee2=employee1.clone(); System.out.println(employee1); System.out.println(employee2); } }
不能成功,会报错。根据提示修改html
... public class TestProtected { public static void main(String[] args) throws CloneNotSupportedException{ Employee employee1=new Employee("chenjinxia",100.00); ...
就能够编译成功。↓↓↓
java
clone()方法,通常要用public来修饰,若是用protected来修饰,就会对test1包外不可见,那样test2的就调用不了。数组
要先实现Cloneable接口,并声明为public,并且这个是浅复制,如要深复制,要对其全部引用型属性进行复制。安全
首先咱们查看一下源代码:↓↓↓
能够看出clone()方法是来自Object的,是public native修饰的,这样可使clone()方法必须经过实现接口或者继承父类进行覆盖才能实现,使clone()方法更加安全和严谨。ide
使用匿名类:函数
Comparator<PersonSortable2> NameComparator = new Comparator<PersonSortable2>(){ @Override public int compare(PersonSortable2 o1, PersonSortable2 o2) { return o1.getName().compareTo(o2.getName()); } }; Comparator<PersonSortable2> AgeComparator = new Comparator<PersonSortable2>(){ @Override public int compare(PersonSortable2 o1, PersonSortable2 o2) { if (o1.getAge() < o2.getAge()) { return -1; } else if (o1.getAge() > o2.getAge()) { return 1; } else { return 0; } } };
使用Lambda表达式:学习
Comparator<PersonSortable2> NameComparator=(o1,o2)-> o1.getName().compareTo(o2.getName()); Comparator<PersonSortable2> AgeComparator=(o1,o2)-> o1.getAge()-o2.getAge();
运行结果:
this
Comparator<Shape> shapeComparator = new Comparator<Shape>() { @Override public int compare(Shape o1, Shape o2) { //你的代码 } };
shapeComparator实现了Comparator接口,使用匿名内部类的写法,重写了compare方法。code
实验总结:建立MyStarter对象时,题目要求:MyStarter类的构造函数public MyStarter(ActionListener ac)要接收ActionListener类型的对象,因此咱们应该这样建立:ActionListener ac = new ActionListener()
,而后再这个内部类里重写方法。
好处:使代码更加紧凑,方便简洁,且能够隐藏你不想让别人知道的操做。
可参考:http://www.cnblogs.com/kyxyes/archive/2013/02/18/2916292.html
a.总结:push()、pop()及empty()要注意判断当栈为空的状况,不然会出现数组越界的错误。
b.定义IntegerStack接口,要求不一样可是一些方法相同,就能够实现这个接口,让代码拓展性更高,便于维护和开展新功能适应新平台。
虽然逻辑关系上内部类声明在一个类的内部,可是但愿其保证持续存在,可以给别的别的类随时调用的类,能够声明为静态内部类。
非静态内部类是附属在外部类对象上的,须要先实例化一个外部类的对象,经过外部类对象才能实例化非静态内部类;而静态内部类能够看作是直接附属在外部类上的,这个静态表明附属体是外部类,而不是外部类实例;外部类在进程中是惟一的,而静态内部类不须要惟一,能够生成多个实例。
前提条件:要实现接口Comparable,并重写方法。
参考Case-StudentDao.zip案例
假设在不一样的实现中,购物车里的商品有的是存放在ArrayList,有的是存放在数组中。
public interface CarDao{ public double getTotal(); public boolean removeGoods(Goods goods); public boolean addGoods(Goods goods,int num); }
列表:
//陈锦霞201621123061 ArrayList<Goods> shoppinglist = new ArrayList<>(); public double getTotal();{//总价格 double total=0; for(int i=0;i<shoppinglist.size();i++){ total += shoppinglist.get(i).getNum() * shoppinglist.get(i).getPrice(); } return total; } public boolean removeGoods(Goods goods) {//删除商品 for(int i=0;i<shoppinglist.size();i++){ if(shoppinglist.contains(goods)) { shoppinglist.remove(goods); return true; } else return false; } } public boolean addGoods(Goods goods,int num){//添加商品 for(int i=0;i<shoppinglist.size();i++){ if(shoppinglist.add(goods)){ num++; return true; } } }
数组:
CartList[] shoppinglist; public double getTotal();{//总价格 double total=0; for(int i=0;i<shoppinglist.length;i++){ total += shoppinglist.get(i).getNum() * shoppinglist.get(i).getPrice(); } return total; } public boolean removeGoods(Goods goods){//删除商品 for(int i=0;i<shopping.length;i++){ if(shoppinglist.contains(goods)) { shoppinglist.remove(goods); return true; } else return false; } } public boolean addGoods(Goods goods,int num){//添加商品 for(int i=0;i<shopping.length;i++){ if(shoppinglist.add(goods)){ num++; return true; } } }
public class Main{ public static void main(String[] args) { Goods[] goods = new Goods[2]; goods[0]=new Goods("机械键盘",598,1); goods[1]=new Goods("java课本",89,1); GoodsDao sdm = new GoodsDaoArrayImpl(50);//使用数组实现 //GoodsDao sdm = new GoodsDaoListImpl();//使用列表实现 System.out.println("===========计算总价格========"); for(Goods e:goods){ if(sdm.getTotal(e)){ System.out.println("%f",total); } } System.out.println("===========添加商品========"); for(Goods e:goods){ if(!sdm.addGoods(e)){ System.out.println("添加商品失败!"); }else{ System.out.println("添加商品成功!"); } System.out.println("===========删除商品========"); for(Goods e:goods){ if(!sdm.removeGoods(e)){ System.out.println("删除商品失败!"); }else{ System.out.println("删除商品成功!"); } }
DAO(Data Access Object)接口是一个数据访问接口,当咱们实现了这个接口,咱们能够经过这个接口来编写不一样的类,使用不一样的方法来实现数据的存储。
将四个实例按年龄从小到大排序并输出结果。
不行。要用super()来调用父类的构造函数,若是去掉就会出现Implicit super constructor Person() is undefined. Must explicitly invoke another constructor
的报错信息。
对五个类中的toString()方法的重写体现了多态性。
题集:jmu-Java-04-面向对象2-进阶-多态接口内部类
在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 而后搜索并截图
须要有两张图(1. 排名图。2.PTA提交列表图)
须要将每周的代码统计状况融合到一张表中。
周次 | 行数 | 新增行数 | 文件数 | 新增文件数 |
---|---|---|---|---|
1 | 91 | 91 | 5 | 5 |
2 | 504 | 413 | 18 | 13 |
3 | 1092 | 588 | 28 | 10 |
5 | 1158 | 129 | 34 | 6 |
6 | 1539 | 381 | 40 | 6 |
7 | 2023 | 484 | 49 | 9 |