java随笔三:class

一.对象与对象引用

class A{}

A pa = new A();

差不多就是A *pa = new A();显然new的是对象,pa是引用(Java毙了指针,把他换个名字叫引用)。

二.对象作为参数传递的特点

#include<iostream>
#include<algorithm>
#include<stack>
#include<queue>
#include<vector>
#include<map>
#include<cstring>
#include<string>
#include<cmath>
#include<set>
#define ll long long
using namespace std;
class A
{
public:int a;
};
A *build()
{A *b = new A();b->a = 1;return b;
}
int main()
{A *c = build();cout<<c->a<<endl;
}
class A
{int a;
}
public class test
{public static A build(){A b = new A();b.a = 1;return b;}public static void main(String[] args){ A c = build();System.out.println(c.a);}
}

不能说十分相像,只能说基本一样2333。

(据说气势磅礴的头文件能使编程水平上升)

三.对象初始化顺序

3.1.默认初始化

3.2.定义初始化

3.3.构造初始化

四.static

有什么可说的呢。

这跟c++基本上一毛一样。

还有说实话那个什么static代码块和直接在外面写有什么区别吗?

#include<iostream>
#include<algorithm>
#include<stack>
#include<queue>
#include<vector>
#include<map>
#include<cstring>
#include<string>
#include<cmath>
#include<set>
#define ll long long
#define LoveLivesuperstar  cout<<"药药,切克闹,唐可可我最闪耀!!!"<<endl;
using namespace std;
class A
{
public:int a;static int b;A(){a = 0;b++;}/*static{cout<<"药药,切克闹,唐可可我最闪耀!!!"<<endl;}*///c++只能通过宏定义来实现static void call(){cout<<"\t\tTerrorist win!"<<endl;cout<<"ez4ence,ence,ence,dens,"<<"puttted upperbelt,"<<"puttted upperbelt!!!"<<endl;}
};
int A::b = 0;
int main()
{LoveLivesuperstarA a1,a2;cout<<a1.b<<endl;a1.call();
}​
class A
{int a;static int b;public A(){b++;}static{System.out.print("煎饼果子来一套,坚持练习不迟到!");System.out.println("动次打次~动次打次~动次打次~动次打次~!");}static void call(){System.out.println("\t\t Terrorist win!");System.out.println("are you mad er?             why you mad bruh ?");}
}
public class test
{public static void main(String[] args){ A a1 = new A(),a2 = new A();System.out.println(A.b);A.call();}
}

五.final

1.在成员上相当于const;

2.在方法上不相当于const;const在c++不能阻止复写与重载的发生。但是c++虚函数可以用override和final阻止复写。c++11及其之后的c++满足这样的需求。

c++虚函数重载报错1

class A
{
public:virtual void fun(int) = 0;
};
class B:public A
{
public:virtual void fun(){cout<<1<<endl;}
};
int main()
{B b1;b1.fun();
}

此时,由于A,B的fun()参数不同,B的fun相当于一个新的虚函数,B是虚基类,不能实例化,报错。

c++虚函数重载bug2

class A
{
public:virtual void fun() = 0;
};
class B:public A
{
public:virtual void fun(){cout<<1<<endl;}
};
int main()
{B b1;b1.fun();
}

此时,我们并不知道B的fun究竟是由于名字重复导致不小心重载了虚函数,还是B的fun真的要重载虚函数(默认后者!!!)。

对于报错1,加上override后

class A
{
public:virtual void fun(int) = 0;
};
class B:public A
{
public:virtual void fun() override{cout<<1<<endl;}
};
int main()
{B b1;b1.fun();
}

报错如下

C:\Users\asus\Desktop\Untitled2.cpp|21|error: 'virtual void B::fun()' marked 'override', but does not override

指出你标记了复写但是没有复写,啊哈哈哈。

对于2,加入final

class A
{
public:virtual void fun(int) = 0;
};
class B:public A
{
public:virtual void fun(int) final{cout<<1<<endl;}
};
class C:public B
{
public:virtual void fun(int){cout<<"fuck!"<<endl;}
};

报错如下:

C:\Users\asus\Desktop\Untitled2.cpp|29|error: virtual function 'virtual void C::fun(int)' overriding final function

C复写了最终函数fun(int)

啊哈哈哈

class A
{
public:virtual void fun(int) = 0;
};
class B final:public A
{
public:virtual void fun(int){cout<<1<<endl;}
};
class C:public B
{
public:virtual void fun(int){cout<<"fuck!"<<endl;}
};

报错:

C:\Users\asus\Desktop\Untitled2.cpp|26|error: cannot derive from 'final' base 'B' in derived type 'C'

关于重载(overload),重写(override,也称覆盖), 重定义(redefine,也称隐藏):

一、重载(overload)
指函数名相同,但是它的参数表列个数或顺序,类型不同。但是不能靠返回类型来判断。
(1)相同的范围(在同一个作用域中) ;
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无。
(5)返回值可以不同;

二、重写(也称为覆盖 override)
是指派生类重新定义基类的虚函数,特征是:
(1)不在同一个作用域(分别位于派生类与基类) ;
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有 virtual 关键字,不能有 static 。
(5)返回值相同(或是协变),否则报错;<—-协变这个概念我也是第一次才知道…

(6)重写函数的访问修饰符可以不同。尽管 virtual 是 private 的,派生类中重写改写为 public,protected 也是可以的

所以,基本上可以说重载是更广义的复写,因此不再区分重载与复写的区别,一律重载。

三、重定义(也成隐藏)
(1)不在同一个作用域(分别位于派生类与基类) ;
(2)函数名字相同;
(3)返回值可以不同;
(4)参数不同。此时,不论有无 virtual 关键字,基类的函数将被隐藏(注意别与重载以及覆盖混淆) 。
(5)参数相同,但是基类函数没有 virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆) 。

其实就是覆盖了基类的函数。

(啥?你问我java的final咋弄?)

public:
const ....等价于public final ...public:
void fun(...) final等价于
public final void fun(...)class A final{...};
class A final :public ...{};等价于
final class A{...}
final class A extend ...{...}

(举例?就不举。明白事理远比写一堆没啥意思的测试代码有用)

六.float[10] arr;

首先,c++这样就不行。

报错一长串

java报错:Syntax error on token "10", delete this token

因为java不知道发什么疯把数组也弄成了一个类。联想到java左边的变量名类似于指针,显然c++没有这么玩指针的。因为读到10时为自动寻址,但是此时还没初始化呢,哪来的地址。

所以这两个在我看来其实差不多。

public static void main(String[] args){ float[] arr;arr = new float[]{1,2,3,4,5,6,7};for (int i = 0; i < arr.length; i++){System.out.println(arr[i]);} }
#include<iostream>
#include<algorithm>
#include<stack>
#include<queue>
#include<vector>
#include<map>
#include<cstring>
#include<string>
#include<cmath>
#include<set>
#define ll long long
using namespace std;
int main()
{float *arr;arr = new float[10];for(int i = 0;i<10;i++){*(arr+i) = i;cout<<*(arr+i)<<" ";}
}

至于数组元素时基本类型和引用类型的区别嘛,差不多就是一般数组和指针数组的区别。由于Java在代码表现上基本不能明显区分引用和实例,从代码上看差距不大,但原理差不多应该就是一般和指针的区别。

七. java 访问控制符

public,protect,private,default(包访问权限);

private :private。

default:包内为public,包外为private。

protected :包内public,包外的子类public,其余private

public:public

注意,不要闲着没事不写关键字,因为c++默认private,java默认同一package内所有成员开放,python在变量名上做文章确定权限。规范化描述不至于把自己写懵。(我自己的习惯)有必要开放就声明开放,没必要就声明不开放,包访问变量应该尽早声明。private与protected要细细思索应不应该给子类开放。

八.子类对父类属性与方法的继承。

参照上文,按照子类与父类在不在一个package内分类就行。

九。组合,重载,复写

类的组合:


class points
{private int x, y;points(){x = 0;y = 0;}points(int x,int y){this.x = x;this.y = y;}int Getx() {return x;}int Gety() {return y;}
}
class lines
{private points l,r;lines(){this.l = new points();this.r = new points();}lines(int a,int b,int c,int d){this.l = new points(a,b);this.r = new points(c,d);}void show(){System.out.println("l: ("+l.Getx()+","+l.Gety()+")");System.out.println("r: ("+r.Getx()+","+r.Gety()+")");}
}
public class test
{public static void main(String[] args){lines a = new lines(1,2,3,4);a.show();}
}

类套类,只需要调用类的部分方法即可,相当与类指针。

class point
{
private:int x,y;
public:point(){x = y = 0;}point(int x,int y){this->x = x;this->y = y;}int Getx(){return this->x;}int Gety(){return this->y;}
};
class lines
{
private:point *l,*r;
public:lines(){l = new point();r = new point();}lines(int a,int b,int c,int d){l = new point(a,b);r = new point(c,d);}void show(){cout<<"l:("<<l->Getx()<<","<<l->Gety()<<")"<<endl;cout<<"r:("<<r->Getx()<<","<<r->Gety()<<")"<<endl;}
};
int main()
{lines *a = new lines(1,2,3,4);a->show();return 0;
}

几乎一样哈。

至于重载与复写,我记得写过了,似乎就在上面。


class points
{private int x, y;points(){x = 0;y = 0;}points(int x,int y){this.x = x;this.y = y;}int Getx() {return x;}int Gety() {return y;}
}
class lines
{private points l,r;lines(){this.l = new points();this.r = new points();}lines(int a,int b,int c,int d){this.l = new points(a,b);this.r = new points(c,d);}void show(){System.out.println("l: ("+l.Getx()+","+l.Gety()+")");System.out.println("r: ("+r.Getx()+","+r.Gety()+")");}//void Getx() {System.out.println(l.Getx()+" "+r.Getx());}//void Gety(){System.out.println(l.Gety()+" "+r.Gety());}//重载int Gety(){return Math.abs(r.Gety()-l.Gety());}int Getx(){return Math.abs(r.Getx()-l.Getx());}//复写
}
public class test
{public static void main(String[] args){lines a = new lines(1,2,3,4);a.show();System.out.println(a.Getx()+" "+a.Gety());}
}

十. 子类实例化

(这玩意在一堆乱七八糟得东西里跳了好久,我受不了了啊啊啊啊啊啊!!!!!!!!!)

差不多就是执行初始化->执行子类构造->进入父类初始化->执行父类构造->执行父类剩余->执行子类剩余。

代码就不贴了

十一.互发消息

class A
{int a = 0;B b;boolean c = false;A(){a = 0;this.b = null;}A(B b){a = 0;this.b = b;b.a = this;}void show(){if(c==true){c = false;return;}else if(b!=null){System.out.println("A:hey B!");if(b.c==true){b.c = false;return ;}c = true;b.show();}else{System.out.println("not connected");}}
}
class B
{int b = 0;A a;boolean c = false;B(){b = 0;this.a = null;}B(A a){b = 0;this.a = a;this.a.b = this;}void show(){if(c==true){c = false;return;}else if(a!=null){System.out.println("B:hey A!");if(a.c==true){a.c = false;return;}c = true;a.show();}else{System.out.println("not connected");}}
}
public class test
{public static void main(String[] args){//B b = new B();//A a = new A(b);A a = new A();B b = new B(a);//A a = new A();//B b = new B();System.out.println("A first:");a.show();System.out.println("B first:");b.show();}
}

前俩组输出一致,第三组会报not connected。

十二.组合与继承

组合相当于类中加引用类(指针),相当于friend。继承相当于继承父类的方法,相当于is a。

当类之间有联系但是差别过大时(比如鸟和飞机,除了会飞之外差距蛮大的),两者需要互动(鸟撞飞机,飞机躲避鸟),显然适合使用组合(飞机类里准备鸟的动态数组即可)。但是如果是有明显的子集关系(鸟和兀鹫之间),显然适合于继承的使用。

十三.java多态。

多态:父类的对象变量调用了子类中重写的方法。

abstract class base
{String name = null;base(){name = null;}public abstract void show();
}
class dog extends base
{String habit = "chase cat";dog(String name){super();this.name = name;}public void show(){System.out.println(name+" likes "+habit);}
}
class cat extends base
{String habit = "miao~";cat(String name){super();this.name = name;}public void show(){System.out.println(name+" likes "+habit);}
}
public class test
{public static void main(String[] args){base a = new cat("kitty");base b = new dog("spikes");a.show();b.show();}
}

输出是很显然的。

abstract class base
{String name = null;base(){name = null;}public abstract void show();
}
class dog extends base
{String habit = "chase cat";dog(String name){super();this.name = name;}public void show(){System.out.println(name+" likes "+habit);}public void bomb(){System.out.println(name+" is setting the bomb");}
}
class cat extends base
{String habit = "miao~";cat(String name){super();this.name = name;}public void show(){System.out.println(name+" likes "+habit);}
}
public class test
{public static void main(String[] args){base a = new cat("kitty");base b = new dog("spikes");a.show();b.bomb();b.show();}
}

这里仅仅加了一个专属dog的方法bomb,但是此时base引用无法调用子类dog特有的方法,报错显示base类未定义bomb方法。显然,通过调用父类的引用可以定向取用子类中重写父类的方法。但是不能取子类独有的方法。显然在代码层面无法确定父类引用会调用具体的那个方法,仅当运行时根据后面的具体对象进行动态绑定。

((dog)b).bomb();

神奇的是,对b进行向下转型后就可以用了,原因是此时b仅绑定dog实例,且唯一确定。

更神奇的是

#include<iostream>
#include<algorithm>
#include<stack>
#include<queue>
#include<vector>
#include<map>
#include<cstring>
#include<string>
#include<cmath>
#include<set>
#define ll long long
#define LoveLivesuperstar  cout<<"药药,切克闹,唐可可我最闪耀!!!"<<endl;
using namespace std;
class A
{
public:string name;A(){name = "";}virtual void show() = 0;
};
class B:public A
{
public:string habit;B(){name = "";habit = "chase cat";}B(string s){name = s;habit = "chase cat";}void show(){cout<<this->name<<" likes "<<this->habit<<endl;}void run(){cout<<this->name<<" run!!!!"<<endl;}
};int main()
{A *a = new B("spike");a->show();((B*)(a))->run();return 0;
}

一模一样好吧,所以是谁抄谁的呢?

十四.interface

interface Shape
{abstract void count();abstract void show();
}
class A implements Shape
{int a,b,c,ans;A(){a = b = c = 0;ans = -1;}A(int a,int b,int c){this.a = a;this.b = b;this.c = c;ans = -1;}@Overridepublic void count(){ans = a+b+c;}@Overridepublic void show(){System.out.print(a+","+b+","+c);if(ans != -1){System.out.print(","+ans);}System.out.println();}
}
class B implements Shape
{int a,b,ans;B(){a = b = 0;ans = -1;}B(int a,int b){this.a = a;this.b = b;ans = -1;}@Overridepublic void count(){ans = a+b;}@Overridepublic void show(){System.out.print(a+","+b);if(ans != -1){System.out.print(","+ans);}System.out.println();}public void change(int c){a = c;ans = -1;}
}
public class test
{public static void main(String[] args){Shape test1 = new A(1,2,3);Shape test2 = new B(1,2);B test3 = new B();test1.count();test1.show();test2.count();test2.show();//test2.change();((B)(test2)).change(1);test3.show();test3.change(1);}
}

对于接口,就是一个纯粹的不能再纯粹的虚方法与静态成员及其方法的类,即虚方法与静态成员及其方法的集合。更像是一种啥具体的东西都没有的模板,需要自行继承,复写与填充特殊方法才能成型。在代码上和抽象类很像,甚至连向下转型都一样。

但是,抽象类存在非静态数据成员与方法,接口显然不可以有。实际上抽象类就是一个类,但是可以有自己的方法。同时,接口必须public,抽象类无所谓。抽象类接近is a,接口接近like a。

自不必说,上c++

#include<iostream>
#include<algorithm>
#include<stack>
#include<queue>
#include<vector>
#include<map>
#include<cstring>
#include<string>
#include<cmath>
#include<set>
#define ll long long
#define LoveLivesuperstar  cout<<"药药,切克闹,唐可可我最闪耀!!!"<<endl;
using namespace std;
class A
{
public:virtual void counts() = 0;virtual void show() = 0;
};
class B:public A
{
public:int a,b,c,ans;B(){a = b = c = 0;ans = -1;}B(int a,int b,int c){this->a = a;this->b = b;this->c = c;ans = -1;}void counts(){ans = a+b+c;}void show(){cout<<a<<","<<b<<","<<c<<endl;if(ans!=-1){cout<<ans<<endl;}}void another_show(){cout<<"啊哈哈哈哈哈哈"<<endl;}
};int main()
{A *a = new B(1,2,3);a->counts();a->show();((B*)(a))->another_show();return 0;
}

所以还是那个问题,谁抄谁的呢?

十五.equals

equals方法一般是判断两个引用是不是指向同一个对象,但是经过复写,往往变成比较内容是否一致。

相当于c++在使用指针或者一些大数组等情况时重载=与==与!=。

class A
{int b =0;A(int a){this.b = a;}boolean equals(A b){if(this.b != b.b){return true;}return false;}
}
public class test
{public static void main(String[] args){A a1 = new A(1);A a2 = a1;A a3 = new A(1);System.out.println(a1.equals(a2)+" "+a1.equals(a3)+" "+a2.equals(a3));}
}

应该输出三个false,我故意的。

上c++

c++不能用指针重载,只能用实例的引用以友元函数重载/在类内重载,对比意义不大,不写了。

十六。instanceof

instanceof是Java中的二元运算符,左边是对象,右边是类;当对象是右边类或子类所创建对象时,返回true;否则,返回false。

应用场景,上面的向下转型。

abstract class base
{String name = null;base(){name = null;}public abstract void show();
}
class dog extends base
{String habit = "chase cat";dog(String name){super();this.name = name;}public void show(){System.out.println(name+" likes "+habit);}public void bomb(){System.out.println(name+" is setting the bomb");}
}
class cat extends base
{String habit = "miao~";cat(String name){super();this.name = name;}public void show(){System.out.println(name+" likes "+habit);}
}
public class test
{public static void main(String[] args){base a = new cat("kitty");base b = new dog("spikes");a.show();if(b instanceof dog){dog c = (dog)b;c.bomb();}b.show();}
}

这样就不会有问题了呢

十七.抽象类与接口的异同

好像写过了呢。

java随笔三,真正的class大总结相关推荐

  1. Java程序员日常积累-向大神学习(三)

    前言 <Java程序员日常积累-向大神学习>系列是本人根据日常工作中碰到的问题写的一个问题记录,比较琐碎零散. 主要用于记录和忘记时可以有个地方查询.现分享给大家,这是这个系列的第三篇. ...

  2. java多线程三之线程协作与通信实例

    多线程的难点主要就是多线程通信协作这一块了,前面笔记二中提到了常见的同步方法,这里主要是进行实例学习了,今天总结了一下3个实例: 1.银行存款与提款多线程实现,使用Lock锁和条件Condition. ...

  3. 你所需要的java基础篇和提升篇大总结

    好好学java 致力于java知识分享 关注 精彩内容 你所需要的java全套视频教程 你所需要的java电子图书 你所需要的大数据视频教程 你所需要的java练习项目 如 / 诗 近半个月,每天一篇 ...

  4. Java初学者需掌握的4大核心基础知识

    Java人才需求量一直是居高不下,Java一直霸主流行编程语言排行榜,这使得大家对学Java有前途,一致成赞同的态度,使得涌入Java行业的朋友是越来越多,只为谋个好前程.但由于Java语言没有这么强 ...

  5. Java开发人员必备的7大技能,每一个都必不可少

    Java存活这么多年,目前Java软件开发工程师已经成为"香饽饽"了,工作环境好,就业薪资高,成为很多门外汉羡慕的对象,确实Java已经成为比较受欢迎的编程语言.可以说当下Java ...

  6. 初学者学习java编程,如何顺利通过4大艰难阶段?

    有人通过Java培训班获得了年薪几十万的逆袭,也有人通过Java培训班体会到了"学习java有多难"的滋味.无论是哪种收获,都与我们突破每一个阶段的方法有关. 整个过程看似艰难,但 ...

  7. 学习Java的三十三个建议

    学习Java的三十三个建议 1把Java当成一门新的语言学习(和C++差别很大,真的,我觉得和Delphi的Object Pas cal反而更像一点): 2看<Thinking in Java& ...

  8. java语言的三个版本是_Java是一个全面且功能强大的语言,可用于多种用途。Java有三个版本分别是:_学小易找答案...

    [单选题]电路如图所示,电路中包含的网孔个数为( ). [单选题]各点电位的高低是()的,而两点之间的电压值是()的. [单选题]研究发现,影响睡眠障碍的生物学因素与非生物学因素(). [单选题]1 ...

  9. Java小程序之球球大作战(基于Java线程实现)

    Java小程序之球球大作战(基于Java线程实现) 一.游戏基本功能: 1.自己的小球可以随着鼠标的移动而改变坐标: 2.敌方小球不断的在界面中移动 3.当检测到敌方小球相互碰撞时,小球会弹开 4.当 ...

最新文章

  1. 邻域数、直接密度可达、密度可达、密度相连的概念
  2. python的lambda表达式是什么?什么是回调函数?
  3. Tensorflow— word2vec
  4. 电脑上的c语言程序打不开,电脑软件打不开常用处理方法
  5. linux下的bc计算器设置scale精度
  6. html 轮播 平移,网站轮播图的实现-平移版
  7. License for package Android SDK Build-Tools 28.0.2 not accepted.(MAC)
  8. 高阶函数 map,reduce, filter的用法
  9. 学会提问-批判性思维指南运用
  10. jvm之可达性分析算法
  11. java socket连接池_Java - Socket连接池
  12. TCP/IP协议都有哪几层协议
  13. 什么是Apache APR
  14. Aptana工具介绍
  15. 计算广告(五):搜索与竞价广告
  16. DINO:自监督ViT的新特性
  17. 禁止非法root的设备OTA升级
  18. 【map】高德地图点聚合—按索引聚合
  19. 在外企上班是一种什么体验?附国内热门外企公司名单!
  20. 英语学习的方法(1)

热门文章

  1. 多元伯努利分布 multivariate bernoulli distribution
  2. 最全的TypeScript学习指南
  3. 常见浏览器清理缓存方法
  4. 优麒麟linux共享文件夹,循序而渐进,熟读而精思——优麒麟文件管理器篇
  5. 系统设计综述——个人思考总结
  6. Cross Stage Partial Network(CSPNet)
  7. nginx配置文件映射外网服务器
  8. python批量修改列名_pandas修改DataFrame列名的实现方法
  9. Floorplan命令全集
  10. 中国企业软件必然革命世界企业软件