例子1:
类A继承类Action,系统提示类'A'必须被声明为抽象类或者实现在类'Action'中的doSomething()方法
抽象总结:
抽象的抽象:约束~
思考题:
答:1. 抽象类一定有而且是必须有构造器,是供子类创建对象时,初始化父类成员使用的。
理解:子类的构造器中,有默认的super()需要访问父类构造器。
2. 代码复用,提高开发效率
extends 单继承,而使用接口可以实现多继承
例子
接口中的所有定义其实都是抽象的 ,默认加上public abstract
接口中定义的属性都是常量,默认加上public static final
package li.oop.demo09;
//interface 定义的关键字,接口都需要有实现类
public interface UserService {
//接口中的所有定义其实都是抽象的 ,默认都是public abstract
// void run(String name);在接口类中等同于:public abstract void run(String name);
void run(String name);
void add(String name);
void delete(String name);
void update(String name);
void query(String name);
}
package li.oop.demo09;
public interface TimeService {
void time();
}
实现类的命名规范是:接口类名+Impl,实现了接口的类,就需要重写接口中的方法
如下:UserServiceImpl实现类通过接口实现了多继承(UserService,TimeService)
package li.oop.demo09;
//抽象类:extends
//实现类 可以实现接口 implement :实现接口
//实现了接口的类,就需要重写接口中的方法
//多继承~利用接口实现多继承
public class UserServiceImpl implements UserService,TimeService{
@Override
public void run(String name) {
}
@Override
public void add(String name) {
}
@Override
public void delete(String name) {
}
@Override
public void update(String name) {
}
@Override
public void query(String name) {
}
@Override
public void time() {
}
}
接口的作用:

内部类就是在一个类的内部再定义一个类,比如,A类中定义一个B类,那么B类对A类来说就称为内部类,而A类相对B类来说就是外部类了。
内部类的种类:(1)成员内部类,(2)静态内部类,(3)局部内部类,(4)匿名内部类
内部类的特点:编译之后可以生成单独的字节码文件
除了外部类Body会生成一个.class文件外,内部类也会单独生成一个.class文件
内部类Outer&Inner.class,外部类Outer.class
内部类可以直接访问外部类的私有成员,而不破坏封装
可以为外部类提供必要的功能组件
内部类不能被public、private、static修饰;
在外部类中不能创建内部类的实例;
创建内部类的实例只能在包含他的方法中;
内部类访问包含他的方法中的变量必须有final修饰;
外部类不能访问局部内部类,只能在方法体中访问局部内部类,且访问必须在内部类定义之后。
例子1:成员内部类
package li.oop.demo10;
public class Outer {
private int id = 10;
private void out(){
System.out.println("这是外部类的方法");
}
public class Inner{
public void in(){
System.out.println("这是内部类的方法");
}
//获得外部类的私有属性
public void getID(){
System.out.println(id);
}
}
}
package li.oop;
import li.oop.demo10.Outer;
public class Application {
public static void main(String[] args) {
Outer outer = new Outer();
//通过外部类来实例化内部类
Outer.Inner inner = outer.new Inner();
inner.in();
inner.getID();//获得了外部类的私有属性
}
}
Outer.Inner inner = outer.new Inner();通过外部类来实例化内部类
inner.getID();获得了外部类的私有属性
例子2:静态内部类
package li.oop.demo10;
public class Outer {
private int id=10;
private void out(){
System.out.println("这是外部类的方法");
}
//静态内部类
public static class Inner{
public void in(){
System.out.println("这是内部类的方法");
}
}
}
例子3:局部内部类
局部内部类是放在代码块或方法中的,不能有访问控制修饰符,且不能用static修饰
一个java文件可以有多个class类,但是只能有一个public class在最外层
局部内部类可以在方法中定义
package li.oop.demo10;
public class Outer {
public void method(){
//局部内部类
class Inner{
public void in(){
}
}
}
}
例子4:匿名内部类
package li.oop.demo10;
public class Test {
public static void main(String[] args) {
//正常
Apple apple = new Apple();
//匿名内部类
//没有名字初始化类,不用将实例保存到变量中~
new Apple().eat();
//在这里可以直接重写接口UserService的方法,但是没有实现类也是没有名字,也是匿名类
UserService userService = new UserService() {
@Override
public void hello() {
}
};
}
}
class Apple{
public void eat(){
System.out.println("1");
}
}
interface UserService{
void hello();
}
什么是异常?
程序运行过程中由外部问题(如硬件错误、输入错误)所导致的异常事件,我们称为异常,英文名是:Exception,意思是例外。
(在Java等面向对象的编程语言中)异常本身是一个对象,产生异常就是产生了一个异常对象。
简单分类:
检查性异常:最具代表的检查性异常是用户错误或者问题引起的异常,这是程序员无法预见的
例如要打开一个不存在的文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略
运行时异常:运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略
错误(Error):错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如:当栈溢出时,一个错误就发生了,它们在编译时也检查不到的
Error和异常Exception

在Exception分支中有一个重要的子类RuntimeException(运行时异常)
ArrayIndexOutOfBoundsException(数组下标越界)
NullPointerException(空指针异常)
ArithmeticExcption(算数异常)
MissingResourceException(丢失资源)
ClassNotFoundException(找不到类)
等异常,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。
这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生
Error和Exception的区别:Error通常是灾难性的致命性的错误,是程序无法控制和处理的,当出现这些异常时,Java虚拟机(JVM)一般会去选择终止线程;Exception通常情况下是可以被程序处理的,并且在程序中应该尽可能地去处理这些异常。
例子:try catch
package li.exception;
public class Test {
public static void main(String[] args) {
int a = 1;
int b = 0;
//假设要捕获多个异常,需要从小到大去捕获
try {//try监控区域
System.out.println(a/b);
}catch (Error e){//catch(想要捕获的异常类型)
System.out.println("Error");
}catch(Exception e){
System.out.println("Exception");
}catch(Throwable e){
System.out.println("Throwable");
} finally{//无论是否有异常都会执行finally 处理善后工作
System.out.println("finally");
}
//try catch是配套的,finally 可以不要
}
}
快捷键:Ctrl+Alt+T
选中代码语句,点击快捷键Ctrl+Alt+t可以快速生成try catch语句
package li.exception.demo02;
//自定义的异常类 只需继承Exception类即可
public class MyException extends Exception {
//传递数字>10
private int detail;
public MyException(int a){
this.detail = a;
}
//toString:异常的打印信息
@Override
public String toString() {
return "MyException{"+ detail+"}";
}
}
package li.exception.demo02;
public class Test {
//可能会存在异常的方法
static void test(int a) throws MyException {
System.out.println("传递的参数为"+a);
if (a >10) {
throw new MyException(a);//抛出异常
}
System.out.println("OK");
}
public static void main(String[] args) {
try {
test(12);
} catch (MyException e) {
System.out.println("MyException=>"+e);
}
}
}
实际应用中的经验总结:
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调
我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser
我想让一个yaml对象引用另一个,如下所示:intro:"Hello,dearuser."registration:$introThanksforregistering!new_message:$introYouhaveanewmessage!上面的语法只是它如何工作的一个例子(这也是它在thiscpanmodule中的工作方式。)我正在使用标准的rubyyaml解析器。这可能吗? 最佳答案 一些yaml对象确实引用了其他对象:irb>require'yaml'#=>trueirb>str="hello"#=>"hello"ir
假设我有一个FireNinja我的数据库中的对象,使用单表继承存储。后来才知道他真的是WaterNinja.将他更改为不同的子类的最干净的方法是什么?更好的是,我很想创建一个新的WaterNinja对象并替换旧的FireNinja在数据库中,保留ID。编辑我知道如何创建新的WaterNinja来self现有FireNinja的对象,我也知道我可以删除旧的并保存新的。我想做的是改变现有项目的类别。我是通过创建一个新对象并执行一些ActiveRecord魔法来替换行,还是通过对对象本身做一些疯狂的事情,或者甚至通过删除它并使用相同的ID重新插入来做到这一点,这是问题的一部分。
根据ActiveRecord::Base的文档:==(comparison_object)Returnstrueifcomparison_objectisthesameexactobject,orcomparison_objectisofthesametypeandselfhasanIDanditisequaltocomparison_object.id.Notethatnewrecordsaredifferentfromanyotherrecordbydefinition,unlesstheotherrecordisthereceiveritself.Besides,ifyoufet