构造器
1.和类名相同
2.没有返回值
作用:
1.new本质调用构造器
2.初始化对象的值
注意点:
定义了有参构造之后,如果想使用无参构造,显示的定义一个无参的构造
Alt+insert 可生成构造器
无无参构造会报错
有 无参构造就会正常运行
因此,每当我们需要用到有参构造时,就要在前面声明一个空的无参构造。
即 public 方法名 ( ){ };
package classstudy.demo02; //java--->class public class Person { //一个类即使什么都不写,也会存在一个方法(即构造方法 ) // (如何让构造?文件->项目结构->模块->在该页面最右侧添加目录->确认即可) //显示的定义构造器 与类名相同 String name; int age; //实例化初始值 //1.使用new关键字 必须要有构造器 本身在调用构造器 //2.用来初始化值 public Person(){ // this.name="sxx"; } //有参构造 一旦定义了有参构造,无参就必须显示定义 public Person(String name){ this.name=name; } //alt+insert 会生成构造器 点构造函数 确认 会默认帮你生成 //其实是函数重载罢了 public Person(String name,int age){ this.name=name; this.age=age; } }
package classstudy.demo02; public class Applycation { public static void main(String[] args) { //类:抽象的,需要实例化 //类实例化后会返回自己的一个对象 //new关键字实例化一个对象 Person person =new Person("sxx"); System.out.println(person.name); } }
对象的创建和使用:
必须使用new 关键字创造对象,构造器 Person id =new Person;
对象的属性:id.age;
对象的方法:id.sleep();
类:
静态的属性:属性
动态的行为:方法
三大特征:封装、继承、多态
四、封装
该漏的漏,该藏的藏。
我们程序设计要求“高内聚,低耦合”。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的内部消息供外部使用。
封装(数据的隐藏)
通常,应该禁止直接访问一个对象中数据的表达,而应该通过操作接口来访问,这称为信息隐藏。
记住这句话:信息私有:get/set
package classstudy.demo03; public class Student { private String name;//名字 private int id; private char sex; private int age; //提供一些可以操作这个属性的方法 //提供一些public的get、set方法 public String getName(){ return this.name; } public void setName(String name){ this.name=name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public char getSex() { return sex; } public void setSex(char sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { if(age>=120||age<0){//不合法 this.age=3; }else { this.age = age; } } } //alt+insert 会帮忙直接生成方法
package classstudy.demo03; public class Application { public static void main(String[] args) { Student s1=new Student(); Student s11=new Student(); //s1.name="sxx"; s1.setName("sxx"); System.out.println(s1.getName()); s1.setAge(18);//合法 System.out.println(s1.getAge()); s11.setAge(180);//不合法 System.out.println(s11.getAge()); //s1.getName(); } }
五、继承
继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。
extends的意思是“拓展”,子类是父类的拓展。
JAVA类中只有单继承,没有多继承!
继承是类和类之间的一种关系。除此之外,类和类之间还有依赖、组合、聚合等。
继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends来表示。
子类和父类之间,从意义上来讲应该具有“is a”的关系
package classstudy.demo04; //Person 人:父类 public class Person { public String name; //public 公有的 //protected //default //private 私有的 子类就不能继承 但可以通过父类提供的方法获得 即set get // public int money=1000_0000; private int money=1000_0000; public void say(){ System.out.println("说了一句话"); } public int getMoney() { return money; } public void setMoney(int money) { this.money = money; } }
package classstudy.demo04; public class Application { public static void main(String[] args) { Student student=new classstudy.demo04.Student(); student.say(); //System.out.println(student.money); System.out.println(student.getMoney()); } }
object类
public class Person /*extends Object*/{ //在java中,所有类都直接或简介继承object类 }
super
package classstudy.demo04; //Person 人:父类 // 在java中,所有类都直接或简介继承object类 public class Person /*extends Object*/ { protected String name = "sxx"; public void print() { System.out.println("Person"); // } //私有的东西无法被继承 若改为private void print 则 super会报错 } }
package classstudy.demo04; //学生 is 人:派生类,子类 //子类继承了父类,拥有父类的全部方法 public class Student extends Person{ private String name="xuan"; //public Student(){ // //隐藏代码:调用了父类的无参构造 // super(); // System.out.println("Student的无参构造执行"); //} public void test(String name){ System.out.println(name);//传递的参数 System.out.println(this.name);//这个类 System.out.println(super.name);//父类 } public void print(){ System.out.println("Student"); } public void test1(){ print();//Student this.print();//Student super.print();//Person } }
package classstudy.demo04; public class Application { public Application() { } public static void main(String[] args) { Student student=new Student(); student.test("xxx"); student.test1(); } }
public Student(){ //隐藏代码:调用了父类的无参构造 super();//调用父类的构造器,必须放在子类构造器的第一行 System.out.println("Student的无参构造执行"); }
注意:一个类,只要重写了有参构造,就要先把无参构造加上。
也可以不写,但如果不写,他的子类调用,中要自己写上他的有参,(因为默认的是无参),这样就不会报错了
super注意点:
1.super调用父类的构造方法,必须在构造方法的第一个
2.super必须只能出现在子类的方法或构造方法中!
3.super和this不能同时调用构造方法!(因为他们俩要写的话,都要在第一行,但不可能)
super和this的区别:
1.代表的对象不同:
this:本身调用者这个对象
super:代表父类应用对象
2.前提:
this:没有继承也可以使用
super:只有在继承条件下才可以使用
3.构造方法:
this();本类的构造
super();父类的构造
方法重写:重点--->多态
B
package classstudy.demo05; //重写是方法的重写,和属性无关 public class B { public static void test(){ System.out.println("B=>test"); } }
A:
package classstudy.demo05; public class A extends B{ public static void test(){ System.out.println("A=>test"); } }
main:
package classstudy.demo05; public class Application { public static void main(String[] args) { //方法的调用只和左边定义的数据类型有关 A a=new A(); a.test();//A //父类的引用指向了子类 B b=new A(); b.test();//B } }
使用override重写
B:改为非静态
package classstudy.demo05; //重写是方法的重写,和属性无关 public class B { public void test(){ System.out.println("B=>test"); } }
A:alt+insert会出现自动重写的选项
package classstudy.demo05; //继承 public class A extends B{ //Override重写 @Override//注解,有功能的注释 public void test() { System.out.println("A->test()"); } }
静态方法和非静态方法差别很大 如果是静态方法 则方法的调用只和左边定义的数据类型有关 如果是非静态方法,才是重写
另外:重写的关键词 只能是public 不可以是private
重写总结:需要有继承关系,子类重写父类的方法,(不可以重写属性)
1.方法名可以相同
2.参数列表必须相同
3.修饰符:范围可以扩大:public>private>protected>default>private
4.抛出的异常:范围可以被缩小,但不能扩大;ClassNotFoundException--->Exception(大)
重写:子类的方法和父类必须要一致:方法体不同!
为什么需要重写:
父类的功能,子类不一定需要或者不一定满足!
alt+insert:override
六、多态
动态编译:类型:可扩展性
即同一方法可以根据发送对象的不同而采用多种不同的行为方式
一个对象的实际类型是确定的,但可以指向对象的引用类型有很多
多态存在的条件:
有继承关系
子类重写父类方法
父类引用指向子类对象
package classstudy.demo06; public class Person { public void run(){ System.out.println("run"); } }
package classstudy.demo06; public class Student extends Person{ @Override public void run() { System.out.println("son"); } public void eat(){ System.out.println("eat"); } }
package classstudy.demo06; public class Application { public static void main(String[] args) { //一个对象的实际类型是确定的 //new Student() //new Person() //可以指向的引用类型就不确定了:父类的引用类型指向子类 //Student能调用的方法只能是自己的或者是继承父类的 Student s1= new Student();//alt+enter快捷键 //Person父类型 可以指向子类 但是不能调用子类独有的方法(但如果子类重写,就调用子类重写后的方法) Person s2 = new Student();//父类的引用类型指向子类 Object s3 = new Student(); s2.run();//子类重写了父类的方法,执行子类的方法 s1.run(); //对象能执行哪些方法,主要看左边的类型,和右边关系不大 s1.eat(); // s2.eat();//调用不了 因为Person类里面没有eat方法 ((Student)s2).eat();//把低类型强制转换为了高类型,就可以了 } }
注意:
1.多态是方法的多态,属性没有多态性
2.父类和子有联系,有联系 类型转换异常 ClassCastEcption!(类型转换异常,父子类之间可能出现了一些问题)
3.多态存在的条件:继承关系,方法需重写,父类的引用指向子类对象 Father f1=new Son();
不能被重写的方法:
(1)Static 方法,属于类,它不属于实例.
(2)final 常量 :
(3)private方法:
4.父类型指向子类 不能调用子类独有的方法(但如果子类重写,则调用子类重写后的方法)
七、Instanceof关键字和类型转换
package classstudy.demo07; public class Person { }
package classstudy.demo07; public class Student extends Person{ }
package classstudy.demo07; public class Person { }
instanceof总结如下
package classstudy.demo07; public class Application { public static void main(String[] args) { //Object>Person>Teacher //Object>Person>Student //Object>String Object object=new Student(); //System.out.println(X instanceof Y);//能不能编译通过 //instanceof判断的是运行类型 System.out.println(object instanceof Student);//true System.out.println(object instanceof Person);//true System.out.println(object instanceof Object);//true System.out.println(object instanceof Teacher);//false System.out.println(object instanceof String);//false System.out.println("---------------------------------"); Person person=new Student(); System.out.println(person instanceof Student);//true System.out.println(person instanceof Person);//true System.out.println(person instanceof Object);//true System.out.println(person instanceof Teacher);//false //System.out.println(person instanceof String);//编译错误 System.out.println("================================="); Student student =new Student(); System.out.println(student instanceof Student);//true System.out.println(student instanceof Person);//true System.out.println(student instanceof Object);//true // System.out.println(student instanceof Teacher);//编译错误 // System.out.println(student instanceof String);//编译错误 } }
类型转换:
1.父亲引用指向指向子类的对象 2.把子类转换为父类,向上转型,不用强制转换 3.把父类转换为子类,向下转型,强制转换 4.方便方法调用,减少重复代码,提高利用率,简洁
public class Application { public static void main(String[] args) { //类型之间的转换:基本类型转换 高低 64 32 16 8 // 高转低 需要强转 低转高 不需要强转 Person obj=new Student(); //obj.go(); //student 将这个对象转为Student类型,我们就可以使用Student类型的方法了! //高往低转 Student student =(Student) obj; student.go(); Student student1=new Student(); student1.go(); //子类转换为父亲,可能丢失自己的本来的一些方法 Person person=student1;//低转高,直接转 }
八、static关键字详解
九、抽象类
abstract修饰符可以用来修饰方法也可以修饰类,如果修饰方法,那么该方法就是抽象方法;如果修饰类,那么该类就是抽象类。
抽象类中可以没有抽象方法,但是又抽象方法的类一定要声明为抽象类。
抽象类:不能使用new关键字来创建对象,它是用来让子类继承的。
抽象方法:只有方法的声明,没有方法的实现,它是用来让子类实现的。
子类继承抽象类,那么就必须要实现抽象类没有实现的抽象方法,否则该子类也要声明为抽象类。
package classstudy.demo08; //abstract 抽象类 public abstract class Action { //约束~ 有人帮我们实现~ //abstract,抽象方法 只有方法的名字,没有方法的实现 public abstract void doSomeing(); //1.不能new 这个抽象类,只能靠子去实现他;约束! //2.抽象类里可以写普通方法,但抽象方法必须在抽象类中 //3.抽象的抽象:约束~ //思考题? 抽象类不能new 对象 那存在构造器吗? //存在的意义是什么? 抽象出来~节省代码的开发,提高开法效率,后期方便维护 }
package classstudy.demo08; //抽象类的所有方法,继承了他的所有子类,都必须实现他的方法~ 除非 子类也是抽象类,那样就需要子类的子类去实现 //类 单继承 接口 多继承 public class A extends Action { }