java----面对对象
对象被创建的步骤
1.分配对象空间,并将对象成员变量初始化为0或空
2.执行属性值的显式初始化
3.执行构造方法(此时的对象已经被创建,我们可以在这一步对对象进行进一步的初始化工作)
4.返回对象的地址给相关的变量
面对对象:
public class Demo {
public static void main(String[] args){
Horse h = null;
h = new Horse();
// h.name = "dd";
h.eat();
h = null; //释放对象
}
} class Horse{
String name;
public void eat(){
System.out.println(name);
} }
封装性:
public class Demo {
public static void main(String[] args){
Horse h1 = new Horse();
// h1.name = "小明";//由于 name设置了私有字段,此时在给对象赋值,会报错;
h1.setName("小明");
System.out.println(h1.getName());
}
}
class Horse{
//属性的封装
private String name;
private int age; //成员变量,在类中定义,在堆内存,对象清空,则成员变量清空,有默认初始值,像String引用变量初始值为null,int的初始值为0;
public void setName(String name){ //参数也是局部变量
int a = 111; //局部变量;在方法中定义,在栈内存,方法调用完毕,就清空,没有初始值,必须定义,赋值后,才能调用。
this.name = name;
}
public String getName(){
// return name;
return this.name; // 可以使用this调用其他方法和属性,this可以省略,this前面可以加上类名 Horse.this.name();
}
}
构造方法和构造方法的重载:
类似python中的__init__(self){}
public class Demo {
public static void main(String[] args){
Horse h = new Horse();
Horse h2 = new Horse(1);
}
}
class Horse{
public Horse(){ //方法名称和类名相同,没有返回值
System.out.println("我是构造方法");
}
public Horse(int a){
System.out.println("a="+a);
}
}
构造方法之间的调用,用this()
public class Demo {
public static void main(String[] args){
Horse h2 = new Horse(1);
}
}
class Horse{
public Horse(){ //默认构造方法,可以保留
}
public Horse(String b){ //方法名称和类名相同,没有返回值
System.out.println(b);
}
public Horse(int a){
this("11"); //调用另一个构造方法,注意,这条语句,只能放在最前面,否则报错;,限制了,不能调用多个;
this("22"); //报错,只能调用一个
System.out.println("a="+a);
}
}
对象之间的关联:
public class Demo {
public static void main(String[] args){
Hero hero1 = new Hero("刘备");
Weapon weapon1 = new Weapon("双股剑"); hero1.setWeapon(weapon1);//将对象传递给一个对象,实现对象之间的关联 System.out.println(hero1.getWeapon().getName()); }
}
class Hero{
//属性的封装
private String name;
private Weapon weapon; public Hero(String name){
this.name = name;
} public void setWeapon(Weapon weapon){
this.weapon = weapon;
}
public Weapon getWeapon(){
return this.weapon;
}
}
class Weapon{
private Hero hero;
private String name;
public Weapon(String name){
this.name = name;
}
public void setHero(Hero hero){
this.hero = hero;
}
public String getName(){
return this.name;
}
}
继承:
方法的重载:发生在同一个类中,函数名相同,参数列表不相同,与返回值返回值(类型)无关;
方法的重写:发生在继承的关系中,函数名相同,参数列表相同,返回值(类型)需要相同。子类的访问修饰符需要大于或者等于父类的访问修饰符,子类的异常声明要小于或等于父类的异常声明,如果方法被private 、static修饰,那么方法不能被继承/重写。 final修饰,只能继承,不能重写
public class Demo {
public static void main(String[] args){
Dog dog = new Dog(); //子类创建对象时 ,也会 自动 调用父类的默认的构造方法
System.out.println(dog.name);
dog.print();
}
} class Animal{
protected String name = "动物";
public Animal(){
System.out.println("我是Animil 默认构造方法");
}
public Animal(String name){
System.out.print("我是Animial 传参构造方法");
}
public void print(){
System.out.println("Animal");
}
}
class Dog extends Animal{ //继承的写法
public Dog(){
super("传值"); //如果有super,就会继承super所指的构造方法,具体执行那一个,看传参的列表
// super(); //如果没有传值,就会执行父类的默认的构造方法,前提父类必须保留默认的构造方法;
//注意1:默认情况下,会自动添加super(),如果自己写了super,就会覆盖默认的
//注意2:super(),只能方法最开始的位置
}
public void print(){
super.print(); //继承父类的方法;
System.out.println("Dog");
}
}
抽象类:
1、抽象类可以没有抽象方法,有抽象方法的一定是抽象类
2、非抽象类继承抽象类必须实现所有的抽象方法
3、抽象类可以继承抽象类,可以不实现父类的抽象方法
4、抽象类可以有方法实现和属性
5、抽象类不能被实例化
6、抽象类不能声明final
7、抽象类可以有构造方法
public class Demo {
public static void main(String[] args){
Dog dog = new Dog();
}
} abstract class Animal{ //声明该类是一个抽象类,只能继承,不能实例化
{
System.out.println("可以有构造方法");
}
public abstract void eat(); //可以没有抽象方法 ,如果有了抽象方法,该类必须是抽象类,并且该抽象方法必须子类实现;
public void run(){ //普通的方法可以不用被实现
System.out.print("我可以跑");
}
} class Dog extends Animal{
public void eat(){ }
}
接口:
1、抽象类实现接口,可以不实现接口的方法,非抽象类,必须实现接口的所有的方法;
2、接口的方法没有声明访问修饰符,默认为public
3、接口不能有构造方法,接口不能被实例化
4、接口之间的继承用extends ,定义接口用interface ,类实现接口用implements
5、接口只能定义常量,抽象方法,(jdk1.8之后有默认的实现方法,和静态方法)
6、final不可以修饰接口
public class Demo {
public static void main(String[] args){
Person person = new Person();
person.print(); //默认的方法实现;
}
} interface IEat{
// public abstract void eat();
void eat(); //简写,定义抽象方法 // public final static int NUM = 10;
int NUM = 10; //简写,定义常量 public default void print(){
System.out.println("默认方法实现"); //jdk1.8之后有 默认方法实现(加上default),不能有其他的方法实现
}
}
interface ISleep{
void sleep();
}
interface IRun extends IEat,ISleep{ //接口可以有多继承
void run();
} class Person implements IRun,ISleep{ //接口的实现,类可以继承多个接口(不是接口的继承)
public void sleep(){} //必须实现接口的所有的方法
public void run(){}
public void eat(){} }
多态:
public class Demo {
public static void main(String[] args){
Chick smailchick = new SmailChick(); //用父类的引用指向子类对象,(用大的类型接受小的类型,向上转型,自动转换)
eat(smailchick); SmailChick smailchick2 = new SmailChick();
eat(smailchick2); Chick bigchick = new BigChick();
eat(bigchick);
}
public static void eat(Chick c){ //多态性,Chick可以接受比他小的或者等于他的类型,(例如int可以接受short类型)
c.eat();
// c.song(); //直接写会报错,原因Chick中没有song方法,在运行的时候,c才是所new的对象,在编译的时候c还是chick if(c instanceof BigChick){ //在转换之前做类型的判断
// BigChick bigchick = (BigChick)(c); //若果父类中没有定义song()方法,就需要 强制转换 将Chick转变成BigChick
// bigchick.song();
((BigChick)c).song(); //简写
}
}
} abstract class Chick{
public abstract void eat();
}
class SmailChick extends Chick{
public SmailChick(){
super();
}//默认自动添加
public void eat(){
System.out.println("我是小鸡,我爱吃米");
}
} class BigChick extends Chick{
public void eat(){
System.out.println("我是大鸡,我爱吃虫");
}
public void song(){
System.out.println("我是大鸡,我会唱歌");
}
}
this的本质
指明当前的对象,不能放到static静态方法中
class Test{
int a;
public Test(int a){
//给成员变量进行赋值
this.a = a;
}
public Test(){
//调用另一个构造方法,只能放在代码的第一行(所以只能有一个)
this(1);
}
}
java中的new到底为我们做了什么?
参考https://www.cnblogs.com/KingIceMou/p/7245446.html
String 中的hashcode()和equals()?
hashcode和equals都是为了对比两个对象是否相等一致,那么为什么会有两个呢?
hashcode()的判断是比较高效的,如果hashcode不一样那么这两个对象一定不相等。但是hashcode相等不能代表这两个对象一定相等,需要equals进行复杂的逻辑判断最终确定是否相等。所有我们在equals判断之前先判断hashcode是否相等可以一定程度提高效率,之后hashcode为了false,就可以不需要在判断equals了。
hashcode目的只是让一个对象只存在唯一的hashcode值,但是一个hashcode值可能会被多个对象共享。所以只要两个对象的hashcode值不相等,那他们对象肯定是不相等的。
这种大量的并且快速的对象对比一般使用的hash容器中,比如hashset,hashmap,hashtable等等,比如hashset里要求对象不能重复,则他内部必然要对添加进去的每个对象进行对比,而他的对比规则就是像上面说的那样,先hashCode(),如果hashCode()相同,再用equal()验证,如果hashCode()都不同,则肯定不同,这样对比的效率就很高了。
我们再来看看String中的hashcode和equals?
String重写了objdect中的hashcode()和equals()方法,所以这两个方法都可以用来判断字符串是否相等。只需要使用任意一个就可以判断?
new Object().equals(objdect)所有的类中默认的equals方法都是和"=="一样的效果,判断内存地址是否一样,只是String重写了equals。
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value; for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
public static void main(String[] args) {
StringBuilder stringBuilder = new StringBuilder("11");
System.out.println(stringBuilder.hashCode());
stringBuilder.append("1");
//比较的是内存地址
System.out.println(stringBuilder.hashCode()); String a = "a";
String b = "a";
System.out.println(a.hashCode()+"=="+b.hashCode()
);
补充
访问修饰符
java----面对对象的更多相关文章
- java 面对对象(抽象 继承 接口 多态)
什么是继承? 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可. 多个类可以称为子类,单独这个类称为父类.超类或者基类. 子类可以直接 ...
- java面对对象 关键字this super
this:this是指向对象本身的一个指针,成员函数内部指向当前类的对象 其实this主要要三种用法: 1.表示对当前对象的引用! 2.表示用类的成员变量,而非函数参数,注意在函数参数和成员变量同名是 ...
- java面对对象入门(4)-程序块初始化
Java实例初始化程序是在执行构造函数代码之前执行的代码块.每当我们创建一个新对象时,这些初始化程序就会运行. 1.实例初始化语法 用花括号创建实例初始化程序块.对象初始化语句写在括号内. publi ...
- java面对对象(六)--内部类、匿名内部类
内部类 可以在一个类的内部定义另一个类这种类成为内部类或嵌套类,比如: class Outer{ … class Inner{ …. } } class Outer1{} // 这个Inner1不是O ...
- JAVA面对对象(四)——抽象类
抽象类的作用类似“模板”,可以根据它的格式来修改.创建新的类:但是不能直接由抽象类创建对象只能通过抽象类派生出新的类,再由它来创建对象:抽象类的使用同样是单继承,即一个子类只能继承一个抽象类 抽象类的 ...
- JAVA面对对象(三)——Super、static、final关键字
Super 使用super关键字可以直接调用父类中的构造方法.属性.普通方法 super调用父类构造方法的操作,与this调用构造方法一样,语句必须放在子类构造方法的首行 public class P ...
- JAVA面对对象(二)——继承、方法的覆写
1.继承就是基于已存在的类构造一个新类,继承已存在的类就能复用类的方法和属性,并且能够添加新的方法和属性.也就是子类和父类 2.一个父类可以拥有多个子类,一个子类只允许有一个父类 3.用extends ...
- JAVA面对对象(一)——封装
1.封装思想:将对象的属性和行为封装起来的载体是类,类通常对客户隐藏其实现的细节 2.封装就是将属性私有化(private),并提供公共的方法(public)访问私有属性 3.通过封装,实现对属性数据 ...
- 20162319 实验二 Java面对对象程序设计 实验报告
实验二 Java面向对象程序设计 实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D原则 5.了解设计模式 实验 ...
- JAVA面对对象(五)——接口
接口由全局常量和公共的抽象方法组成,接口的定义格式: interface 接口名称{ 全局常量; 抽象方法; } 接口中的抽象方法必须定义为public访问权限,在接口中如果不写也默认是public访 ...
随机推荐
- Kotlin数据模型
Java中的常用的Bean类,每一个变量我们都需要写getter,setter方法,却都要手动实现很多方法: 尽管可以用工具帮我们完成,但是代码显得很臃肿,不灵活. 特别是当我们需改其中某一个成员的时 ...
- sublime text 3 左侧目录树中文文件夹显示方框问题解决
0 - 解决方法 打开Preferences->Settings 在弹出的Settings对话框中,加入"dpi_scale": 1.0 重新启动sublime text 3 ...
- python,<一>读取文件open()
在实际操作中,我们经常会读取文件,这个时候python为我们提供了一个open()的方法,供我们读取文件,通过help(open),我们可以获取open的方法 f.close()关闭读取 f.read ...
- Latex 问题解决
1. 当bib文件中包含待引用的参考文献,并且在tex中正常通过\cite{}引用,却依然提示citation undefined,pdf中显示问号时,怎么解决报错. 解决:删除根目录下的 .bbl ...
- hdfs命令get或者put提示找不到目录或文件
今天用hdfs命令出现个诡异情况: hadoop fs -put a.txt /user/root/ put: `a.txt': No such file or directory 用get命令存在相 ...
- 组合权限查询 SQL,UniGUI
组合权限查询 SQL,UniGUI: name ,View, New, Edit, Dele 表 获取 name 的 授权. 项目 1 0 0 ...
- 数据库的OLE字段写入长二进制文件
//'*************************************************************************************** //'函数:将数据 ...
- 【转】Java并发编程:同步容器
为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器.并发容器.阻塞队列.Synchronizer(比如CountDownLatch).今天我们就来讨论下同步容器. ...
- Select查询命令
一开始SELECT查询的命令为 SELECT * FROM employee; SELECT 要查询的列名 FROM 表名字 WHERE 限制条件; 若要查询所有内容,就用*代 ...
- 【原创】大数据基础之Kerberos(2)hive impala hdfs访问
1 hive # kadmin.local -q 'ktadd -k /tmp/hive3.keytab -norandkey hive/server03@TEST.COM'# kinit -kt / ...