关注对象能完成哪些功能
关注现实的具体过程,因果关系
public 类名(){ //无参构造 } public 类名(){ this.name="zhangsan"; //有参构造 }
一个类即使什么也不写也会存在一个无参构造(不显示),若生成了有参构造器,则默认的无参构造丢失,必须手动加上
属性私有,加上priavte关键字,使用get和set方法去访问
class Person{ private String name;//属性私有 public String getName() { return name; } public void setName(String name) { this.name = name; } }
快捷生成get和set方法:alt+insert
在set方法中设置属性合法控制,如年龄在0~150以内
Java中只有单继承没有多继承,但一个父类可以有多个子类
类和类之间的关系
java中所有类默认继承Object类
使用关键字extends
子类继承了父类就会拥有父类的全部方法
父类中私有的方法属性无法被继承
super 用于在子类中调用父类的方法属性
调用子类的无参构造时会默认先调用父类的无参构造
class Person{ String name; public Person(){ System.out.println("老师"); } } class Student extends Person{ String no; public Student(){ super();//默认存在,且只能在第一行 System.out.println("学生"); } } //结果先打印老师再打印学生!!!!!!!!!!!!!!!
只针对方法,方法名相同,参数列表相同
修饰符:范围可以扩大但不能缩小
抛出的异常:范围可以被说笑,但不能扩大
子类中可以重新父类中的非静态方法(实例方法)且是public!!
class Person{ public void say(){ System.out.println("hello"); } } class Student extends Person{ public void say(){ System.out.println("你好"); } } public void test(){ Student s=new Student(); s.say(); } //打印你好!!!!
重写后再调用以子类为准
快捷键:alt+insert--->override
方法的多态,与属性无关
父类引用可以指向子类
父类型引用不能调用子类独有方法
public void test(){ Person zhangsan=new Student();//父类引用指向子类对象 zhangsan.say();//调用重写后的方法,打印你好!! zhangsan.study();//编译报错,Person类型没有此方法,尽管实际对象是Student!!! ((Student)zhangsan).study();//通过,强制转换 } class Person{//父类 pubilc void say(){} } class Student extends Person{//子类 public void say(){ System.out.println("你好");//重写 } public void study(){}//子类独有方法 }
类型转换异常 ClassCastException
instanceof
class Person{} class Student extends Person{} class Teacher extends Person{} public void test(){ Person p=new Student(); Student s=new Student(); p instanceof Person;//true p instanceof Student;//true p instanceof Teacher;//false,编译通过,Person与Teacher有父子关系,但p指向Student而非Teacher,所以false s instanceof Teacher;//编译不通过,Student与Teacher没有父子关系 }
向上转型:子类转化为父类,可以直接转换
可能失去一些子类独有的方法
class Person{} class Student extends Person{} public void test(){ Student s=new Student(); Person p=s;//直接转化 }
向下转型:父类转化为子类,用强制转化
class Person{} class Student extends Person{} public void test(){ Person p=new Student(); Student s=(Student)p; }
import static java.lang.Math.random;//静态导入包,后面就可以直接使用random();方法public class Person{ {//匿名代码块,在静态代码块之后执行,可用于赋初值} static{ //静态代码块 //在类加载时执行,只执行一次 } private static int age;//静态变量,通过类名.age访问 public static void max(int a,int b){ //静态方法,类名.max(a,b);调用 //多是功能方法,如求最大值 } }
public abstract class Action{ public abstract void dosomethong(); //抽象方法,只有方法名,没有方法的实现}
普通类:只有具体实现
抽象类:具体实现与规范(抽象方法)都有
接口:只有规范!!!
声明接口的关键字:interface
接口不能实例化,没有构造方法
接口里的方法默认抽象:public abstract
接口里的属性都默认常量:public static final
接口都需要实现类,实现类类名以Impl结尾
接口可以多继承!!!继承的多个接口以逗号分开
public interface Service{ void run();//前面默认有public abstract}public interface add{}public class UserServiceImpl implements Service,add{ public void run(){ //必须重写(实现) }}
public class Demo05 { public static void main(String[] args) { Outer o=new Outer(); Outer.Inner in=o.new Inner();//!!!!!!!!!!!!!!!!! o.out(); in.in(); in.getId(); in.getOut(); }}class Outer{ private int id=10; public void out(){ System.out.println("外部类方法"); } public class Inner{//内部类 public void in(){ System.out.println("内部类方法"); } public void getId(){//内部类读外部类私有属性 System.out.println(id); } public void getOut(){//内部类访问外部类方法 out(); } }}
public class Demo05 { public static void main(String[] args) { Outer o=new Outer(); }}class Outer{ private int id=10; public void out(){ System.out.println("外部类方法"); } public static class Inner{//静态内部类 public void in(){ System.out.println("内部类方法"); } //静态内部类里无法访问外部类的属性和方法!!!!!!!!!!!! }}
在方法中定义的类
public class M{ public void m(){ class Inner{//局部内部类 public void in(){ } } } }
public class Test{ public static void main(String[] args) { new Apple().eat();//匿名内部类,不用将实例保存到引用里 UserService u=new UserService();//??? } } class Apple{ public void eat(){} } interface UserService{ }