物以类聚,分类的思维模式,思考问题首先解决问题需要哪些分类,然后对这些分类进行单独思考,最后对各个分类下的过程进行思考。
对于描述复杂问题的事物,为了从宏观上把握,从整体上合理分析,我们需要使用面向对象来分析整个系统,但是,具体的微观操作,仍然需要使用面向过程的思路去处理。
以类的方式组织代码,以对象的组织(封装)数组
三大特性:
封装
继承
多态
类内包含两部分: 属性和方法。
对象是类的实例化,
语法:类名 对象名=new 类名();
默认情况下对象的属性都有默认值,int类型为零,String类型为null等等
构造器 (构造方法)new对象本质就是调用构造器。(无返回值)
构造器一般用来初始化值。
构造器在生成对象时默认调用,分为有参和无参,当有参存在时,无参必须显示定义(写出来),当我们有参无参均未写时,系统自动添加无参构造(默认隐藏)。构造器只能是public修饰,因为在main()中定义对象时选需要调用构造器。
使用 this.属性名 用来访问调用的对象的属性。有多个属性时可以重载多个构造器。
在IDEA中使用Alt+Insert可以选择construct可以快速创建构造器。
eg:
package Creat;//类一 public class Creat01 { public String name; int age; public Creat01() { this.age=10; this.name="待输入"; } public Creat01(String name) {//一个参数 this.name = name; } public Creat01(String name, int age) {//两个参数 this.name = name; this.age = age; } } import Creat.Creat01; public class Application { //类二 public static void main(String[] args) { Creat01 xiaoming=new Creat01();//创建时调用无参构造器 Creat01 xiaohong=new Creat01("xiaohong");//创建时调用一个参数的构造器 Creat01 xiaohei=new Creat01("xiaohei",18);//创建时调用两个参数的构造器 System.out.println(xiaoming.name); System.out.println(xiaohong.name); System.out.println(xiaohei.name); } }注:
main方法在栈里,main()结束程序也就结束了,
static静态方法区,类调用的时候和类一起加载。存放在堆中。
引用类型在没有赋值的情况下默认为null
封装:我们的程序设计要追求 高内聚,低耦合,高内聚就是指类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅仅暴露少量的方法给外部用
属性私有:get/set
可以理解为不再对属性直接修改,将属性赋予私有属性,通过定义方法对属性修改。get为得到属性,set为修改属性。
在IDEA中,Alt+Insert可以自动生成get和set对属性进行修改。(getter setter)
在定义类中属性(变量),方法时,一般使用public,private,protected修饰,在这之中只有public作用下可以在main()方法中直接访问。
public:可以被继承,可以直接在main()中通过对像直接访问和修改
private:不可被继承,不可再main()中通过对象直接访问,通过方法进行修改和访问
protected:可被继承,不可直接通过对象访问,通过方法修改访问
default:不作任何修饰时系统默认为此修饰。可被继承,不可直接通过对象访问,通过方法修改访问。
继承:类之间的关系继承的本质是对某一批类的抽象。
extends的意思是扩展,子类是父类的扩展,子类会继承父类的属性和方法,private属性下的东西无法继承,默认下的属性default。
super关键字与this类似,super指代的是父类中所继承的与子类中同名的属性区分方法。例如super.name;指代的是继承自父类的name属性,this.name指代的是子类原本的那么属性,他们可能同名但是并非同一个值。同样的super();是调用父类的构造器(默认情况下,隐式的写在子类构造器的第一行,当我们人为写出时只能放在第一行,否则报错),this();指的是子类构造器,方法也是同理的。
tip:
this();和super();不能同时在子类构造器中显式的写出,因为两者都要求要写在第一行,否则会报错,因此直接不写出即可,自动隐式生成。父类没有无参构造。子类生成时也会报错!除非写出super(参数);
super只能出现在子类的构造器或者方法中。只有继承才可以使用。
注:
java中只有单继承,没有多继承。在java中所有类默认继承object类。
在IDEA中Ctrl+H可以查看继承的分级情况。
eg:
//父类 package Inherit; public class Inherit01 { String;//default属性下的变量 public int age=52; //public 下的 private double high=170.0; //private下的不能被继承 protected double weight=69;//protected public Inherit01() {; age=53; high=171; weight=68; } } //子类 package Inherit; public class Inherit02 extends Inherit01{ public Inherit02 () { // super();//调用父类构造器 } String; int age=21; double high=181.0; double weight=70; public void test01(String name){ //如果在参数中定义的有同名变量,那么单写变量名指代的是参数中的变量 //想要指代自己定义的需要使用this指针 System.out.println("自己定义的:"+this.name+" "+age+" "+high+" "+weight); System.out.println("继承获得的:"+super.name+" "+super.age+" "+super.weight); //私有private下的high未能得到继承 System.out.println("传入参数的同名变量:"+name); } } //应用 import Inherit.Inherit02; public class Application { public static void main(String[] args) { //继承的测试代码 Inherit02 inherit02=new Inherit02(); inherit02.test01("传入的name"); } } 重写:重写必须要有继承关系,是子类对父类方法的重写。
方法名必须相同
参数列表必须相同
修饰符的范围只能扩大不能缩小 public>protected>default>private
抛出异常的范围只能缩小不能扩大
不能是static的静态函数
子类和父类的方法名一致,但是方法体不同。
为什么要重写?
父类的方法子类不一定需要,或者不一定满足需求
IDEA中的重写快捷键: Alt+insert----->override
静态方法的调用中,仅仅和左边的定义有关。例如:A类继承自B类。若两者都含有静态方法test()
A a=new A();
B b=new A(); //父类的引用指向子类的,仅可调用父类中有的方法。
a.test(); //调用的是A中写的test()
b.test(); //调用的时B中 的方法test()
若不是静态方法,而是普通的方法,则test在A中的定义直接实现了test方法的重写。
不能重写的方法:
static 方法,属于类的,不属于实例
final 常量的,在常量池
private 方法
多态:同一方法根据发送对象不同而采取不同的欣行为方式
一个对象的实际类型是确定的,但是可以指向对象的引用类型(父类,有关系的类)有很多。
多态是方法的多态,属性没有多态
存在条件:继承关系,方法需要重写,父类的引用指向子类的对象 father f1=new son();
instanceof:使用比较x和Y的关系,x为对象,Y为一个类。
如果X和Y存在父子关系则可以通过编译,否则无法通过编译,比较返回结果的true或false
如果对象X属于类Y或者其父类产生的对象则为true,否则为false
要进行强制的了类型转换:
子类转换为父类可能丢失自己本身的一些方法。
只能是父类引用指向子类的对象。
父类转换为子类需要强制转换,通过强制的转换,通过降级或升级使其能够调用它本身的一些其他方法
((Student)object).方法(); //强制转换的方法