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访 ...
 
随机推荐
- java 基础 字符类型
			
1.char类型的字面量可以是一个英文字母.字符或一个汉字,并且由单引号包括. 2.Java底层使用一个16位的整数来处理字符类型,该数值是一个字符的unicode编码值. unicode: 1.un ...
 - Linux 01 计算机系统硬件组成简介
			
PC服务器 1U = 4.445cm 企业1-2U比较多 互联网公司,品牌 DELL,HP, IBM. Dell品牌 2010年之前:1850,1950(1u),2850,2950(2u) 2010年 ...
 - 架构学习之高性能NoSQL
			
关于NoSQL,看过一张图,挺形象:“1970,We have no SQL”->“1980,Know SQL”->“2000,NoSQL”->“2005,Not only SQL” ...
 - C - Boss Gym - 101473C (模拟)
			
题目链接:https://cn.vjudge.net/contest/287775#problem/C 题目大意:给你n个人,然后m条关系,会有k次询问,每一次询问包括两种类型,第一种类型是交换两个人 ...
 - Java 进制间的转换
			
package com.touch.onlinedu; public class Test { public static void main(String[] args) { // 1 : 0001 ...
 - CF1098B/CF1099E Nice table
			
题目地址:CF1098B/CF1099E Nice table 显然,a nice table需要满足如下条件: 要么,每行都由两个字符交替组成,相邻两行的字符均不相同 要么,每列都由两个字符交替组成 ...
 - MOOC Linux内核之旅小结【转】
			
转自:https://blog.csdn.net/titer1/article/details/45345123 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csd ...
 - Windows PowerShell 入門(6)-関数編1
			
この連載では.Microsoftが提供している新しいシェル.Windows Power Shellの使い方を解説します.今回は.関数の作成基礎と引数.戻り値.Switchパラメータについて説明します. ...
 - 题解-PKUWC2018 随机算法
			
Problem loj2540 题意简述:给定\(n\)个点的无向图,给定求最大独立集的近似算法:随机排列\(1\cdots n\),按照该排列顺序贪心构造最大独立集(即对每个点能加入独立集就加),求 ...
 - 【转】C++标准转换运算符static_cast
			
static_cast<new_type> (expression) 虽然const_cast是用来去除变量的const限定,但是static_cast却不是用来去除变量的static引用 ...