2022/4/24 JavaDay16
main方法在栈里面、
static一开始和类一起加载
对象是通过引用来操作:通过栈===》来操作堆
属性:字段Field 成员变量
默认初始化:
-
数字:0
-
char:u0000
-
boolen:false
-
引用:null
修饰符 属性类型 属性名 =属性值
对象的创建和使用
-
必须使用new关键字来创造 Person sunkuan =new Person();
-
对象的属性 sunkuan.name
-
对象的方法 sunkuan.sleep();
package com.oop.demo03;
public class Pet {
public String name;//别忘了加public
public int age;
public void shout(){
System.out.println("叫了一声");
}
}
package com.oop;
import com.oop.demo03.Pet;
public class Application {
public static void main(String[] args) {
Pet dog = new Pet();
dog.name="旺财";
dog.age=12;
dog.shout();
System.out.println(dog.name);
System.out.println(dog.age);
}
}
面向对象三大特性
封装
-
高内聚,低耦合——内部数据操作细节自己来完成,不允许外部干涉,低耦合:就暴露少量的方法给外部
-
属性私有
-
get/set
package com.oop.demo04;
//类 private
/*
* 1.提高程序的安全性
* 2.隐藏代码的实现细节
* 3,统一接口
* 4.系统的可维护性增加了
*
*
* */
public class Student {
//属性私有
//名字
private String name;
//学号
private int id;
//性别
private char sex;
private int age;
//提供一些可以操作这个属性的方法
//提供一些public的get/set的方法
//get获得这个数据
public String getName(){
return this.name;
}
//set给这个数据设置值
public void setName(String name)
{
this.name=name;
}
//generate
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;
}
}
}
package com.oop;
import com.oop.demo04.Student;
public class Application {
public static void main(String[] args) {
Student s1 = new Student();
s1.setName("孙款");
System.out.println(s1.getName());
s1.setAge(999);
System.out.println(s1.getAge());
}
}
继承
继承的本质是对某一批类的抽象
extands的意思就是“扩展”
只有单继承,一个儿子只能有一个爸爸,一个爸爸可以有多个儿子
-
object类
package com.oop.demo05;
//具有is a的意思
//子类继承父类就会拥有父类全部方法
//如果修饰符是private,父亲私有
public class Student extends Person{
Person person;
//ctrl+H看继承的类
}
-
super--this
super调用父类,而且隐藏调用父类
父类没有无参,子类则不可以使用无参
-
super调用父类的构造方法,必须在构造方法第一个
-
必须只出现在子类的方法或者构造方法中
-
super和this不能同时调用方法
vs this:
-
this随便,本类
-
super和父类绑定
-
ctrl+F搜索
-
方法的重写
静态的方法和非静态区别大
静态方法只和左边有关,非静态可以重写,static来区分
重写:
-
需要有继承关系,子类重写父类方法
-
方法名必须相同
-
参数列表必须相同
-
修饰符可以扩大但不可以缩小:publi》proteced》default》private
-
抛出异常:可以缩小但不可以扩大:classnotfoun
重写,子类的方法和父类必须一致
方法体不同
为什么需要重写:
-
父类的功能,子类不一定需要,或者不一定满足
override重写
多态
同一个方法可以根据发送对象的不同而采用多种不同的行为方式
一个对象的实际类型是确定的,但指向引用类型有很多
存在条件:
-
有继承关系
-
子类重写父类
package com.oop; import com.oop.demo06.Person; import com.oop.demo06.Student; public class Application { public static void main(String[] args) { //一个对象的实际类型是确定的 //可以引用的类型就不确定 Student student = new Student(); Student s1=new Student(); Person s2=new Student(); Object s3=new Student(); s2.run(); s1.run();//子类重写了父类方法,执行子类方法 //对象能执行那些方法看对象左边,和右边关系不大 //儿子都可以用,父亲只可以调用自己的,父亲要调用要类型转换 } /* * 1.多态是方法的多态 *2.父类和子类有关系,;类型转换异常,ClassCastException * 3.存在条件:继承,方法重写,父亲引用指向子类 * */ }
-
static 属于类,不属于实例
-
final不可以重写
-
private方法也不可以重写
instanceof(类型转换)
包含于关系
类型转换:高转低
((Student)obj).go();//强制转换
子转父可能会丢失子类拓展的方法,向上转型不用强转
方便调用
Static
共享性,有static可以直接调
static{ //静态代码块,且只执行一次 } { //匿名代码块,可以赋初值 } 静态导入包
静态》匿名》构造方法
-
抽象类
public abstract class a{
public abstract void b();
//抽象方法,只有方法名字,没有方法的实现
}
父债子偿——必须重写
extends:单继承 接口可以多继承
-
不可以new,只可以靠约束
-
抽象类里面可以写普通方法,抽象方法必须在抽象类中
接口
只有规范,专业的约束,约束和实现的分离
interface
package com.oop.demo09;
//类可以实现接口,implements来实现,
//实现了接口的类,就要重写接口的方法
//多继承,接口只有方法的定义
public class UserServiceImpl implements UserService,TimeService{
@Override
public void add(String name) {
}
@Override
public void delete(String name) {
}
@Override
public void update(String name) {
}
@Override
public void query(String name) {
}
@Override
public void timer() {
}
}
作用:
1.约束
2.定义一些方法,让不同人实现
3.public abstract
4.public static final
5.接口不能被实例化
6,implement可以实现多个接口
7,必须要重写接口中的方法,generate
内部类
package com.oop.demo10;
public class Outer {
private int id=10;
public void out(){
System.out.println("外部的类");
}
class Inner{
public void in(){
System.out.println("这是内部类的方法");
}
//获得外部类的私有属性
public void getid(){
System.out.println(id);
}
}
}
异常
Exception
异常体系结构
-
检查性异常-----是个人问题
-
运行时异常,可处理
-
错误ERROR----和个人没关系
异常处理机制
-
抛出异常
-
捕获异常
try ,catch,throw,
package com.exception;
public class Test {
public static void main(String[] args) {
int a=1;
int b=0;
new Test().test(1,0);
//处理不了主动抛出异常
}
public void test(int a,int b){
if ( b==0 ){
throw new ArithmeticException();//主动抛出异常
}
}
/* try{//try监控区域
if ( b==0 ){
throw new ArithmeticException();//主动抛出异常
}
System.out.println(a/b);
}catch (Error e){//想要捕获的错误类型
System.out.println("程序出错,变量b不能为0");
}catch (Exception e){
System.out.println("Exception");
}catch (Throwable t){//捕获多个异常要从小到大
System.out.println("Throwable");
}
finally {
System.out.println("finally");
}
//finally可以不要*/
}
自定义异常
package com.exception.demo02;
public class MyException extends Exception{
//传递数字
private int detail;
public MyException(int detail) {
this.detail = detail;
}
//toString:异常的打印信息
@Override
public String toString() {
return "MyException{" +
"detail=" + detail +
'}';
}
}
package com.exception.demo02;
public class Test {
//可能会存在异常的方法
static void test(int a) throws MyException {
System.out.println("传递的参数为:"+a);
if ( a>10 ){
throw new MyException(a);
}
System.out.println("OK");
}
public static void main(String[] args) {
try {
test(11);
} catch (MyException e) {
System.out.println("MyException:"+e);
}
}
}try-catch