

//细节2:只有默认和public才能修饰类
public class Sds {
public int i = 1; //公共
protected int n = 2;//受保护的
int o = 3;//默认的
private int p = 4;//私有的
public void show(){ //方法和属性的访问修饰符是一样的
System.out.println("我是方法show");
}
}
//细节2:只有默认和public才能修饰类
class King{
}
什么是封装? 将类在的某些信息隐藏在类的内部,不允许外部直接访问,而是通过类提供的方法来对隐藏的数据进行访问和操作
封装的好处? 1.只能规定的方法访问和操作数据 ,2.可以对数据进行验证,保证安全合理,3.隐藏实现细节
将属性私有化private
提供一个setXxx(参数列表)方法,对属性进行判断和赋值
提供一个getXxx()方法,获取属性值
public class Test{
private String name;
private String sex = "男";
private int age = 18;
//获取属性值
public String getName() {
return name;
}
public void setName(String name) {
//进行判断和赋值
if(name.length() > 1 && name.length() < 5){
this.name = name;
}else {
System.out.println("你名称太长了");
}
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
main{
Test.setName("jack,彭于晏,吴彦祖");//肯定是错的,因为条件判断最大是5
}
如果使用构造器来给属性赋值,那么Set方法的判断就会失效,直接在构造器中调用Set方法就可以经解决
public Sds2(String name, String sex, int age) {
//像使用构造器,就可以直接跳过Set()的判断了
// this.name = name;
// this.sex = sex;
//调用本类的方法就好set方法就好了
setName(name);
setSex(sex);
}

class 子类 extends 父类{
//继承父类,知道要有父类的属性和方法
}
子类继承了父类,非私有的属性和方法可以直接在子类访问,但私有属性不能直接访问(需要通过父类的公共方法来访问)
子类必须调用父类的构造器,完成父类的初始化(理解:当去继承父类如果没调用构造器初始化父类,那么继承的是什么?)
public static void main(String[] args) {
B b= new B();
}
class A{
A(){
System.out.println("我是A的无参构造器");
}
A(String mame) {
System.out.println("我是A的有参构造器");
}
}
class B extends A{//只能继承一个父类
B(){
//super();默认调用父类的无参构造器
//super("jack");指定父类的构造器
System.out.println("我是b的无参构造器");
}
}
什么是Super关键字? 可以用于直接访问父类的构造器、方法、属性
class Car{
String name = "汽车";
String affect = "出行";
}
class CarSon extends Car{
String name = "跑车";
String CarName = "Lamborghini";
public void jk(){
System.out.println("CarSon类jk方法");
}
public void show(){
System.out.println(affect);//如果没指定调用的是父类的还是子类的,就从子类开始向上找
System.out.println(name);//输出跑车,这个也等价于this.name
System.out.println(super.name);//输出汽车
}
}
如不使用super,就从本类向父类查找成员,如果有重名就遵循就近原则,本类没有才找父类
找成员naem,如子类没有找父类,父类没有在找爷爷类。A->B->C,当然遵守访问权限原则

什么是方法的重写? 就是子类的某个方法和父类的某个方法,方法名称、返回类型、参数列表一样
子类的形参列表,方法名称,要和父类形参列表,方法名称完全一样
子类的返回类型要和父类一致,或保持父子关系,如父类是Object返回类型,子类是String返回类型
子类不能缩小方法的访问权限但是可以放大 public > protected > 默认 > private
class Car{
public void show(){
System.out.println("我是show方法");
}
public Object show2(){
return 1.1;
}
private void show3(){
System.out.println("我是show3方法");
}
}
class CarSon extends Car{
//子类的形参列表,方法名称,要和父类形参列表,方法名称完全一样
public void show(){
System.out.println("我是子类,我重写了show方法");
}
//子类的返回类型要和父类一致,或保持父子关系,如父类是Object子类是String
public String show2(){
return "1.1";
}
//子类不能缩小方法的访问权限但是可以放大 public > protected > 默认 > private
public void show3(){
System.out.println("我是子类,我重写了show3方法");
}
}

public class Test {
public static void main(String[] args) {
person person = new person("汤姆");
Dog2 dog2 = new Dog2("小白");
Bone2 bone2 = new Bone2("骨头");
person.show4(dog2,bone2);
//解决:用到多态对象就完美的解决该问题喂食方法的重复问题
Cat2 cat2 = new Cat2("小花");
Bone2 bone3 = new Bone2("骨头");
person.show5(cat2,bone3);
}
}
//目的:让人去给动物喂食物
class Animal2{
private String name;
public Animal2(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class Fish2{
private String name;
public Fish2(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class Dog2 extends Animal2{
public Dog2(String name) {
super(name);
}
}
class Cat2 extends Animal2{
public Cat2(String name) {
super(name);
}
}
class Bone2 extends Fish2{
public Bone2(String name) {
super(name);
}
}
class person{
public person(String name) {
this.name = name;
}
private String name;//主人名称
//问题:如果我有一百种小动物,那我的喂食方法也需要写一百个吗
public void show4(Dog2 dog2,Bone2 bone2){ //喂食方法
System.out.println("主人"+name+"给"+dog2.getName()+"吃"+bone2.getName());
}
//解决:用到多态对象就完美的解决该问题
public void show5(Animal2 animal2,Fish2 fish2){ //喂食方法
System.out.println("主人"+name+"给"+animal2.getName()+"吃"+fish2.getName());
}
}
public class Test {
public static void main(String[] args) {
//普通继承 - 可以调用本身特有的成员,和父类中所有的成员(遵守访问权限)
Dog2 dog2 = new Dog2();
dog2.eat();//吃骨头
dog2.action();
dog2.show();
//多态向上转型 - 不能调用本身的特有成员,可以调用父类的所有成员(遵守访问权限)
//为什么不能调用本身特有成员? 因为在编译阶段,能调用哪些成员,是由编译类型决定(说白了就是加载编译类型的成员变量)
//Animal2是编译类型,Dog2是运行类型
//为什么animal2.eat();输出吃骨头不是吃东西? - 因为最终的的运行看子类的具体表现
//因为最终的的运行看子类的具体表现什么意思? - 调用成员时还是按子类向父类的向上查找
Animal2 animal2 = new Dog2();
animal2.eat();//吃骨头
}
}
class Animal2{
public void eat(){
System.out.println("吃东西");
}
public void action(){
System.out.println("撒娇");
}
}
class Dog2 extends Animal2{
public void eat(){
System.out.println("吃骨头");
}
public void show(){
System.out.println("展示才艺");
}
}
什么是向下转型? 把父类的的引用强转,为编译类型是子类的对象( 如:Dog dog = (Dog)animal )
细节:
只能强转父类的引用,终于不是父类的对象
强转的父类引用必须是和当前对象有关联的
向下转型后,可以调用子类中所有的成员
Animal2 animal2 = new Dog2();
animal2.eat();//吃骨头
//多态的向下转型 - 强转需要保持关联性
//当初是Dog2向上转型为父类的animal2,那么向下转型也要保持这个关系
Dog2 dog3 = (Dog2) animal2;
og3.show();
public class Test {
public static void main(String[] args) {
A a = new B();
System.out.println(a.name);//MIUI
B b = new B();
System.out.println(b.name);//Huawei
}
}
class A{
public String name = "MIUI";
}
class B extends A{
public String name = "Huawei";
}
用与判断对象的运行类型是否为XX类型或XX类型的子类型
public class Test {
public static void main(String[] args) {
A a = new A();
System.out.println(a instanceof A);//真
A a2 = new B();
B b = new B();
System.out.println(b instanceof A);//真
}
}
class A{
public String name = "MIUI";
}
class B extends A{
public String name = "Huawei";
}
public class Test {
public static void main(String[] args) {
A a = new B();
//没有把B类中的sum()方法注销时的输出结果
System.out.println(a.sum());//220
System.out.println(a.sum1());//210
//把B类中的sum()方法注销后输出的结果
//为什么是210? 因为地态绑定机制的原因,调用到getl()时就回到运行类型的调用,没有该方法在往上寻找
System.out.println(a.sum());//210
System.out.println(a.sum1());//210
}
}
class A{
public int a = 100;
public int sum(){
return getl() + 10;
}
public int sum1(){
return a + 10;
}
public int getl(){
return a;
}
}
class B extends A{
public int a = 200;
// public int sum(){
// return a + 20;
// }
public int sum1(){
return a + 10;
}
public int getl(){
return a;
}
}
public class Test {
public static void main(String[] args) {
Person[] person = new Person[5];
person[0] = new Student("小白",18,"学生");
person[1] = new Teacher("老王",32,"老师");
for (int i = 0; i < person.length; i++) {
//show方法是重写的 - 但运行结果是根据运行类型
if(person[i] != null){
String show = person[i].show();
System.out.println(show);
//向下转型,调用特有的成员
if(person[i] instanceof Student){
System.out.println(((Student)person[i]).study());
}
if(person[i] instanceof Teacher){
System.out.println(((Teacher)person[i]).teach());
}
}
}
}
}
class Person{
public Person(String name, int age) {
this.name = name;
this.age = age;
}
private String name;
private int age;
public String show(){
return name+"-"+age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
class Student extends Person{
public Student(String name, int age, String job) {
super(name, age);
this.job = job;
}
private String job;
public String show(){
return super.show()+"-"+job;
}
public String study(){
return super.getName()+"在收听java";
}
}
class Teacher extends Person{
public Teacher(String name, int age, String job) {
super(name, age);
this.job = job;
}
private String job;
public String show(){
return super.show()+"-"+job;
}
public String teach(){
return super.getName()+"给学生将java";
}
}
equlas:是Object类中的方法,默认(没被重写时)是判断引用类型的地址是否相等,子类往往重写该方法用与判断内容是否相等(如String和Integer)
一般 equals 和 == 会进行一个比较(面试):
== :是一个比较运算符
== :即可以判断该基本数据类型,又可以判引用类型
==:判断基本数据类型判断该的值,判断的是引用类型判断该的是地址
重写equals方法:
public class Test {
public static void main(String[] args) {
Person person1 = new Person("小白",18,'男');
Person person = new Person("小白",18,'男');
// System.out.println(person1.equals(person));//false(没有重写equals默认比较地址)
System.out.println(person1.equals(person));//true(重写equals后)
}
}
class Person{
public Person(String name, int age, char sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
String name;
int age;
char sex;
public boolean equals(Object obj) {
//this代表的就是obj(自己调用我自己)
if(this == obj){
return true;
}
if(obj instanceof Person){
Person p = (Person)obj;
return this.name == p.name && this.age == p.age && this.sex == p.sex;
}
return false;
}
}
public class Test {
public static void main(String[] args) {
Person person1 = new Person("小白");
Person person2 = new Person("小红");
System.out.println(person1.hashCode());//356573597
System.out.println(person2.hashCode());//1735600054
}
}
class Person{
public Person(String name) {
this.name = name;
}
String name;
public class Test {
public static void main(String[] args) {
Person person1 = new Person("小白","打游戏");
// System.out.println(person1.toString());//默认输出
System.out.println(person1);//重写输出:Person{name='小白', hobby='打游戏'}
}
}
class Person{
public Person(String name, String hobby) {
this.name = name;
this.hobby = hobby;
}
String name;
String hobby;
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", hobby='" + hobby + '\'' +
'}';
}
}
finalize方法:
finalize方法是做什么的? 当对象被回收时,系统自动调用该方法(注意不是该方法用来回收对象,而是在被回收前做一些操作)
什么时候被回收?当对象没有引用指向它时,jvm认为该对象就是一个垃圾对象,就会使用垃圾回收机制来销毁该对象,在销毁前会调用finalize方法
垃圾回收机制?是由GC算法来决定(也就是说对象没引用的时候就马上销毁,而是由GC算法决定的),但是可以通过System.gc();来主动触发垃圾回收机制
public class Test {
public static void main(String[] args) {
BaoMa baoMa = new BaoMa("宝马");
baoMa = null;
System.gc();//主动调用垃圾回收机制
System.out.println("程序退出");
}
}
class BaoMa{
public BaoMa(String name) {
this.name = name;
}
String name;
@Override
protected void finalize() throws Throwable {
System.out.println("销毁汽车"+name);
System.out.println("释放资源");
}
}


总的来说,我对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