break和return的区别
return除了返回值外也有中断函数执行的作用
break是中断当前循环
回顾方法:
补充:
在不同类中非静态方法的调用
静态方法可以直接在另一类中调用,
Student类
package com.htk.ood;
import java.io.IOException;
//类
public class Student {
//静态方法 static
//main 方法
public static void main(String[] args) {
}
//静态方法 static
// 修饰符,返回值类型,方法名(……)
//有返回值
public static String sayHello() {
return "Hello World!";
}
//非静态方法 无法在另一个类中直接使用,需要实例化这个类
//无返回值
public void hello(){
System.out.println("Hello World!");
}
//补充:完整的方法定义
public void readFile(String File) throws IOException{
}
}
Demo02类
package com.htk.ood;
public class Demo02 {
public static void main(String[] args) {
//实例化这个类 非静态方法在其他类里的调用方式
//对象类型 对象名 = 对象值
Student student = new Student();
student.hello();
//静态方法直接调用
System.out.println(Student.sayHello());
}
}
同一个类中,静态方法和非静态方法之间调用
静态方法不能调用非静态方法,会报错,原因是静态方法与类一起创建,费静态方法适合对象一起创建,先后次序有别。
类和对象的关系
创建与初始化对象
一个项目应该只有一个main()方法
package com.htk.ood;
public class Application {
public static void main(String[] args) {
//Application类用于测试,只有一个入口
}
}
学生类,一个类只由两部分组成 属性和方法
package com.htk.ood;
import java.io.IOException;
//学生类
public class Student {
//属性
String name;
int age;
int studentNumber;
char gender;
String home;
//方法
public void study(){
System.out.println(this.name+"正在学习");
}
public void game(){
System.out.println(this.name+"正在玩游戏");
}
}
使用new关键字创建对象:使用new关键字创建的时候除了分配内存空间之外,还会给出创建好的对象进行默认的初始化,以及对类中构造器的调用。
package com.htk.ood;
public class Application {
public static void main(String[] args) {
//Application类用于测试,只有一个入口
//实例化类 用new关键字
Student zhangsan=new Student();
zhangsan.name="张三";
zhangsan.age=18;
zhangsan.studentNumber=20200001;
zhangsan.gender='男';
zhangsan.home="北京";
System.out.println(zhangsan.name+"在干嘛?");
zhangsan.study();
Student xiaomin=new Student();
xiaomin.name="小明";
xiaomin.age=18;
System.out.println(xiaomin.name+"在干嘛?");
xiaomin.game();
}
}
构造器必须掌握,一个类即使什么都不写,它也会存在一个方法
package com.htk.ood;
import java.io.IOException;
//学生类
public class Student {
//属性
String name;
int age;
int studentNumber;
char gender;
String home;
//方法
//构造方法,作用:实例初始化
//1.new关键字,必须要有构造器
public Student(){
this.name="King";
}
//有参构造方法
//注意:一旦定义了有参构造方法,无参构造必须显示定义
public Student(String name){
this.name = name;
}
}
类中的构造器也称为构造方法,是对进行创建对象的时候必须要调用的,并且构造器有以下两个特点:
在IDEL中 alt+insert 选择constructed 快速完成构造方法
内存分析
总结:
类和对象:类抽象,对象具体
方法:定义和调用
对应的引用:基本类型,对象使用过引用来操作的:栈–>堆
属性:字段Field 或叫成员变量
默认初始化:0 null false
修饰符
对象的创建和使用
new关键字
构造器
类:属性和方法
该露的露,该藏的藏
封装(数据的隐藏)
属性私有(private修饰符),get/set(提供一些可以操作这个属性的方法,public的get或get的方法)
package com.htk.ood;
import java.io.IOException;
//学生类
public class Student {
//属性
private String name;
private int age;
private char gender;
//方法
public String getname(){
return this.name;
}
public void setName(String name){
this.name = name;
}
public int getAge() {
return age;
}
//封装的意义可以提高程序安全性,隐藏代码细节,统一接口,提高系统的可维护性。
public void setAge(int age) {
if(age<0||age>120)
System.out.println("非法输入");
else
this.age = age;
}
public void study(){
System.out.println(this.name+"在学习");
}
}
package com.htk.ood;
public class Application {
public static void main(String[] args) {
/*
Application类用于测试,只有一个入口
实例化类 用new关键字
*/
Student zhangsan=new Student();
zhangsan.setName("张三");
System.out.println(zhangsan.getname()+"在干嘛?");
zhangsan.study();
}
}
继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。
extends是扩展的意思,子类是父类的扩展。
java中类只有单继承,没有多继承。 1(父)对多(子)
继承是类与类之间的一种关系,除此之外,类和类之间的关系还有依赖,组合,聚合等
子类继承父类,使用关键字extends来表示
package com.htk.ood;
public class Application {
public static void main(String[] args) {
/*
Application类用于测试,只有一个入口
实例化类 用new关键字
*/
Student student = new Student();
student.test();
student.pTest();
}
}
package com.htk.ood;
public class Person {
//属性
protected String name = "God";
//方法
public void printTest(){
System.out.println(this.name);
}
}
package com.htk.ood;
//学生类
public class Student extends Person{
//属性
String name = "xiaolaji";
//构造方法的super
public Student(){
//spuer() 隐藏的代码,必须在第一位
}
//方法 private的东西无法继承
//属性上super
public void test(){
System.out.println(name);
System.out.println(this.name);
System.out.println(super.name);
}
public void printTest(){
System.out.println(this.name);
}
//方法上super
public void pTest(){
printTest();
this.printTest();
super.printTest();
}
}
重写都是方法的重写,与属性无关,且要有继承关系作为前提
父类的引用指向了子类,A继承B ,B b = new A();
有static,final,private修饰词不能重写
静态方法和非静态方法区别很大
方法名必须相同,参数列表必须相同,方法体不同。
修饰符:范围可以扩大,但不能缩小 public>protected>Default>private
抛出异常:范围,可以被缩小但不能扩大,ClassNotFoundException—>Exception
重写的意义:父类的功能子类不一定都需要
一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多 (父类)
多态是方法的多态,属性没有多态
父类和子类有联系,防止出现类型转换异常 ClassCastException
存在的条件: 继承关系,方法需要重写,父类引用指向子类对象 father f = new son();
对象能执行哪些方法主要看对向左边的类型,和右边关系不大!
instanceof (类型转换)引用类型 (Object > 父类 > 子类)
必须有联系,高可以低,同级之间会报错
System.out.println(x instanceof y); //x,y必须是子父类关系,且x必须是y的子类
//父转子
Person student = new Student();
((student) student).go(); //强制类型转换
//子转父
Student student = new Student();
Student.go();
Person person = student;
子类转换为父类,可能丢失自己的本来的一些方法!
总结:
package com.htk.ood;
public class DemoStatic {
private static int age; //静态变量 多线程
private double sorce; //非静态变量
public static void main(String[] args) {
DemoStatic s1=new DemoStatic();
System.out.println(s1.age);
System.out.println(s1.sorce);
System.out.println(DemoStatic.age);
System.out.println(DemoStatic.sorce); //掉用不了没有static
say();
run(); //无法调用 ,没静态。
new DemoStatic().run(); //这样可以调用
}
//静态方法
public static void say(){
}
//非静态方法
public void run(){
}
}
匿名代码块和静态代码块
package com.htk.ood;
public class DemoStatic {
{
//匿名代码块,赋初始值
System.out.println("匿名代码块");
}
static {
//静态代码块,只执行一次
System.out.println("静态代码块");
}
private static int age; //静态变量 多线程
private double sorce; //非静态变量
public static void main(String[] args) {
DemoStatic s1=new DemoStatic();
System.out.println(s1.age);
System.out.println(s1.sorce);
System.out.println(DemoStatic.age);
System.out.println(DemoStatic.sorce); //掉用不了没有static
say();
run(); //无法调用 ,没静态。
new DemoStatic().run(); //这样可以调用
}
//静态方法
public static void say(){
}
//非静态方法
public void run(){
}
}
静态导入包
import static java.lang.Math.random;
抽象类
package com.htk.ood;
//Abstract 抽象类: 类是单继承的 java没有多继承,但接口可以实现多继承
public abstract class Action {
String name ="抽象类带参构造方法";
//约束~有人帮我们实现
//抽象方法,只有方法名字,没有方法的实现!
public abstract void doSomething();
public Action() {
System.out.println("1");
}
/*
1.不能new这个抽象类,只能靠子类去实现它:约束。
2.抽象类中可以写普通方法
3.抽象方法只能在抽象类中
//抽象的抽象:约束
*/
}
package com.htk.ood;
public class ActionSon extends Action {
String name = "子类的带参构造方法";
@Override
public void doSomething() {
}
public ActionSon() {
System.out.println("2");
}
}
package com.htk.ood;
public class Application {
public static void main(String[] args) {
/*
Application类用于测试,只有一个入口
实例化类 用new关键字
*/
ActionSon a = new ActionSon();
System.out.println(a);
//抽象类存在构造器
}
}
抽象类的意义:提高开发效率
接口
普通类:只有具体实现
抽象类:具体时限和规范都有
接口:只有规范!
接口就是规范,定义的是一组规则,“如果你是……就必须……”。
接口的本质是契约。
面向对象的精髓就是对对象的抽象,最能体现的这一点的就是接口,如何合理的去抽象。
声明类的关键字是class,声明接口的关键字是interface
package com.htk.ood;
public interface UserService {
//接口里的常量都是public static final,不常用
String name="emmm";
//接口中的所有定义其实都是抽象的public abstract
//增删改查
void addUser(String name);
void deleteUser(String name);
void updateUser(String name);
void queryUser(String name);
}
package com.htk.ood;
public interface TimeService {
//接口里的常量都是public static final,不常用
String name="OK";
//增删改查
void Timer();
void queryUser(String name);
}
package com.htk.ood;
//使用implements实现接口,也可以实现多个接口用 , 分隔实现多继承
//实现类接口的类就必须重写借口的方法
public class UserServiceImp1 implements UserService,TimeService {
@Override
public void addUser(String name) {
}
@Override
public void deleteUser(String name) {
}
@Override
public void updateUser(String name) {
}
@Override
public void Timer() {
}
@Override
public void queryUser(String name) {
}
}
总结:
1.定义的方法让不同子类实现
2.public abstract 方法默认
3.public static final 常量默认
4.接口不能被实例化
5.可以实现多个接口,实现接口必须要实现接口的方法
内部类
抛出异常
捕获异常
异常处理五个关键字:
try
catch
finally
throw
throws
package com.htk.Exception;
import java.sql.SQLOutput;
public class Demo01 {
public static void main(String[] args) {
int a=1;
int b=0;
//ctrl+alt+t 快速生成try-catch-finally
//---try--catch---finally演示
try{ //监控区域
System.out.println(a/b);
}catch (ArithmeticException e){ //捕获异常 catch(Throwable)捕获全部异常
System.out.println("出现ArithmeticException异常");
}finally { //善后,不管有无出现异常都会执行,可以不要finally
System.out.println("建议被除数改为非零数");
}
//--- catch(Throwable)捕获全部异常 演示,要遵循下上小的层层递进关系
//第一层就是Throwable的话下面的Error的子类都会被覆盖
try{
new Demo01().a();
}catch(Error er){
System.out.println("捕获Error");
}catch(Exception ex){
System.out.println("捕获Exception");
}catch (Throwable t){
System.out.println("捕获Throwable");
}finally {
System.out.println("finally");
}
//主动抛出异常 throw 常用在方法中抛出异常
new Demo01().div(1,0);
//在方法上主动抛出异常 throws
try {
new Demo01().divi(1,0);
} catch (ArithmeticException e) {
e.printStackTrace();
}
}
public void a(){
b();
}
public void b(){
a();
}
//在方法内抛出异常
public void div(int a,int b){
if(b==0){
throw new ArithmeticException();
}
System.out.println(a/b);
}
//在方法上抛出异常
public void divi(int a,int b)throws ArithmeticException{
if(b==0){
throw new ArithmeticException();
}
System.out.println(a/b);
}
}
自定义类只需要继承Exception类(extends)
在程序中自定义异常类步骤:
package com.htk.Exception;
public class DiyException extends Exception {
//自定义一个数字大于10就会出现异常
private int digit;
//构造方法
public DiyException(int d){
this.digit = d;
}
//toString:异常的打印信息
@Override
public String toString() {
return "DiyException{" + "digit=" + digit + '}';
}
}
package com.htk.Exception;
import java.sql.SQLOutput;
public class Demo01 {
public static void main(String[] args) {
new Demo01().test(18); //测试
}
public void test(int a){
System.out.println("传递的参数为"+a);
if(a>10){
try {
throw new DiyException(a); //抛出异常
} catch (DiyException e) { //捕获异常
e.printStackTrace();
}
}
System.out.println(a);
}
}